はじめに
動作イメージです。
グループチャットのメンバーのうち、選択した投稿に対してリアクションしてくれていない人たちにメンション付きメッセージを投稿します。
同様にチャネルの投稿では、チームのメンバーを対象にフォロー投稿を行います。
フローの解説
大まかな構成としては、
- 選択したメッセージをトリガーに
- リアクションを集計
- グループチャット or チームのメンバーを取得
- リアクションしてくていれない人を抽出
- メンションを取得してメッセージを作成
- メッセージを投稿
といった順にフローが進みます。
選択したメッセージをトリガーに
フローを起動するトリガーです。
メッセージを選択したメニューから起動できるようにします。
選択したメッセージを対象にリアクションを集計することになります。
アダプティブカードを編集して、フローの起動時に入力を追加することもできます。
今回は特に指定していませんが、メンション付きで投稿するかどうかのチェックボックスや、フォローメッセージの文言を指定するテキスト入力欄を作ると面白いかもしれません。
リアクションを集計
[メッセージ詳細を取得する]
で、メッセージにつけられたリアクションを取得します。
取得したリアクションから、リアクションしたユーザーのIDだけを取り出して、配列変数に格納します。(単純のため)
メッセージの種類は、グループチャットでもチャネルの投稿でもどちらの場合もグループチャット
でOKです。
会話ID
を指定すれば、チャネルの投稿でもちゃんと動きます。
取得したメッセージの詳細、リアクションからユーザーのIDのみを抽出します。
配列の加工には選択
アクションをよく使います。
開始にはリアクションを指定したいのですが、動的なコンテンツから選択すると、何故か違ったプロパティが指定されてしまいます。
仕方がないので、関数の入力から以下の通り、直接指定してあげます。
@{outputs('メッセージ詳細を取得する')?['body/reactions']}
マップにはユーザーのIDを指定します。
キー値モードに切り替え
て、キーを持たない値のみの配列を作成します。
@{item()?['user/user/id']}
グループチャット or チームのメンバーを取得
グループチャットかチャネルのメッセージかで分岐を行います。
これはメンバー一覧を取得する方法がそれぞれ異なるためです。
条件分岐では、選択したメッセージから取得した情報に、チャネルのIDが含まれるかどうかで判断します。
empty(triggerBody()?['teamsFlowRunContext']?['channelData']?['channel'])
はい(グループチャット)の場合
チャネルIDの情報が空の場合はグループチャットと判断できます。
グループチャットの参加メンバーを取得するには[List members]
を使用します。
取得したメンバー一覧から、また簡単のためにユーザーIDだけの配列を作成します。
いいえ(チャネルの投稿)の場合
チャネル投稿の場合はチームのメンバーを取得する必要がありますが、Teamsコネクタのアクションには該当するアクションが見つからないので、チームの裏にあるグループから取得します。
@{triggerBody()?['teamsFlowRunContext/ChannelData/Team/AadGroupId']}
厳密には、プライベートチャネルの場合、チャネルのメンバーとチームのメンバーが一致しませんが、プライベートチャネルの投稿からはPower Automate のフローを起動できないので、今回は考慮していません。
リアクションしてくていれない人を抽出
ここまでで取得したメンバー全員と、リアクションをした人の差分を取れば、リアクションしていない人が抽出できます。
また、自分にフォローしても仕方がないので、しれっとリアクションした人の中に自分も追加しておきます。(自分の投稿には自分でリアクションしていないことが多いと思うので…)
[マイプロフィールの取得]
から自分のIDを取得して、配列変数に追加しておきます。
差分を取得するために[アレイのフィルター処理]
を行います。
メンバー全員を対象に、条件はそれぞれの項目がリアクションした人の中に含まれるかどうかで判定します。
@not(contains(variables('reactionUsersID'), item()))
フィルタ結果の確認として、空に向かってメンションしてしまわないように、「全員がリアクションしていた場合=リアクションしていない人がいなかった場合」に、フローを終了させます。
自分にだけ通知を送るようにしてもいいと思います。
メンションを取得してメッセージを作成
抽出したリアクションしていないメンバーに対して、[ユーザーの @mention トークンを取得する]
でメンションを付けます。
取得したメンションは文字列変数に順次追加し、ついでにメッセージも追加しておきます。(<br>
は改行タグです)
メッセージを投稿
最後に、作成したメッセージを投稿します。
ここもまた、グループチャットかチャネルのメッセージかで返信の投稿方法が異なるため、条件分岐を行います。(分岐条件は前と同じ)
チャネル投稿の場合は、指定項目が多いですが、以下のように入力すればOKです。
特にMessage ID
に返信先のIDを指定しないといけないところが間違えやすいので注意してください。
おわりに
最近追加されたアクション、[List members]
でグループチャットのメンバーが取れるようになったのが大きなポイントでした。
今回はメンションを付けてフォローをしましたが、CSVなどに吐き出して集計するようなフローも需要がありそうですね。
今回の解説は以上です。