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

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

【Power Automate】【解説編その2】チェックボックスを使ってメンション先を指定する

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

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

解説の経緯

今回の投稿は概要編解説編その1の続きです。

フローの使用イメージ

フローの使用イメージについては概要編に記載しています。概要編を未読のかたはそちらを先に参照ください。


 

フロー図

「解説編その2」で解説する範囲

「解説編その2」解説する範囲は黄色マーカーをひいている1つです。

  1. チームのタグを一覧取得
  2. チームのメンバーを一覧取得
  3. フローbotを使ってフロー実行者からメンション先の指定を受け付ける
  4. 指定されたメンション先のメンショントークンを取得して文字列変数に格納
  5. メンションを含む返信を投稿
  6. 実行ユーザーにフローの完了通知を送信


開いた状態のフロー図における今回の解説範囲は下図の赤枠で囲まれた箇所です。

「解説編その2」の入力と出力

入力

今回の範囲における入力情報は「解説編その1」の出力である「メンション先の指定」です。


アダプティブカードから受け取ったデータはコントロールのIDごとに出力されます。また、ひとつのコントロールで複数のデータ(今回の場合は複数のメンション先)をうけとった場合は、カンマ区切りの文字列として出力されます

"data": {
    "MentionDestinationTags": "ODFhZWYzY2ItMmNmYy00NGQzLWFjNTktMWJiNDVkNjZmOTEwIyNmYmRjYmM5Ni0xZDQ0LTRmYWUtODJhZC04NDA2NjkyMmJkZmMjI3RObWN3bEpXVg==,ODFhZWYzY2ItMmNmYy00NGQzLWFjNTktMWJiNDVkNjZmOTEwIyNmYmRjYmM5Ni0xZDQ0LTRmYWUtODJhZC04NDA2NjkyMmJkZmMjI3Rid3cweUZZZg==",
    "MentionDestinationMembers": "MeganB@XXXXXX.OnMicrosoft.com,LynneR@XXXXXX.OnMicrosoft.com"
}

  

出力

「解説編その2」の出力は「メンショントーク」です。

  • タグのメンショントークン (HTMLの AtTag 要素)
  • ユーザーのメンショントークン(HTMLの at 要素 )

メンショントークンの実体はHTMLの要素です。このHTMLをTeamsの会話タブ内の含めて投稿を行うことでメンションが実行されます。

<atTag><tagId>ODFhZWYzY2ItMmNmYy00NGQzLWFjNTktMWJiNDVkNjZmOTEwIyNmYmRjYmM5Ni0xZDQ0LTRmYWUtODJhZC04NDA2NjkyMmJkZmMjI3RObWN3bEpXVg%3D%3D</tagId><groupId>fbdcbc96-1d44-4fae-82ad-84066922bdfc</groupId></atTag> <atTag><tagId>ODFhZWYzY2ItMmNmYy00NGQzLWFjNTktMWJiNDVkNjZmOTEwIyNmYmRjYmM5Ni0xZDQ0LTRmYWUtODJhZC04NDA2NjkyMmJkZmMjI3Rid3cweUZZZg%3D%3D</tagId><groupId>fbdcbc96-1d44-4fae-82ad-84066922bdfc</groupId></atTag> <at>MeganB@XXXXXX.OnMicrosoft.com</at> <at>LynneR@XXXXXX.OnMicrosoft.com</at> 

 

ステップごとの解説

「変数を初期化する-メンショントークン」アクション

このアクションは「変数」>「変数を初期化する」です。このアクションで「解説編その2」の最終的な出力であるメンショントークンの入れ物を用意します。この時点では中身は空の状態です。

プロパティ

"inputs": {
    "variables": [
        {
            "name": "メンショントークン",
            "type": "string"
        }
    ]
},

 

「条件-メンション先として指定されたタグが0個である」アクション

このアクションは「コントロール」>「条件」です。ここの条件アクションではメンション先としてタグが指定されているかどうかで分岐を行っています。

条件文

  • empty(outputs('アダプティブ_カードを投稿して応答を待機する')?['body/data/mentionDestinationTags'])
  • 次の値に等しい
  • true


この条件文は、タグがひとつも指定されていない場合はtrue と判定されます。この場合は「はいの場合」に進みます。
タグがひとつでも指定されている場合は false と判定されます。この場合は「いいえの場合」に進みます。

  

「はいの場合」に実行する処理

この分岐では特に実行するアクションはありません。

 

「いいえの場合」に実行する処理

「Apply to each-タグのメンショントークンを取得」アクション
このアクションは「コントロール」>「それぞれに適用する」です。

インデクサはアダプティブカードでフロー実行者から受けとった「タグ一覧」です。

インデクサとして使用する配列を出力している式:

split(outputs('アダプティブ_カードを投稿して応答を待機する')?['body/data/mentionDestinationTags'],',')

 
その式によって出力される「タグ一覧」の配列の例:

