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

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

【解説編その5】Microsoft Formsのフォームに回答していないひとに対して自動でメンションする


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

このフローはGitHubで公開しています。
github.com

解説の経緯

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

この回で解説する範囲のフロー図

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

この回で解説する範囲は、フロー全体のうち下図の赤枠の部分です。

開いた状態のフロー図

下図は赤枠部分のアクションを開いたフロー図です。

前回の範囲で取得したもの

今回の範囲のインプットになるのは解説編その3の出力である「回答者と回答日時の一覧」と「メンショントークン」の2つです。

回答者と回答日時の一覧:

メンショントークン:

<at>4ba4af1a-e122-42b6-be3f-ba9ed20ad75d</at> <at>839910e0-f1c5-433c-a4fc-fd3facfc070d</at> <at>ac86a897-a97e-4bf7-9d68-6067105c9dea</at>

今回の説明範囲にあるアクションの目的

今回の範囲にあるアクションの目的は以下の通りです。

  • 「回答者と回答日時の一覧」配列をHTMLテーブルに変換
  • 未完了者へのメンションをいれるかどうかを判断。YesならTeamsへの投稿内容にメンショントークンを追加
  • Teamsに投稿
  • チャットでワークフローの実行者に連絡

ステップごとに解説します。

ステップごとの解説

「HTML テーブルの作成」スコープ

このスコープでは「回答者と回答日時の一覧」配列をTeamsに投稿する本文に載せるHTMLテーブルに変換します。

このスコープで使っているアクションは下記フロー解説の章「HTMLテーブルを作成」スコープと全く同じです。そのため、解説は下記ページを参照してください。
wataruf.hatenablog.com

唯一違う箇所は「HTML テーブルの作成」アクションの入力情報です。今回のフローでは解説編その3の出力のひとつである「回答者と回答日時の一覧」を入力情報に指定しています。

このスコープの出力はTableタグで作った表です。

"<table border=\"3\" bgcolor=\"87ceeb\"><thead><tr><th style=\"white-space:nowrap;padding:7px\">名前</th><th style=\"white-space:nowrap;padding:7px\">日時</th></tr></thead><tbody><tr><td style=\"padding:7px\">Administrator MOD</td><td style=\"padding:7px\">2022/06/18 18:05:14</td></tr><tr><td style=\"padding:7px\">Miriam Graham</td><td style=\"padding:7px\">2022/07/04 17:47:14</td></tr><tr><td style=\"padding:7px\">Lynne Robbins</td><td style=\"padding:7px\"></td></tr><tr><td style=\"padding:7px\">Adele Vance</td><td style=\"padding:7px\"></td></tr><tr><td style=\"padding:7px\">Joni Sherman</td><td style=\"padding:7px\"></td></tr></tbody></table>"

これがTeamsに投稿されるとこう表示されます。

「変数を初期化する - 投稿の本文」アクション

このアクションは「変数」>「変数を初期化する」アクションです。このアクションによって、フローがTeamsに投稿する本文を定義します。

”回答を完了したひとおよびその日時は以下の通りです。\n@{outputs('表のpaddingを広げるためにスタイルを変更する')}\n<br/>\n回答フォーム:<br/>\n<a href=\"@{concat('https://forms.office.com/Pages/ResponsePage.aspx?id=',outputs('作成-フォームID'))}\">フォームを開く</a><br/>"

「条件 - 未完了者へのメンションをいれるかどうか」アクション

このアクションは「コントロール」>「条件」のアクションです。未完了者へのメンションをいれるかどうかを判断。YesならTeamsへの投稿内容にメンショントークンを追加します。

「未完了者へのメンションをいれるかどうか」はフローの開始フォームにある下図の赤枠の部分で指定します。

オンとオフのどちらが指定されたかをこの条件アクションで関数を使って判定します。

:{"equals":["@<span style="color: #ff0000"><strong>triggerBody()['boolean']</strong></span>","@true"]}

Yesであれば「はい の場合」に分岐します。「文字列変数への追加」アクションを使って本文の変数にメンショントークンを追加します。

 "<br/>\n未完了のかたは対応お願いします。\n<br/>\n@{variables('メンショントークン')}"

Noであれば「いいえ の場合」に分岐します。この分岐では何もアクションを実行しません。

「チャネルにメッセージを投稿-未提出者のチェック結果」アクション

このアクションは「Microsoft Teams」>「チャットまたはチャネルでメッセージを投稿する」です。フローによってTeamsにメッセージを投稿します。

投稿の件名(subject)にフォームのタイトルを含めています。フォームのタイトルはFormsのAPIから取得できる情報のひとつです。

 "poster": "User",
 "location": "Channel",
 "body/recipient/groupId": "8515b3b8-9634-4dd5-992d-af2f0c702e88",
 "body/recipient/channelId": "19:c1d2805e19264680a89034353517de5a@thread.tacv2",
 "body/messageBody": "<p>@{variables('未完了者の確認結果を記載した本文')}</p>",
 "body/subject": "「@{<strong>outputs('HTTP要求-フォームの情報を取得')?['body']?['title']</strong>}」の回答状況です。"

「作成-チェック結果を投稿した旨の通知本文」アクション

このアクションは「変数」>「変数を初期化する」アクションです。このアクションによって、フローがワークフローの実行ユーザーに通知を行う際の本文を定義します。

ポイントのひとつは、このチャット送信を行っている理由です。

このフローでワークフローの実行者に通知を行う理由は、フローによるチャネルへの投稿はフローの実行者のアカウントによって実行されるため、フローによって投稿が行われたことに実行者が気が付きにくいためです。

例として、フローによる未回答者へのメンション対象にフローの実行者が含まれているとしても自分自身へのメンションは通知されません

そのため、フローの実行者が必ず気付くようにこのアクションによってチャットを送信しています。

もうひとつのポイントは、フォームIDを使って回答用フォームのURLを生成していることです。フローの前半で取得したフォームIDと固定の文字列をconcate関数でつなげることにより回答用フォームのURLを生成しています。

"inputs": "「フォームの未回答者をチェック」の実行結果をチャネルに投稿しました。<br><br>\n【投稿先】<br>\n<a href=\"@{outputs('チャネルにメッセージを投稿-未提出者のチェック結果')?['body/messageLink']}\">チャネルを開く</a><br>\n<br>\n【フォーム】<br>\n@{<strong>outputs('HTTP要求-フォームの情報を取得')?['body']?['title']</strong>}<br>\n<a href=\"@{<strong>concat('https://forms.office.com/pages/designpagev2.aspx?id=',outputs('作成-フォームID'))}</strong>\">フォームを開く</a><br/>",

「チチャットを投稿-チェック結果をチャネルに投稿した旨をチャットで通知」アクション

このアクションは「Microsoft Teams」>「チャットまたはチャネルでメッセージを投稿する」です。フローによってワークフロー実行ユーザーに通知を行います。

"poster": "Flow bot",
"location": "Chat with Flow bot",
"body/recipient": "@{outputs('マイ_プロフィールの取得_(V2)')?['body/mail']};",
"body/messageBody": "<p>@{outputs('作成-チェック結果を投稿した旨の通知本文')}</p>"

次回は応用編です

解説編の内容はこれで終了です。次回は応用編です。応用編は2回(その1とその2)を予定しています。

今回は以上です。

追記:応用編その1を投稿しました。

wataruf.hatenablog.com