【Power Automate】【解説編】スレッドの発言者をメンバーにしたタグをつくる
掲題のフローについての解説編です。
このフローをGitHubで公開しました。下記リンク先からダウンロードしてください。
github.com
解説の経緯
今回の投稿は概要編の続きです。
解説の範囲について
「スレッドのすべての投稿を取得する」ステップについては別投稿を参照してください
投稿を取得するアクション(下図の赤枠)については過去に投稿したこちらの記事で解説したフローと同じです。そのため、今回は説明を割愛します。
wataruf.hatenablog.com
解説する範囲
今回解説する範囲は下図の赤枠の部分です。
ステップごとの解説
「選択-「親の投稿」と返信それぞれの投稿者のID一覧」
このアクションは「データ操作」>「選択」です。取得した投稿一覧の配列からユーザーIDのみを取得します。
プロパティ
"from": "@variables('投稿一覧')",
"select": "@item()?['from']?['user']?['id']"
「開始」欄に入力しているのは、割愛しているステップで取得した投稿一覧です。
投稿一覧から、「マップ」欄で指定したユーザーIDのみを取得して配列にします。このとき、この配列には重複やnullが含まれる場合があります。
※ null は論理削除された投稿からユーザーIDを取得しようとした結果の値です。
「アレイのフィルター処理-nullを排除」
このアクションは「データ操作」>「アレイのフィルター」です。先ほどの配列からnullの要素を排除します。
プロパティ
"from": "@body('選択-「親の投稿」と返信それぞれの投稿者のID一覧')",
"where": "@not(equals(item(), null))"
null が排除された配列が得られました。
「作成-重複を排除」
このアクションは「データ操作」>「作成」です。先ほどの配列から重複を排除します。
重複の排除はunion関数を使います。
プロパティ
"inputs": "@union(body('アレイのフィルター処理-nullを排除'), body('アレイのフィルター処理-nullを排除'))"
重複が排除された配列が得られました。
「チームのタグを作成する」
このアクションは「Microsoft Teams」>「チームのタグを作成する」です。このアクションでタグを作成します。
プロパティ
"groupId": "@triggerBody()?['entity']?['teamsFlowRunContext']?['channelData']?['team']?['aadGroupId']",
"body/displayName": "@triggerBody()?['entity']?['cardOutputs']?['タグの名前']",
"body/members": "@join(outputs('作成-重複を排除'),';')"
タグが作成されたことがアクションの出力で確認できます。
Teamsの画面でも確認できます。
「変数を初期化する-タグに含めるメンバー一覧(表示名・メールアドレス)」
このアクションは「変数」>「変数を初期化する」です。ここではタグに含めるメンバー情報を格納するための変数を定義します。この時点では変数の中身は空です。
プロパティ
"name": "タグに含めるメンバー一覧(表示名・メールアドレス)",
"type": "array"
後続のアクションでこの配列をHTMLテーブルに変換してTeamsに投稿します。
「Apply to each-メンバーのIDをもとに「表示名」「メールアドレス」配列を作成」
このアクションは「コントロール」>「Apply to each」です。
インデクサは「「作成-重複を排除」アクションの出力」です。
このインデクサの中身は起点となる投稿でメンション先となっているユーザーのID一覧です。
「ユーザー プロフィールの取得 (V2)」
このアクションは「Office 365 Users」>「ユーザー プロフィールの取得 (V2)」です。ユーザーIDを検索キーにしてユーザーのプロフィール情報を取得します。
プロパティ
"id": "@item()"
「配列変数に追加-タグに含めるメンバー一覧」
このアクションは「変数」>「配列変数に追加」です。配列変数にユーザーのプロフィール情報を追加します。
プロパティ
"name": "タグに含めるメンバー一覧(表示名・メールアドレス)",
"value": {
"表示名": "@{outputs('ユーザー_プロフィールの取得_(V2)')?['body/displayName']}",
"メールアドレス": "@{outputs('ユーザー_プロフィールの取得_(V2)')?['body/mail']
}"
この追加アクションはインデクサに含まれるユーザーの個数分だけ実行されます。
最終的にはこのような配列ができあがります。
「HTML テーブルの作成-タグに含めるメンバー」
このアクションは「データ操作」>「HTML テーブルの作成」です。このアクションで配列をHTMLに変換します。
プロパティ
"from": "@variables('タグに含めるメンバー一覧(表示名・メールアドレス)')",
"format": "HTML"
この配列が、、
このようなHTMLテーブルになります。この時点ではまだ罫線の色や太さなどのスタイルは設定されていません。
「条件-タグ作成完了時にスレッドに投稿する」
このアクションは「コントロール」>「条件」です。フロー実行時に表示された「タグの作成完了時にタグを使った返信をスレッドに投稿しますか?」をオンorオフどちらにしたかによって分岐します。
条件
"equals":["@triggerBody()?['entity']?['cardOutputs']?['投稿する']","True"]}
「はいの場合」に実行する処理:
この分岐で実行するアクションは以下の通りです。
この分岐ではTeams本文でHTMLテーブルを使用するために複数のアクションを組み合わせて使用しています。この手法については下記投稿で解説をしています。こちらを参照してください。
wataruf.hatenablog.com
この分岐の最後にTeamsへの投稿を行います。
「いいえの場合」に実行する処理:
この分岐では特に実行するアクションはありません。
「作成-チャットの本文」
このアクションは「データ操作」>「作成」です。フローの処理完了通知の本文を定義します。
プロパティ
"inputs": "指定したスレッドの発言者をメンバーとしたタグを作成しました。\n\n【タグの名前】\n@{triggerBody()?['entity']?['cardOutputs']?['タグの名前']}\n\n【メンバー】\n@{body('HTML_テーブルの作成-タグに含めるメンバー')}\n【元のスレッド】\nスレッドを開く"
後続の投稿アクションに直接本文を記載せずに「作成」変数で本文を定義しているのは、本文の定義をフロー編集画面で読みやすくするためです。投稿アクションでreplace関数を使って改行をいれるため、本文の定義で改行タグ(BRタグ)をいれる必要がありません。
「チャットまたはチャネルでメッセージを投稿する」
このアクションは「Microsoft Teams」>「チャットまたはチャネルでメッセージを投稿する」です。フローbotを使ってフロー実行者宛にチャットで完了通知を送ります。
プロパティ
"poster": "Flow bot",
"location": "Chat with Flow bot",
"body/recipient": "@{triggerBody()?['entity']?['teamsFlowRunContext']?['from']?['aadObjectId']};",
"body/messageBody": "<p>@{replace(outputs('作成-チャットの本文'),decodeUriComponent('%0A'),'<br/>')}</p>"
無事送信されました。
このフローをGitHubで公開しました。(再掲)
フローをGitHubで公開しました。下記リンク先からダウンロードしてください。この投稿の冒頭で記載しているリンクと同じです。
github.com
最後に:「気ままに勉強会 #48」に登壇させていただきます。
今週末 2023/03/11(土) 20:00 に開催予定の
「気ままに勉強会 #48」に登壇させていただきます。
以前このブログで投稿した「LT#2 Microsoft Teams 内の指定したスレッドの発言者とのグループチャットを開始する」の話をします。
参加申し込みはこちらから。
kimamani.connpass.com
出戻りガツオさん、ふー さん、Miyakeさん。
自分の登壇内容よりお三方の内容のほうが気になる。('ω')
今回は以上です。