[
   "ODFhZWYzY2ItMmNmYy00NGQzLWFjNTktMWJiNDVkNjZmOTEwIyNmYmRjYmM5Ni0xZDQ0LTRmYWUtODJhZC04NDA2NjkyMmJkZmMjI3RObWN3bEpXVg==",
    "ODFhZWYzY2ItMmNmYy00NGQzLWFjNTktMWJiNDVkNjZmOTEwIyNmYmRjYmM5Ni0xZDQ0LTRmYWUtODJhZC04NDA2NjkyMmJkZmMjI3Rid3cweUZZZg=="
]

 

「タグの @mention トークンを取得する」アクション
このアクションは「Microsoft Teams」>「タグの @mention トークンを取得する」です。
 
プロパティ

"parameters": {
    "groupId": "@triggerBody()?['teamsFlowRunContext']?['channelData']?['team']?['aadGroupId']",
    "tagId": "@item()"
},

「文字列変数に追加」アクション
このアクションは「変数」>「文字列変数に追加」です。

 
プロパティ

"inputs": {
    "name": "メンショントークン",
    "value": "@{outputs('タグの_@mention_トークンを取得する')?['body/atMention']} "
},

 

「条件-メンション先として指定されたユーザーアカウントが0個である」アクション

このアクションは「コントロール」>「条件」です。この条件アクションではメンション先としてチームのメンバーが指定されているかどうかで分岐を行っています。

条件文

  • empty(outputs('アダプティブ_カードを投稿して応答を待機する')?['body/data/mentionDestinationMembers'])
  • 次の値に等しい
  • true


この条件文は、メンバーがひとりも指定されていない場合はtrue と判定されます。この場合は「はいの場合」に進みます。
メンバーがひとりでも指定されている場合は false と判定されます。この場合は「いいえの場合」に進みます。

 

「はいの場合」に実行する処理

この分岐では特に実行するアクションはありません。

 

「いいえの場合」に実行する処理

「Apply to each-メンバーのメンショントークンを取得」アクショ
このアクションは「コントロール」>「それぞれに適用する」です。

インデクサは、アダプティブカードでフロー実行者から受けとった「メンバー一覧」です。

インデクサとして使用する配列を出力している式:

split(outputs('アダプティブ_カードを投稿して応答を待機する')?['body/data/mentionDestinationMembers'],',')

 
その式によって出力される「メンバーー覧」の配列の例:

[
  "MeganB@XXXXXX.OnMicrosoft.com",
  "LynneR@XXXXXX.OnMicrosoft.com"
]


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

プロパティ

"parameters": {
    "userId": "@item()"
},

 

「文字列変数に追加 2」アクション
このアクションは「変数」>「文字列変数に追加」です。

プロパティ

"inputs": {
    "name": "メンショントークン",
    "value": "@{outputs('ユーザーの_@mention_トークンを取得する')?['body/atMention']} "
},

 

「条件-タグもユーザーもメンション先に指定されていない」アクション

このアクションは「コントロール」>「条件」です。この条件アクションではタグまたはメンバーが指定されているかどうかによって分岐を行います。

 
この分岐アクションの目的は、フロー実行者がメンション先を指定せずに「メンションを実行」ボタンをクリックした場合にメンションを行わずにフローを終了したことを通知することです。


 

条件文

  • empty(variables('メンショントークン'))",true]
  • 次の値に等しい
  • true

 
この条件文は、文字列変数「メンショントークン」が空の場合にtrue と判定されます。この場合は「はいの場合」に進みます。
文字列変数「メンショントークン」にメンショントークンがひとつでもある場合はfalse と判定されます。この場合は「いいえの場合」に進みます。

 

「はいの場合」に実行する処理

「作成-チャットの本文-メンション先が未指定」アクション
このアクションは「データ操作」>「作成」です。フロー実行者に送信するチャットの本文を定義します。

プロパティ

"inputs": "メンション先が指定されませんでした。メンションの実行フローを終了しました。",

 

「チャットまたはチャネルでメッセージを投稿する-メンション先が未指定」アクション
このアクションは「Microoft Teams」>「チャットまたはチャネルでメッセージを投稿する」です。フロー実行者にチャットを送信します。

 
ポイントは replace関数を使って改行コードをbrタグに変換していることです。Teamsで改行を認識するためにはHTMLのbr要素を使用します。
 
プロパティ

"parameters": {
    "poster": "Flow bot",
    "location": "Chat with Flow bot",
    "body/recipient": "@triggerBody()?['teamsFlowRunContext']?['from']?['aadObjectId']",
    "body/messageBody": "<p>@{replace(outputs('作成-チャットの本文-メンション先が未指定'), decodeUriComponent('%0A'), '<br/>')}</p>"
},

 

「終了」アクション
このアクションは「コントロール」>「終了」です。この分岐では、後続のメンション実行アクションを実施しないためここでフローを終了させます。

プロパティ

"inputs": {
    "runStatus": "Succeeded"
},

 

「いいえの場合」に実行する処理

この分岐では特に実行するアクションはありません。

 

最後に

次回「解説編その3」ではメンションの実行処理について解説します。

今回は以上です。

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

wataruf.hatenablog.com