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

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

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


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

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

解説の経緯

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

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

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

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

開いた状態のフロー図

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

この範囲にあるアクションの目的

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

  • Microsoft Forms のAPIを使ってフォームの情報を取得する
    • フォームの名前。Teamsに投稿するときにフォーム名を表示したいため
    • 回答の件数。後続のアクションで「その時点のすべての回答」を取得するときにAPIに渡す必要がある情報であるため
  • Microsoft Forms のAPIを使って「その時点のすべての回答」を取得する
  • 取得した回答をExcel形式でOneDrive for Businessに保存する
  • Excel内の回答一覧テーブルからすべての行を取得する

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

ステップごとの解説

「HTTP要求-フォームの情報を取得」アクション

このアクションは「SharePoint」>「SharePoint に HTTP 要求を送信します」アクションです。フォームのAPIにHTTP要求を投げてフォームの情報を取得しています。

このAPIに渡すインプット情報は解説編その1 で取得した「フォームID」です。

入力パラメータ:

"parameters": {
"dataset": "https://forms.office.com/formapi",
"parameters/method": "GET",
"parameters/uri": "api/light/forms(@{outputs('作成-フォームID')})"
}

このAPIから取得したい情報は以下の2つです。

  • フォームの名前。Teamsに投稿するときにフォーム名を表示したいため
  • 回答の件数。後続のアクションで「その時点のすべての回答」を取得するときにAPIに渡す必要がある情報であるため

「HTTP要求-フォームの回答をすべて取得」アクション

このアクションも「SharePoint」>「SharePoint に HTTP 要求を送信します」アクションです。フォームのAPIにHTTP要求を投げて「その時点のすべての回答」を取得しています。

このAPIに渡すインプット情報は「フォームID」と先ほどAPIから取得した「回答の件数」です。

入力パラメータ:

"parameters": {
"dataset": "https://forms.office.com",
"parameters/method": "GET",
"parameters/uri": "/formapi/DownloadExcelFile.ashx?formid=@{outputs('作成-フォームID')}&timezoneOffset=180&minResponseId=1&maxResponseId=@{outputs('HTTP要求-フォームの情報を取得')?['body']?['rowCount']}"
}

このAPIから返されるレスポンスが下記の出力データです。これが回答の全件を含むデータです。

「application/octet-stream」はMIMEタイプ(ファイルの種類を表す情報)のひとつです。「application/octet-stream」はMIMEタイプのうち「データ形式が不明なファイル」を表します。

参考:
application/octet-stream【MIMEタイプ】- 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

「作成-一時保存Excelファイルの名前」アクション

これは「データ操作」>「作成」アクションです。先ほど取得した出力データをExcelファイルとして保存する際のファイル名を定義します。

このフローでは日本時間のyyyyMMdd_HHmm でファイル名をつけています。

このファイルを作成する目的は後続のExcel Onlineのコネクタでデータを読み取れるようにするためです。ひとの目で触れることを前提としないファイルなので名前は任意の命名規則に変更して構いません。

入力パラメータ:

"inputs": "@concat(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time', 'yyyyMMdd_HHmm'),'_',outputs('HTTP要求-フォームの情報を取得')?['body']?['title'],'.xlsx')",

「ファイルの作成-一時保存Excelファイルを作成」アクション

これは「OneDrive for Business」>「ファイルの作成」アクションです。取得した回答データをOneDrive for Businessに保存します。

このアクションが実行されるとOneDrive for Businesのルートフォルダに「フォームへの回答結果」というフォルダが作成されます。そのフォルダに回答データのExcelファイルが保存されます。

Excelファイルの作成場所は必ずしもOneDrive for Businesである必要はないです。任意のSharePointサイトに変更して構いません。

概要編の「注意事項」で記載しているとおりフローにこのファイルの削除アクションをまだいれていないため、フローが実行するたびにExcelファイルが作成されます。古いファイルは適宜手動で削除してください。

入力パラメータ:

"inputs": {
"parameters": {
"folderPath": "/フォームへの回答結果",
"name": "@outputs('作成-一時保存Excelファイルの名前')",
"body": "@body('HTTP要求-フォームの回答をすべて取得')"
},
}

「表内に存在する行を一覧表示」アクション

これは「Excel Online (Business)」>「表内に存在する行を一覧表示」アクションです。Excelシート内の表のすべての行を取得します。

このアクションによって表を読み込むには、その表がテーブルとして定義されている必要があります。

Microsoft FormsのAPIから取得したこのExcelファイルの回答一覧の表には既定で「Table1」という名前のテーブルが定義されています。そのためこのテーブルを取得対象とするようにアクションを設定します。

入力パラメータ:

"parameters": {
"source": "me",
"drive": "b!Rl6cMfndukyvuIu02Uqp83sQnUpEbu9Pt8ZBsBTiBIB5BzB5cEj8T7keA7DDdDhm",
"file": "@outputs('ファイルの作成-一時保存Excelファイルを作成')?['body/Path']",
"table": "Table1",
"dateTimeFormat": "ISO 8601"
}

このアクションのポイントは2つです

  1. 取得対象のテーブル「Table1」はカスタム値として指定すること
  2. テーブル内の日付データは「ISO 8601」形式を指定すること
ポイントひとつめ:取得対象のテーブル「Table1」はカスタム値として指定すること

このフローでは「すべての回答の取得」と「Excelファイルの保存」と「Excelファイル内のデータ参照」をフロー内で完結させています。そのため、この「Excelファイル内のデータ参照」のアクションを設定している時点では、このフローはExcelファイルにどんなテーブルがあるかを知りません。そのため、Table1というテーブルの名前はカスタム値として指定する必要があります。

この考え方はフローのアクションを設定するうえでよく出てきます。

ポイントふたつめ:テーブル内の日付データは「ISO 8601」形式を指定すること

既定値ではDataTime形式が「Serial Number」になっています。既定値のままでは日付がシリアル値で返ってきたしまうため、「ISO 8601」形式で返すようドロップダウンメニューで指定してください。

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

これでフォームの回答の全件を取得することができました。回答のデータは配列として後続のアクションに渡されます。

解説編その3 の内容

次回の解説編その3では、未回答者の洗い出しを行います。

今回は以上です。

追記:解説編その3を投稿しました。
ステップの洗い出しは1回休みにしてフローの改良回をいれました。
wataruf.hatenablog.com