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

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

【Power Automate】【解説編】Teamsの投稿でメンションされているひとととチャット・会議を開始する

この記事は RPA(ロボティック・プロセス・オートメーション) Advent Calendar 2023 に参加しています。23日目の枠をいただきました。

qiita.com

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

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

github.com

解説の経緯

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

フローの使用イメージ

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

wataruf.hatenablog.com

フロー図

ステップごとの解説

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

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

このトリガーではAdaptive Card を使ってフロー実行者に追加の情報入力を求めることができます。ですが、今回のフローで入力項目は設けていないです。

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

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

入力

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

出力(メンション部分の配列のみ抜粋)

"mentions": [
    {
        "id": 0,
        "mentionText": "Lynne",
        "mentioned": {
            "application": null,
            "device": null,
            "conversation": null,
            "tag": null,
            "user": {
                "@odata.type": "#microsoft.graph.teamworkUserIdentity",
                "id": "23683007-67de-4885-a4cc-16a73c0e7b1b",
                "displayName": "Lynne",
                "userIdentityType": "aadUser"
            }
        }
    },
    {
        "id": 1,
        "mentionText": "Robbins",
        "mentioned": {
            "application": null,
            "device": null,
            "conversation": null,
            "tag": null,
            "user": {
                "@odata.type": "#microsoft.graph.teamworkUserIdentity",
                "id": "23683007-67de-4885-a4cc-16a73c0e7b1b",
                "displayName": "Robbins",
                "userIdentityType": "aadUser"
            }
        }
    },
    {
        "id": 2,
        "mentionText": "Debra",
        "mentioned": {
            "application": null,
            "device": null,
            "conversation": null,
            "tag": null,
            "user": {
                "@odata.type": "#microsoft.graph.teamworkUserIdentity",
                "id": "a3811f52-6e2b-4594-8d58-11843b704a9c",
                "displayName": "Debra",
                "userIdentityType": "aadUser"
            }
        }
    },
    {
        "id": 3,
        "mentionText": "Berger",
        "mentioned": {
            "application": null,
            "device": null,
            "conversation": null,
            "tag": null,
            "user": {
                "@odata.type": "#microsoft.graph.teamworkUserIdentity",
                "id": "a3811f52-6e2b-4594-8d58-11843b704a9c",
                "displayName": "Berger",
                "userIdentityType": "aadUser"
            }
        }
    },
    {
        "id": 4,
        "mentionText": "Megan",
        "mentioned": {
            "application": null,
            "device": null,
            "conversation": null,
            "tag": null,
            "user": {
                "@odata.type": "#microsoft.graph.teamworkUserIdentity",
                "id": "d96e6e39-de35-4904-9cf0-f2c69f4058ac",
                "displayName": "Megan",
                "userIdentityType": "aadUser"
            }
        }
    },
    {
        "id": 5,
        "mentionText": "Bowen",
        "mentioned": {
            "application": null,
            "device": null,
            "conversation": null,
            "tag": null,
            "user": {
                "@odata.type": "#microsoft.graph.teamworkUserIdentity",
                "id": "d96e6e39-de35-4904-9cf0-f2c69f4058ac",
                "displayName": "Bowen",
                "userIdentityType": "aadUser"
            }
        }
    }
],

このアクションでは指定した投稿の詳細な情報を取得することができます。取得できる情報のなかには本文中にあるメンションの宛先情報が配列形式で含まれています。

ポイントは、指定したメンション先は3名なのにメンション先を表す配列に含まれる要素の個数が6つ(つまり宛先の2倍)あることです。

こうなる理由はTeamsでメンションを行う際に表示される苗字と名前の両方でメンションが行われているためです。メンション先が重複した状態になりますがメンション先のユーザーに送られる通知はひとつです。

メンション先を指定したあとにそれをバックスペースで消そうとして「あれ、名前が消えて苗字だけ残った。Σ(・ω・ノ)ノ!」という状況を経験したかたは多いと思われます。前述の通り、苗字と名前でそれぞれメンションが効いているため、片方だけが残った状態で投稿を確定した場合でもメンションが正しく行われます。

「作成-idの重複を排除」アクション

このアクションは「データ操作」>「作成」です。uion関数を使ってメンション先の重複を排除します。

入力
union(body('選択-メンション先のidを一覧取得'),body('選択-メンション先のidを一覧取得'))

出力

メンションされた3名のidが取得できました。

「チャットの作成」アクション

このアクションは「Microsoft Teams」>「チャットの作成」です。

入力
"parameters": {
    "item/members": "@join(outputs('作成-idの重複を排除'), ';')"
}

メンバーを指定する際にはセミコロン区切りで指定する必要があります。そのため、前述の「作成-idの重複を排除」アクションで取得した配列をjoin関数を使ってセミコロン区切りのテキストに変換します。変換したうえでチャットの作成アクションの入力情報として使用します。

出力

このアクションによってグループチャットが作成されます。入力で指定されたユーザーがグループチャットのメンバーとして登録されます。

作成されたグループチャットを一意に表すIDが出力されます。

「作成-チャットの本文」アクション

このアクションは「データ操作」>「作成」アクションです。チャットbotによって投稿するメッセージの本文を定義します。

入力

指定した投稿でメンションされたひととのグループチャットを作成しました。

 

【元のスレッド】
<a href="@{triggerBody()?['teamsFlowRunContext']?['messagePayload']?['linkToMessage']}">スレッドを開く</a>

出力

指定した投稿でメンションされたひととのグループチャットを作成しました。

 

【元のスレッド】
<a href="https://teams.microsoft.com/l/message/

19:2ff5161a47d6409993fd1ae11834620d@thread.tacv2/1702824435454">スレッドを開く</a>

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

このアクションは「Microsoft Teams」>「チャットまたはチャネルでメッセージを投稿する」です。チャットbotを使ってグループチャットに投稿を行います。

入力

parameters": {
    "poster": "Flow bot",
    "location": "Group chat",
    "body/recipient": "@outputs('チャットの作成')?['body/id']",
    "body/messageBody": "<p>@{replace(outputs('作成-チャットの本文'), decodeUriComponent('%0A'), '<br/>')}</p>"
}

 出力

このフローの解説は以上です

シンプルなフローですが活用いただけると幸いです。(*- -)(*_ _)ペコリ