LoginSignup
4
3

「全員ぼくにいいねしてよ!!!」を熱烈フォローするPower Automate フロー

Last updated at Posted at 2023-07-23

はじめに

動作イメージです。

グループチャットのメンバーのうち、選択した投稿に対してリアクションしてくれていない人たちにメンション付きメッセージを投稿します。

image.png

同様にチャネルの投稿では、チームのメンバーを対象にフォロー投稿を行います。

フローの解説

まずフローの全体像です。
image.png

大まかな構成としては、

  • 選択したメッセージをトリガーに
  • リアクションを集計
  • グループチャット or チームのメンバーを取得
  • リアクションしてくていれない人を抽出
  • メンションを取得してメッセージを作成
  • メッセージを投稿

といった順にフローが進みます。

選択したメッセージをトリガーに

フローを起動するトリガーです。
メッセージを選択したメニューから起動できるようにします。
選択したメッセージを対象にリアクションを集計することになります。
image.png

トリガーは[選択したメッセージの場合]です。
image.png

アダプティブカードを編集して、フローの起動時に入力を追加することもできます。
今回は特に指定していませんが、メンション付きで投稿するかどうかのチェックボックスや、フォローメッセージの文言を指定するテキスト入力欄を作ると面白いかもしれません。

リアクションを集計

[メッセージ詳細を取得する]で、メッセージにつけられたリアクションを取得します。
取得したリアクションから、リアクションしたユーザーのIDだけを取り出して、配列変数に格納します。(単純のため)
image.png

メッセージの種類は、グループチャットでもチャネルの投稿でもどちらの場合もグループチャットでOKです。
会話IDを指定すれば、チャネルの投稿でもちゃんと動きます。
image.png

取得したメッセージの詳細、リアクションからユーザーのIDのみを抽出します。
配列の加工には選択アクションをよく使います。

開始にはリアクションを指定したいのですが、動的なコンテンツから選択すると、何故か違ったプロパティが指定されてしまいます。
image.png

仕方がないので、関数の入力から以下の通り、直接指定してあげます。

選択:開始
@{outputs('メッセージ詳細を取得する')?['body/reactions']}

マップにはユーザーのIDを指定します。
キー値モードに切り替えて、キーを持たない値のみの配列を作成します。
image.png
image.png

選択:マップ
@{item()?['user/user/id']}

グループチャット or チームのメンバーを取得

グループチャットチャネルのメッセージかで分岐を行います。
これはメンバー一覧を取得する方法がそれぞれ異なるためです。
image.png

条件分岐では、選択したメッセージから取得した情報に、チャネルのIDが含まれるかどうかで判断します。
image.png

条件式の左辺
empty(triggerBody()?['teamsFlowRunContext']?['channelData']?['channel'])

はい(グループチャット)の場合

チャネルIDの情報が空の場合はグループチャットと判断できます。
image.png

グループチャットの参加メンバーを取得するには[List members]を使用します。
image.png

取得したメンバー一覧から、また簡単のためにユーザーIDだけの配列を作成します。
image.png

いいえ(チャネルの投稿)の場合

チャネルIDの情報がある場合はチャネルの投稿です。
image.png

チャネル投稿の場合はチームのメンバーを取得する必要がありますが、Teamsコネクタのアクションには該当するアクションが見つからないので、チームの裏にあるグループから取得します。
image.png

グループID
@{triggerBody()?['teamsFlowRunContext/ChannelData/Team/AadGroupId']}

厳密には、プライベートチャネルの場合、チャネルのメンバーとチームのメンバーが一致しませんが、プライベートチャネルの投稿からはPower Automate のフローを起動できないので、今回は考慮していません。

こちらの場合もユーザーIDだけの配列を作成します。
image.png

リアクションしてくていれない人を抽出

ここまでで取得したメンバー全員と、リアクションをした人の差分を取れば、リアクションしていない人が抽出できます。
また、自分にフォローしても仕方がないので、しれっとリアクションした人の中に自分も追加しておきます。(自分の投稿には自分でリアクションしていないことが多いと思うので…)
image.png

[マイプロフィールの取得]から自分のIDを取得して、配列変数に追加しておきます。
image.png

差分を取得するために[アレイのフィルター処理]を行います。
メンバー全員を対象に、条件はそれぞれの項目がリアクションした人の中に含まれるかどうかで判定します。
image.png

条件
@not(contains(variables('reactionUsersID'), item()))

フィルタ結果の確認として、空に向かってメンションしてしまわないように、「全員がリアクションしていた場合=リアクションしていない人がいなかった場合」に、フローを終了させます。
自分にだけ通知を送るようにしてもいいと思います。
image.png

メンションを取得してメッセージを作成

抽出したリアクションしていないメンバーに対して、[ユーザーの @mention トークンを取得する]でメンションを付けます。
取得したメンションは文字列変数に順次追加し、ついでにメッセージも追加しておきます。(<br>は改行タグです)
image.png

メッセージを投稿

最後に、作成したメッセージを投稿します。
ここもまた、グループチャットチャネルのメッセージかで返信の投稿方法が異なるため、条件分岐を行います。(分岐条件は前と同じ)
image.png

グループチャットの場合は会話IDを指定します。
image.png

チャネル投稿の場合は、指定項目が多いですが、以下のように入力すればOKです。
特にMessage IDに返信先のIDを指定しないといけないところが間違えやすいので注意してください。
image.png

おわりに

最近追加されたアクション、[List members]でグループチャットのメンバーが取れるようになったのが大きなポイントでした。
今回はメンションを付けてフォローをしましたが、CSVなどに吐き出して集計するようなフローも需要がありそうですね。

今回の解説は以上です。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3