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

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

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


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

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

解説の経緯

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

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

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

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

開いた状態のフロー図

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

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

今回の範囲のインプットになるのは解説編その2の出力である「Excel内の回答一覧テーブルにあるすべての行」です。

Excel Online のコネクタを使ってテーブルから下記のJSONデータを取得しました。

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

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

  • 「回答一覧テーブルのすべての行データ」を簡易版JSON Dictionary の形式に変換
  • Teamsに投稿する表(= 「回答者と回答日時の一覧」)のアレイを初期化
  • メンショントークンを初期化
  • 「チェック対象メンバー」配列をベースにして、「回答者と回答日時の一覧」配列に情報を入力

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

ステップごとの解説

「選択-Key(メールアドレス)とValue(回答日時)の配列を作る」アクション

これは「データ操作」>「選択」アクションです。「回答一覧テーブルのすべての行データ」をKey(メールアドレス)とValue(回答日時)の配列にします。

"inputs": {
 "from": "@outputs('表内に存在する行を一覧表示')?['body/value']",
 "select": {
  "@{item()?['Email']}": "@item()?['Completion time']"
 }
}

下図はこのアクションの出力例です。下図はふたりのユーザーが回答したことを表します。

「作成-簡易版JSON Dictionaryを作る(回答日時)」アクション

このアクションは「データ操作」>「作成」アクションです。このアクションによって配列を簡易版JSON Dictionaryの形式に整形します。

"inputs": "@json(concat('{',replace(replace(replace(replace(string(body('選択-Key(メールアドレス)とValue(回答日時)の配列を作る')),'{',''),'}',''),'[',''),']',''),'}'))"

後続のアクションでメールアドレスをKeyとして回答日時というValueをLookup検索できるようにこの形式にします。

簡易版JSON Dictionary の説明については下記投稿を参照してください。
wataruf.hatenablog.com

下図はこのアクションの出力例です。

「変数を初期化する-回答者と回答日時の一覧」アクション

このアクションは「変数」>「変数を初期化する」アクションです。今回の範囲にあるアクションの出力のひとつとなる配列を宣言します。このアクションの時点では値は空白です。

"inputs": {
  "variables": [
    {
      "name": "回答者と回答日時の一覧",
      "type": "array"
    }
  ]
}

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

このアクションは「変数」>「変数を初期化する」アクションです。今回の範囲にあるアクションの出力のもうひとつとなる配列を宣言します。この配列もこのアクションの時点では空白です。

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

「Apply to each-回答者の表示名と回答日時の配列を作成」アクション

このアクションは「コントロール」>「Apply to each」アクションです。繰り返し処理によって「回答者の表示名と回答日時の配列」を作成します。

「Apply to each」アクションでやること

このアクションによって、フローが確認対象とするメンバーそれぞれが回答者一覧に載っているかどうかを確認します。

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

繰り返し処理内のステップごとの解説

この繰り返し処理が入力情報とするのは変数「チェック対象メンバー」で定義した配列です。

この配列のことですね。この例では5名のユーザーをチェック対象としているので、実行する繰り返し処理の回数は5回です。

まずは「ユーザー プロフィールの取得 (V2)」アクションを使ってユーザー情報を取得します。最終的なチェック結果の表にメンバーの表示名を記載するためです。

条件分岐の関数は以下の通りです。ポイントはJSON Dictionary にKeyとして渡すプロパティ名としてstring関数で文字列に変換したitem() を使用していることです
この変換を行っている理由は「item()」のような関数では配列の値を辿る指定ができないためです。string関数を使うことで配列から値を取得する際にこのような動的な指定ができることを覚えておいてください。活用できる場面はきっとあります。

empty(outputs('作成-簡易版JSON_Dictionaryを作る(回答日時)')?[string(item())])
次の値に等しい
true

次に条件分岐アクションで該当メンバーが回答者一覧にいるかどうかを判定します。いない場合はTrueに分岐します。いる場合はFalseに分岐します。

Trueに分岐した場合は配列変数「回答者と回答日時の一覧」にメンバーの表示名のみ記載します。このメンバーは未回答であるため、回答日時は空白にします。
また、提出の催促を行うためこのメンバーのメンショントークンを取得します。

Falseに分岐した場合は配列変数「回答者と回答日時の一覧」にメンバーの表示名と回答日時を記載します。このとき、日時をconvertTimeZone関数を使ってUTCから日本時間に変換します。

日時:

convertTimeZone(outputs('作成-簡易版JSON_Dictionaryを作る(回答日時)')?[string(item())], 'UTC', 'Tokyo Standard Time', 'yyyy/MM/dd HH:mm:ss')

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

今回の範囲で取得したものは「回答者と回答日時の一覧」と「メンショントークン」の2つです。

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

メンショントークン:

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

解説編その5 の内容

次回の解説編その5が解説編の最終回です。未回答者の洗い出し結果をTeamsに投稿します。

今回は以上です。

追記:解説編その5を投稿しました。

wataruf.hatenablog.com