ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

【Power Automate】会議チャットの内容に応じて自動で返答する

この記事はMicrosoft Power Automate Advent Calendar 2022に参加しています。
カレンダー1 の4日目 です。
qiita.com

Microsoft Teams の会議中に送られたチャットの内容に応じて任意の処理を実行する方法ついて解説します。

今回作成したフローをGitHubで公開しました。下記リンク先からダウンロードしてください。
github.com

背景

技術的な指摘をすることを「マサカリを投げる」と呼ぶそうです。

エンジニアが集う会議ではたびたびこのマサカリが飛び交います。
 ※下図はイメージです

Googleで「マサカリを投げる」を検索すると「エンジニアから飛んでくるマサカリを受け止める心得」等の対策が紹介されています。

今回解説するフローはそういった対策の類のひとつです。(?)

会議中に投げつけられたマサカリを自動で投げ返します。


マサカリを落としましたよ!
╰( `•ω•)╮—===≡≡≡ 🪓


解説するフロー図

アクションの設定を閉じた状態のフロー図


開いた状態のフロー図


フローの使用イメージ

前準備

ブラウザでTeamsの予定表を開きます。フローを使いたい会議を右クリックして「参加者とチャットする」をクリックします。

会議の詳細画面を開いたときのURLを取得します。このURLの「/conversations/」と「?ctx=chat」の間にある文字列をメモに控えます。この文字列がこの会議に紐づくグループチャットの会話ID(conversationId)です。

https://teams.microsoft.com/_#/conversations/19:meeting_MDhlZTMzMDgtNTNkZS00MjZhLTlmNTctODQ0ZDA0ZjNmYWY0@thread.v2?ctx=chat

フローを開いて「作成-定数-処理対象の会話ID」アクションに入力します。入力が済んだらフローを保存します。

フローを実行するユーザーを会議の参加者(開催者でも可)に含めておきます。

フローの実行

会議が始まりました。

会議チャット欄で「絵文字」のアイコンをクリックします。

検索欄でaxe(斧)を入力します。表示された斧のアイコンを選択します。

投稿します。

フローbotが斧を投げ返してくれます。

次は、文章の間に斧をいれて投稿します。

そのパターンでもちゃんと投げ返してくれます。

チャット本文に斧が無い場合は投げ返しません。

会議中のすべての発言をトリガーとしてフローbotが反応します。

ステップごとの解説

「チャットに新しいメッセージが追加されたとき」トリガー

このトリガーは「Microsoft Teams」>「チャットに新しいメッセージが追加されたとき」です。

今回の解説でメインになるのはこのトリガーです。

「チャットに新しいメッセージが追加されたとき」は名前の通り、チャットを受け取ったことをトリガーとしてフローを実行します。

このトリガーは下記のすべてのチャットで使用できます。
・個人チャット(= 1対1のチャット)
・グループチャット
会議チャット

注意点:
このトリガーではどのチャットを対象にするかが指定できません。つまり、フローの実行ユーザーが受信したすべてのチャットがトリガーの対象になります。

参考:
mizusibuki.com

「作成-定数-処理対象の会話ID」アクション

このアクションは「データ操作」>「作成」です。

このアクションは定数の定義のために使用しています。ここで定義しているのは「処理対象の会話ID」です。今回のフローを使いたい会議チャットを指定します。

「作成-トリガーとなったチャットの要素(first関数で取得)」アクション

このアクションは「データ操作」>「作成」です。

このアクションに記載している式

first(triggerOutputs()?['body/value'])

トリガーの出力が「1件の要素を含む配列」であるため、該当の要素をFirst関数で取得します。

Valueで返される値に括弧がついている。(= 配列である)

「条件-処理対象の会話IDである」アクション

このアクションは「コントロール」>「条件」アクションです。

フローを実行したチャットが、今回フローを使いたい会議チャットであるかどうかを判定します。

分岐条件は以下の通りです

  • 「outputs('作成-トリガーとなったチャットの要素(first関数で取得)」が
  • 次の値に等しい
  • 「outputs('作成-定数-処理対象の会話ID')」
「条件-処理対象の会話IDである)」が「はい」の場合

この分岐では何もアクションを使用しません。

フローを実行したチャットが今回フローを使いたい会議チャットであるため、終了処理を行わずに後続のアクションに進ませます。

「条件-処理対象の会話IDである」が「いいえ」の場合

この分岐では「コントロール」>「終了」アクションを使用します。

フローを実行したチャットが今回フローを使いたい会議チャットでないため、ここでフローを終了します。

「メッセージ詳細を取得する」アクション

このアクションは「Microsoft Teams」>「メッセージ詳細を取得する」です。

入力情報

"messageId": "@outputs('作成-トリガーとなったチャットの要素(first関数で取得)')?['messageId']",
"threadType": "groupchat",
"body/recipient": "@outputs('作成-トリガーとなったチャットの要素(first関数で取得)')?['conversationId']"

このアクションを使って、対象のチャットから下記情報を取得します。(トリガーの出力には含まれない情報です)

  • 発言者
  • 発言日時
  • 発言内容

「条件-ユーザーIDがnullである(= botである)」アクション

このアクションは「コントロール」>「条件」アクションです。

今回使用しているトリガーはあらゆるチャットの発言をトリガーの対象にします。それはフローbotのチャットも対象になります。

フローbotのチャットは対象から外すためにこの分岐を使います。

下図の通り、フローbotのチャットはユーザーIDがnullです。そのため、ユーザーIDがnullであればフローが終了するようにします。

分岐条件は以下の通りです

  • 「outputs('メッセージ詳細を取得する')?['body/from/user/id']」が
  • 次の値に等しい
  • 「null」
「条件-ユーザーIDがnullである(= botである)」が「はい」の場合

この分岐では「コントロール」>「終了」アクションを使用します。

ユーザーIDがnullであるため発言者はフローbotです。そのため、フローをここで終了させます。

「条件-ユーザーIDがnullである(= botである)」が「いいえ」の場合

この分岐では何もアクションを使用しません。

ユーザーIDがnullでないのでこのチャットの発言者はフローbotではありません。そのため、後続のアクションに進ませます。

「条件-チャット本文に斧が含まれている」アクション

このアクションは「コントロール」>「条件」アクションです。

チャット本文に斧(axe)の絵文字が含まれているかどうかを判定して、処理を分岐します。

条件は以下の通りです

  • 「outputs('メッセージ詳細を取得する')?['body/body/content']」が
  • 次の値に等しい
  • 「🪓」
「条件-チャット本文に斧が含まれている」が「はい」の場合

この分岐では何もアクションを使用しません。

本文に斧が含まれていることが判明しましたので、斧の投げ返しアクションに進ませます。

「条件-チャット本文に斧が含まれている」が「いいえ」の場合

この分岐では「コントロール」>「終了」アクションを使用します。

本文に斧が含まれていない場合は後続のアクションによる斧の投げ返しは行いません。そのため、ここでフローを終了します。

「作成-誰がいつ斧を投げたか」アクション

このアクションは「データ操作」>「作成」です。

このアクションは処理対象であるチャットの情報を列挙するために使用しています。このアクションは今後のフローのメンテナンスを行いやすくするために配置したアクションです。このアクションを削除してもフローには影響ありません。

このアクションに記載している式

'ユーザー名:'
@{outputs('メッセージ詳細を取得する')?['body/from/user/displayName']}

'ユーザーID:'
@{outputs('メッセージ詳細を取得する')?['body/from/user/id']}

'本文コンテンツ:'
@{outputs('メッセージ詳細を取得する')?['body/body/content']}

'発言日時:'
@{outputs('メッセージ詳細を取得する')?['body/createdDateTime']}

'メッセージリンク:'
@{outputs('メッセージ詳細を取得する')?['body/messageLink']}

「ユーザーの @mention トークンを取得する」アクション

このアクションは「Microsoft Teams」>「ユーザーの @mention トークンを取得する」です。

このアクションはチャットの発言者に対してメンションを行うための前準備です。メンションで使用するトークンんを取得します。

このアクションに記載している式

outputs('メッセージ詳細を取得する')?['body/from/user/id']

「チャットまたはチャネルでメッセージを投稿する」アクション

このアクションは「Microsoft Teams」>「チャットまたはチャネルでメッセージを投稿する」です。

入力情報

"poster": "Flow bot",
"location": "Group chat",
"body/recipient": "@outputs('作成-トリガーとなったチャットの要素(first関数で取得)')?['conversationId']",
"body/messageBody": "

@{outputs('ユーザーの_@mention_トークンを取得する')?['body/atMention']} さん
\nマサカリを落としましたよ!
\n╰( `•ω•)╮—===≡≡≡≡≡ 🪓

"


このアクションを使ってフローbotに会議チャットで発言させます。

マサカリを落としましたよ!
╰( `•ω•)╮—===≡≡≡ 🪓


フローをGitHubで公開しています(再掲)

今回作成したフローをGitHubで公開しました。下記リンク先からダウンロードしてください。
github.com

最後に

このフローの応用としてグループチャットの発言から情報を収集するフローを作成しました。こちらについてはまた後日ブログで公開します。


今回は以上です。

追記:グループチャットの発言から情報を収集するフローを作成しました

wataruf.hatenablog.com