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

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

【Power Automate】【解説編】指定した投稿と同じメンションをする

掲題のフローについての解説編です。

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

解説の経緯

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

フローの使用イメージ

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



 

フロー図(※概要編に載せた図の再掲)

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

開いた状態のフロー図

  

ステップごとの解説

「選択したメッセージの場合」トリガー

このアクションは「Microsoft Teams」>「選択したメッセージの場合」です。このトリガーを使って任意の投稿を起点にしてフローを実行できるようにします。

 
今回のフローでは実行時にAdaptive Cardで入力を求めるようにしています。

{
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "type": "AdaptiveCard",
    "version": "1.3",
    "body": [
        {
            "type": "TextBlock",
            "weight": "Bolder",
            "size": "Medium",
            "text": "この投稿と同じメンションをする"
        },
        {
            "type": "TextBlock",
            "isSubtle": true,
            "wrap": true,
            "text": "指定した投稿と同じ宛先へのメンションを含む返信を行います。"
        },
        {
            "type": "TextBlock",
            "wrap": true,
            "text": "\n"
        },
        {
            "type": "TextBlock",
            "text": "投稿者をメンション先に追加しますか?"
        },
        {
            "type": "Input.Toggle",
            "id": "IncludeTheContributor",
            "value": "false",
            "title": "追加する"
        }
    ],
    "actions": [
        {
            "type": "Action.Submit",
            "title": "送信"
        }
    ]
}

 

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

このアクションは「Microsoft Teams」>「メッセージ詳細を取得する」です。起点となる投稿のメンション先を取得するためにこのアクションを使います。

「メッセージの種類」で"グループチャット"を指定しているところがポイントです。


入力

"messageId": "@triggerBody()?['teamsFlowRunContext']?['messagePayload']?['id']",
"threadType": "groupchat",
"body/recipient": "@triggerBody()?['teamsFlowRunContext']?['conversation']?['id']"

 
出力(例)

  

「選択-メンション先のID一覧を取得」アクション

このアクションは「データ操作」>「選択」です。メッセージ詳細を取得する」アクションの出力からメンション先のIDを取り出します。


入力

"from": "@outputs('メッセージ詳細を取得する')?['body']?['mentions']",
"select": "@item()?['mentioned']?['user']?['id']"

出力(例)

 

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

このアクションは「変数」>「変数を初期化する」です。メンショントークンを格納するための変数を宣言します。

入力

"name": "メンショントークン",
"type": "string"

 

「Apply to each」アクション

このアクションは「コントロール」>「それぞれに適用する」です。この繰り返し処理でメンション先のIDをメンショントークンに置き換えます。

 
インデクサは「body('選択-メンション先のID一覧を取得')」です。

 
このインデクサの中身は起点となる投稿でメンション先となっているユーザーのID一覧です。

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

このアクションは「Microsoft Teams」>「ユーザーの @mention トークンを取得する」です。ユーザーIDを入力情報にしてそのユーザーのメンショントークンを取得します。

入力

"userId": "@item()"

メンショントークンはATというHTMLのタグです。

  

「文字列変数に追加」アクション

このアクションは「変数」>「文字列変数に追加」です。メンショントークンをひとつの文字列変数にまとめます。

入力

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

「条件-投稿者をメンション先に追加する」アクション

このアクションは「コントロール」>「条件」です。フローを実行する際のフォームで「投稿者をメンション先に追加しますか?」欄の「追加する」をオンにした場合に起点となる投稿の投稿者をメンション先に追加します。

条件

"expression":{"equals":["@triggerBody()?['cardOutputs']?['includeTheContributor']","True"]}

 
「投稿者をメンション先に追加しますか?」欄の「追加する」をオンにした場合に、、、

 
起点となる投稿の投稿者をメンション先に追加します。

 
「"はい"の場合」分岐:

この分岐は「投稿者をメンション先に追加しますか?」欄の「追加する」をオンにしたときの分岐です。
 
最初のアクションは「Microsoft Teams」>「ユーザーの @mention トークンを取得する」です

入力

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

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

 
入力

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

 
「"いいえ"の場合」分岐:

この分岐は「投稿者をメンション先に追加しますか?」欄の「追加する」をオフにしたときの分岐です。

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

 

「変数を初期化する-返信先ID」アクション

このアクションは「変数」>「返信を初期化する」です。このフローの返信先のIDを変数として初期化します。

入力

"name": "返信先ID",
"type": "string"

返信先を変数にする理由はふたつあります

  • Teamsにおける返信先はそのスレッドの「親の投稿」(= スレッドの一番上の投稿)であるため
  • 起点となる投稿が「親の投稿」であるか「返信」であるかによって返信先の取得方法が変わるため

  

「条件-対象が親の投稿である」アクション

このアクションは「コントロール」>「条件」です。起点の投稿が「親の投稿」であるかどうかによって適切な方法で返信先IDを取得します。

条件

"expression":{"equals":["@triggerBody()?['teamsFlowRunContext']?['messagePayload']?['replyToId']",null]}

「"はい"の場合」分岐:

 
この分岐で配置しているアクションはひとつだけです。
このアクションは「Microsoft Teams」>「変数の設定」です。


起点となる投稿が「親の投稿」であるため、その投稿自身のIDを返信先IDとしています。

 
入力

"name": "返信先ID",
"value": "@triggerBody()?['teamsFlowRunContext']?['messagePayload']?['id']"

 
「"いいえ"の場合」分岐:

 
この分岐で配置しているアクションもひとつだけです。
このアクションは「Microsoft Teams」>「変数の設定」です。


起点となる投稿が「返信」であるため、その投稿が返信をしている先(replyToId)のIDを返信先IDとしています。


入力

"name": "返信先ID",
"value": "@triggerBody()?['teamsFlowRunContext']?['messagePayload']?['replyToId']"

「チャネル内のメッセージで応答します」アクション

このアクションは「Microsoft Teams」>「チャネル内のメッセージで応答します」です。フローによってスレッドへの返信を実行します。

入力

"poster": "User",
"location": "Channel",
"body/parentMessageId": "@variables('返信先ID')",
"body/recipient/groupId": "@triggerBody()?['teamsFlowRunContext']?['channelData']?['team']?['aadGroupId']",
"body/recipient/channelId": "@triggerBody()?['teamsFlowRunContext']?['channelData']?['channel']?['id']",
"body/messageBody": "

@{variables('メンショントークン')}

"

  

このフローをGitHubで公開しました。(再掲)

フローをGitHubで公開しました。下記リンク先からダウンロードしてください。この投稿の冒頭で記載しているリンクと同じです。
github.com

最後に

こちらの投稿の最後で触れたとおり、次は下記フローの公開して解説します。(`・ω・´)シャキーン


今回は以上です。