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

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

【解説編その1】[強化版]Microsoft Teams で特定のタグがつかわれたらアクションを実行する

掲題のフローの解説編その1です。

フローをGitHubで公開しました。
github.com

概要編

今回の投稿は概要編 の続きです。

この回で解説する範囲

解説する範囲のフロー図

この回で解説する範囲は、フロー全体のうち下図の赤枠の部分です。

赤枠で囲んだ部分だけ取り出した図は以下の通りです。

今回の範囲の目的は「投稿に含まれるタグを取得すること」

今回の範囲にあるアクションを実行することで、下記のようなタグの配列を取得できます。

[
{
"displayName": "TagTrigger:ステータスを「受理済み」に更新"
}
]

ステップごとに解説します。

ステップごとの解説

1.「キーワードが言及された場合」トリガー

このトリガーは「Microsoft Teams」>「キーワードが言及された場合」というトリガーです。この"言及"はTeamsのメンション機能を指したものではないです。「Teamsの投稿内に特定のキーワードが含まれていた場合にフローを起動するトリガー」を表します。

コード:

"parameters": {
"threadType": "channel",
"$search": "TagTrigger",
"requestBody/groupId": "8515b3b8-9634-4dd5-992d-af2f0c702e88",
"requestBody/channels": [
"19:_MzwNRojmkbHnpbAcfjL72m34YCs01n3Jm70G_JFym01@thread.tacv2"
]
},

「キーワードが言及された場合」トリガーを使用する利点

「キーワードが言及された場合」トリガーを使用する利点は、キーワードが使われた投稿が「親の投稿」であっても「返信」であってもフローを実行できることです。この点が、 以前のフローで使用している「チャネルに新しいメッセージが追加されたとき」トリガーとの違いです。
 ※ 「チャネルに新しいメッセージが追加されたとき」トリガーは「親の投稿」のみを対象にします。

このフローでトリガーにしているキーワードは「TagTrigger」。

このフローでは、指定したチャネルで「TagTrigger」というキーワードが使われた場合にフローを実行します。


このキーワードを使用している理由は以下の2つです。

  • 「キーワードが言及された場合」トリガーは日本語がうまく認識できない場合があるため、確実に認識させるために英字を使用
  • タグの名称を「<フローを起動するためのキーワード>:<実行したいアクションに紐づくキーワード>」という構造にすることで、1つのフロー内で複数の「タグとアクションのペア」を扱えるようにしている

2.「変数を初期化する-トリガーの投稿ID」アクション

このアクションは「変数」>「変数を初期化する」アクションです。トリガーを実行した投稿のタグを後続のアクションで取得するために、このアクションで投稿IDを取得しておきます。

ポイントは「キーワードが言及された場合」トリガーの出力が配列であるため、first関数を使用して値を取り出しているところです。

コード:

"inputs": {
"variables": [
{
"name": "トリガーの投稿ID",
"type": "string",
"value": "@{first(triggerOutputs()?['body/value'])?['messageId']}"
}
]
},

3.「変数を初期化するー親の投稿ID」アクション

このアクションは「変数」>「変数を初期化する」アクションです。


このフローでは、フローが実行されたことをスレッドの返信で表します。そのため、返信先である「親の投稿ID」を後続のアクションで取得します。「変数を初期化するー親の投稿ID」アクションでは変数を空文字で宣言します。

コード:

"inputs": {
"variables": [
{
"name": "親の投稿ID",
"type": "string"
}
]
},

4.「条件」アクションと条件分岐後のアクション

この条件分岐と分岐後のアクションでは、トリガーの投稿が「親の投稿」であるか、それとも「返信」であるかによって変数「親の投稿ID」に格納するIDを判断しています。


アクションごとに分解して解説します。

4-1.「条件」アクション

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

条件分岐の式は下記のコードの通りです。これは以下のことを表しています。

  • 「トリガーの投稿ID」と「トリガーの返信先ID」を比較して、同じIDであれば「トリガーは親の投稿である」と判断する
  • 「トリガーの投稿ID」と「トリガーの返信先ID」を比較して、異なるIDであれば「トリガーは返信である」と判断する


コード:

  • equals(first(triggerOutputs()?['body/value'])?['messageId'],first(triggerOutputs()?['body/value'])?['replyToMessageId'])
  • 次の値に等しい
  • true
4-2.「はいの場合」分岐 >「変数の設定-親の投稿ID」アクション

「トリガーは親の投稿である」と判断された場合に実行されるアクションです。これは「変数」>「変数の設定」アクションです。

トリガーが親なので、変数「親の投稿ID」にトリガーの投稿IDを格納しています。

コード:

"inputs": {
"name": "親の投稿ID",
"value": "@first(triggerOutputs()?['body/value'])?['messageId']"
},

4-3.「いいえの場合」分岐 >「変数の設定2-親の投稿ID」アクション

「トリガーは返信である」と判断された場合に実行されるアクションです。これは「変数」>「変数の設定」アクションです。

トリガーが返信なので、変数「親の投稿ID」にトリガーの返信先IDを格納しています。

コード:

"inputs": {
"name": "親の投稿ID",
"value": "@first(triggerOutputs()?['body/value'])?['replyToMessageId']"
},

5.「メッセージ詳細を取得する-トリガーの投稿」アクション

このアクションは「Microsoft Teams」>「メッセージ詳細を取得する」アクションです。投稿からタグを取得するために、タグを含む投稿の詳細情報をここで取得しています。


前工程で実行した分岐処理と分岐後のアクションがあったことで、トリガーの投稿が「親の投稿」であっても「返信」であってもこの情報取得アクションは正しく動作します。

コード:

"parameters": {
"messageId": "@variables('トリガーの投稿ID')",
"threadType": "channel",
"body/recipient/groupId": "8515b3b8-9634-4dd5-992d-af2f0c702e88",
"body/recipient/channelId": "19:_MzwNRojmkbHnpbAcfjL72m34YCs01n3Jm70G_JFym01@thread.tacv2",
"body/recipient/parentMessageId": "@variables('親の投稿ID')"
},

6.「メッセージ詳細を取得する-親の投稿」アクション

このアクションは「Microsoft Teams」>「メッセージ詳細を取得する」アクションです。トリガーが返信である場合に最終的にフローが実行するアクション(= タグに紐づくアクション)で親の投稿が持つ情報を使用するためにここで情報を取得します。

コード:

"parameters": {
"messageId": "@variables('親の投稿ID')",
"threadType": "channel",
"body/recipient/groupId": "8515b3b8-9634-4dd5-992d-af2f0c702e88",
"body/recipient/channelId": "19:_MzwNRojmkbHnpbAcfjL72m34YCs01n3Jm70G_JFym01@thread.tacv2"
},

7.「選択-メッセージからすべてのタグを抽出する」アクション

このアクションは「Microsoft Teams」>「メッセージ詳細を取得する」アクションです。トリガーの投稿からタグを取得します。

取得しているのは、トリガーの投稿の詳細情報に含まれるtagの部分です。

コード:

"inputs": {
"from": "@body('メッセージ詳細を取得する-トリガーの投稿')?['mentions']",
"select": {
"displayName": "@item()?['mentioned']?['tag']?['displayName']"
}
},

今回の範囲の結果として得られるもの(再掲)

今回の範囲で得られるものは、トリガーの投稿に含まれるタグの配列です。

[
{
"displayName": "TagTrigger:ステータスを「受理済み」に更新"
}
]

次の回の範囲は「タグでは無い箇所で"TagTrigger"というキーワードが使われたケースの対処方法」です。

今回は以上です。

追記:「解説編その2」を投稿しました。

wataruf.hatenablog.com