掲題のフローについての解説編です。
このフローをGitHubで公開しました。下記リンク先からダウンロードしてください。
github.com
解説の経緯
今回の投稿は概要編の続きです。
フロー図
「解説編その1」で解説する範囲
「解説編その1」解説する範囲は黄色マーカーをひいている3つです。
「解説編その1」の入力と出力
入力
入力となる情報は下記の2つの情報です
- このフローがどのチームの会話チャネルで実行されたか
- 情報取得の目的:フローがどのチームに紐づいたタグとメンバーを取得するのかを判断するため
- このフローがどのメッセージを起点として実行されたか
- 情報取得の目的:フローがどのスレッドに対してメンションを含む返信を行うのかを判断するため
これらの情報は「選択したメッセージの場合」トリガーの出力から取得します。
取得された情報は下図の通りです。
▼このフローがどのチームの会話チャネルで実行されたか
"Team": { "Id": "19:pobOcB9xV9_xmaE5JcbjneWs9B6ZP6xJon_tgObcdA81@thread.tacv2", "AadGroupId": "fbdcbc96-1d44-4fae-82ad-84066922bdfc", "Name": null },
▼このフローがどのメッセージを起点として実行されたか
"MessagePayload": { "Id": "1682421051935", "From": { "Application": null, "Conversation": null, "Device": null, "User": { "DisplayName": "Adele Vance", "Id": "90cd96da-5b1d-4702-bf3f-ef104131a658" } }, "Body": { "ContentType": "html", "Content": "<div>\n<div itemprop=\"copy-paste-block\">\n\n<div style=\"font-size:14px\">\n<div>昨日の会議に出席したかたは各自宿題になっている回答をこのスレッドで共有してください。</div>\n</div>\n</div>\n</div>", "PlainText": "\n\n\n\n昨日の会議に出席したかたは各自宿題になっている回答をこのスレッドで共有してください。" }, "Subject": "情報共有の依頼", "LinkToMessage": "https://teams.microsoft.com/l/message/19:78f71110654440c197054000e8c7d35b@thread.tacv2/1682421051935", "ReplyToId": null },
出力
「解説編その1」の出力は「メンション先の指定」です。
この出力はフロー実行者がメンション先として選択した、タグおよびメンバーを表しています。
これが「アダプティブ カードを投稿して応答を待機する」アクションです。
フロー実行者はメンション先をチェックボックスで指定します。
指定されたメンション先が「アダプティブ カードを投稿して応答を待機する」アクションの出力となります。
"data": { "MentionDestinationTags": "ODFhZWYzY2ItMmNmYy00NGQzLWFjNTktMWJiNDVkNjZmOTEwIyNmYmRjYmM5Ni0xZDQ0LTRmYWUtODJhZC04NDA2NjkyMmJkZmMjI3RObWN3bEpXVg==,ODFhZWYzY2ItMmNmYy00NGQzLWFjNTktMWJiNDVkNjZmOTEwIyNmYmRjYmM5Ni0xZDQ0LTRmYWUtODJhZC04NDA2NjkyMmJkZmMjI3Rid3cweUZZZg==", "MentionDestinationMembers": "MeganB@XXXXXX.OnMicrosoft.com,LynneR@XXXXXX.OnMicrosoft.com" }
ステップごとの解説
「選択したメッセージの場合」トリガー
このトリガーは「Microsoft Teams」>「選択したメッセージの場合」です。このトリガーを使って任意の投稿を起点にしてフローを実行できるようにします。
このトリガーではAdaptive Card を使ってフロー実行者に追加の情報入力を求めることができます。
この機能の使用した例となるフローが下記の記事で紹介しているフローです。このフローでは、「処理を行いたい日時の指定」と「Teamsへの投稿の要否」の入力をフロー実行者に求めるようにしています。
wataruf.hatenablog.com
ですが、今回のフローではこのトリガーでフロー実行者に情報入力を求める事項はありません。その理由はこのフローでメンション先の指定を行うのは、「タグの一覧取得」と「メンバーの一覧取得」の実行後である必要があるためです。
「スコープ-チームのタグを取得する」アクション
このアクションは「コントロール」>「スコープ」です。このフローでは意味のある単位で複数のアクションを束ねる目的でスコープを使用しています。つまり、フロー図の可読性を保つためにスコープを使用しています。
このスコープに含まれるアクション(= チームのタグの取得に関わるアクション)は下図のふたつです。
- 「チームのタグをすべて一覧表示する」アクション
- 「選択-タグの名前とIDを取得」アクション
「チームのタグをすべて一覧表示する」アクション
このアクションは「Microsoft Teams」>「チームのタグをすべて一覧表示する」です。指定したチームのタグをすべて取得します。
このアクションの入力情報は、取得対象となるチームのIDです。
プロパティ
"parameters": { "groupId": "@triggerBody()?['teamsFlowRunContext']?['channelData']?['team']?['aadGroupId']" },
チームIDはフローのトリガーの出力で提供されたものを使用します。
▼このフローがどのチームの会話チャネルで実行されたか
"Team": { "Id": "19:pobOcB9xV9_xmaE5JcbjneWs9B6ZP6xJon_tgObcdA81@thread.tacv2", "AadGroupId": "fbdcbc96-1d44-4fae-82ad-84066922bdfc", "Name": null },
「選択-タグの名前とIDを取得」アクション
このアクションは「データ操作」>「選択」です。このアクションでは、後続のAdaptive Cardでタグ一覧を表示するためにデータを整形します。
プロパティ
"inputs": { "from": "@outputs('チームのタグをすべて一覧表示する')?['body/value']", "select": { "Title": "@item()?['displayName']", "Value": "@item()?['id']" } },
配列のKey列の用途は下記の通りです。
- Title ・・・ Adaptive Card でフロー実行者に対して表示される文字列
- Value ・・・ フロー実行者が選択したTitleに基づいてフローが出力する文字列
このアクションの出力例は下図の通りです。
「スコープ-チームのメンバーを取得する」アクション
このアクションは「コントロール」>「スコープ」です。このスコープもフロー図の可読性を保つために使用しています。
このスコープに含まれるアクション(= チームのメンバーの取得に関わるアクション)は下図のふたつです。
- グループ メンバーの一覧表示
- 選択-メンバーの名前とメールアドレスを取得
「グループ メンバーの一覧表示」アクション
このアクションは「Office 365 Groups」>「グループ メンバーの一覧表示」です。指定したグループのメンバーをすべて取得します。
Microsoft Teams は Microsoft 365グループ(旧称 Office 365グループ)に1対1で紐づきます。チームのメンバーはそのチームに紐づくMicrosoft 365グループのメンバーと同じことを表します。
ここでは、Microsoft 365グループのアクションを用いることで、指定したチームのすべてのメンバーを取得します。
オプション
"parameters": { "groupId": "@triggerBody()?['teamsFlowRunContext']?['channelData']?['team']?['aadGroupId']" },
チームの指定方法は、タグを取得した時と同じくフローのトリガーの出力で提供されたチームIDを使用します。
▼このフローがどのチームの会話チャネルで実行されたか
"Team": { "Id": "19:pobOcB9xV9_xmaE5JcbjneWs9B6ZP6xJon_tgObcdA81@thread.tacv2", "AadGroupId": "fbdcbc96-1d44-4fae-82ad-84066922bdfc", "Name": null },
「選択-メンバーの名前とメールアドレスを取得」アクション
このアクションは「データ操作」>「選択」です。このアクションでは、後続のAdaptive Cardでメンバー一覧を表示するためにデータを整形します。
プロパティ
"inputs": { "from": "@outputs('グループ_メンバーの一覧表示')?['body/value']", "select": { "Title": "@item()?['displayName']", "Value": "@item()?['mail']" } },
配列のKey列の用途は以下の通りです。(再掲)
- Title ・・・ Adaptive Card でフロー実行者に対して表示される文字列
- Value ・・・ フロー実行者が選択したTitleに基づいてフローが出力する文字列
このアクションの出力例は下図の通りです。
「アダプティブ カードを投稿して応答を待機する」アクション
このアクションは「Microsoft Teams」>「アダプティブ カードを投稿して応答を待機する」です。このアクションを使って、フロー実行者にメンション先の指定を求めます。
プロパティ
"parameters": { "poster": "Flow bot", "location": "Chat with Flow bot", "body/body/messageBody": ※下記「body/body/messageBody の中身」を参照※ "body/body/updateMessage": "メンションの実行要求を受け付けました。", "body/body/recipient/to": "@triggerBody()?['teamsFlowRunContext']?['from']?['aadObjectId']" },
body/body/messageBody の中身
{ "type": "AdaptiveCard", "body": [ { "type": "TextBlock", "size": "Medium", "weight": "Bolder", "text": "指定した投稿に対してメンションを行います" }, { "type": "TextBlock", "text": "メンション先のタグまたはメンバーを指定して「メンションを実行」をクリックしてください。(複数指定可)", "wrap": true }, { "type": "ActionSet", "actions": [ { "type": "Action.OpenUrl", "title": "該当の投稿を開く", "url": "@{triggerBody()?['teamsFlowRunContext']?['messagePayload']?['linkToMessage']}" } ] }, { "type": "TextBlock", "text": "タグ", "wrap": true, "weight": "Bolder" }, { "type": "Input.ChoiceSet", "choices":@{body('選択-タグの名前とIDを取得')} , "placeholder": "Placeholder text", "style": "expanded", "isMultiSelect": true, "id": "MentionDestinationTags" }, { "type": "TextBlock", "text": "チームのメンバー", "wrap": true, "weight": "Bolder", "isSubtle": true }, { "type": "Input.ChoiceSet", "choices":@{body('選択-メンバーの名前とメールアドレスを取得')}, "placeholder": "Placeholder text", "isMultiSelect": true, "style": "expanded", "id": "MentionDestinationMembers", "wrap": true }, { "type": "ActionSet", "actions": [ { "type": "Action.Submit", "title": "メンションを実行" } ] } ], "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "version": "1.4" }
このアクションの出力例は下図の通りです。
"data": { "MentionDestinationTags": "ODFhZWYzY2ItMmNmYy00NGQzLWFjNTktMWJiNDVkNjZmOTEwIyNmYmRjYmM5Ni0xZDQ0LTRmYWUtODJhZC04NDA2NjkyMmJkZmMjI3RObWN3bEpXVg==,ODFhZWYzY2ItMmNmYy00NGQzLWFjNTktMWJiNDVkNjZmOTEwIyNmYmRjYmM5Ni0xZDQ0LTRmYWUtODJhZC04NDA2NjkyMmJkZmMjI3Rid3cweUZZZg==", "MentionDestinationMembers": "MeganB@XXXXXX.OnMicrosoft.com,LynneR@XXXXXX.OnMicrosoft.com" }
Adaptive Card で使用しているJSONのポイント(3つ)
・ポイント1つめ:選択アクションから受け取った配列を選択肢項目として使用している
Adaptive Card で動的な選択項目(choices)を表示するために前述の選択アクションの出力を使用しています。
タグの選択肢
MentionDestinationTags
チームメンバーの選択肢
・ポイント2つめ:Adaptive Cardでチェックボックス形式の選択肢を使用する
選択肢(Input.ChoiceSet)では下記の2つを指定することでチェックボックス形式の選択肢を使用できます。
- "isMultiSelect"が true
- "style"が "expanded"
・ポイント3つめ:指定された選択肢項目を後続のアクションで使用するために意図が通じやすいIDをつける
Adaptive Card でユーザーが入力した値を後続のアクションで使用するには、その選択肢コントロールにつけられたIDを使用します。そのため、このIDはひとめ見て意図が通じる名前をつけることをおすすめします。
このフローでつけたIDは下記の通りです。
「メンション先とするタグ」は MentionDestinationTags というIDをつけました。
「メンション先とするチームメンバー」は MentionDestinationMembers というIDをつけました。
最後に
次回「解説編その2」では、指定されたメンション先にしたがってメンショントークンを作成している範囲について解説します。