はじめに
このフローの動作イメージです。
Forms側でのクイズの設問数の追加や、答えの修正、点数の変更など。様々な変更に対応した採点フローです。
クイズの方を変更しても、フローの方は一切メンテナンスなしで正しい総得点が通知できています。
回答内容の確認方法いろいろ
フローの解説に入る前に、Forms クイズの回答結果を確認してみましょう。
Forms の編集画面から
回答があった場合、編集画面の「応答」タブから回答を確認することができます。
このページでは回答の割合など、概要のみが表示されますが、「解答のレビュー」から個別の回答を確認することもできます。
ユーザーごとの回答を確認すると、そのユーザーが回答した内容だけでなく、設定された正解と照らし合わせた点数も表示されます。
この点数がPower Automate でも取得できればいいのですが・・・
Excel にエクスポートされる回答内容
同じく「応答」タブから、Excel にエクスポートして回答を確認することもできます。
Power Automate で取得できる回答内容
肝心のPower Automate で取得できる情報です。
Forms コネクタのアクションには「応答の詳細を取得する」のみが存在していますが、この方法で詳細を確認しても、取得できる情報はユーザーが何と回答したかのみです。
結論として、Power Automate のFormsコネクタでは点数は取得できず、フロー内で採点するためには、そのためのメモが必要です。
具体的には、正解の情報とその設問に対する配点の情報をそれぞれ記述しておく必要があります。
正解や配点のメモは、フロー内に直接書くのでも、あるいはSharePointリストなどの外部ソースに置いておいくのでもよいのですが、どちらにせよクイズを変更した際にはそうしたメモも同時に編集しなければなりません。
備考
メンテナンスが大変なだけでなく、回答のチェックもかなり面倒です。
複数回答可能な選択肢形式の設問や、ランキング形式の設問は特に採点が大変なので、あまりやりたい方法ではありません。
フローの解説
以上、フロー内での採点が難しいということを確認した上で、今回のフローの解説に移ります。
「具体的にどうやって採点してるんだよ?」 ということを端的に説明すると、先ほど紹介したExcel にエクスポートする機能を使います。
エクスポートしたExcel に採点結果が出力されるので、フローでExcel をエクスポートできたら採点結果もわかりますね?
フローの全体像
全体像はこちらです。
少し長いので折りたたんでおきます。
トリガー
注意
2024年2月3日現在では、トリガーの「分割」設定が従来のデザイナーと異なる設定になるようなので注意してください。
各種IDの取得
トリガーから、このフローに必要な情報を抜き出します。
トリガーの出力には、応答IDだけでなくフォームIDも含まれているので、この値を変数に格納します。
フォームIDの方は動的なコンテンツからは指定できないので、数式で指定します。
triggerOutputs()?['body/resourceData/formId']
以降は、ここで変数に保存されたIDを使用するため、このフロー全体を通してメンテナンスが必要な設定はトリガーのみになります。
別のクイズを採点したい場合は、トリガーで別のFormを指定するだけで同じフローが使い回せるということです。
Excel のエクスポート
先ほどのIDを使って回答をExcel にエクスポートします。
Excelを取得する手順は、わたるふさんの以下の記事を参考にさせていただきました。
参考にさせていただいた記事
ただし、今回は回答の全体を取得する必要はなく、トリガーとして発動された回答のみの結果を取得できればよいので、minResponseId
を1
から始めずに容量を最小限にしています。
/formapi/DownloadExcelFile.ashx?formid=@{variables('formId')}&timezoneOffset=180&minResponseId=@{variables('responseId')}&maxResponseId=@{variables('responseId')}
追記
FormsAPIの仕様はMicrosoft 公式のLearn での解説が無いようです。
「SharePoint に HTTP 要求を送信します」アクションを使用しているように、リクエストはSharePoint REST API 経由となります。
以上より、あまり一般的な方法ではありませんので、実務などで使用される場合はその点ご留意の上お使いください。
その後、取得したExcelをOneDriveの適当な場所に保存します。
ファイル名は重複しないように、タイムスタンプやGUIDなどを使うとよいでしょう。
今回は簡単にGUIDを使用しています。
@{guid()}.xlsx
得点の取得
エクスポートしたExcelから採点結果を取得します。
一旦、エクスポートされたExcel ファイルの中身を実際に開いて確認してみましょう。
トリガーとなったID
:9
の回答の点数が、Total points
列に出力されていることが確認できますね。
Excel コネクタを使ってこの点数を取り出すことができれば目的は達成です。
ということでExcel コネクタの登場です。
1件の情報が取得できればよいので、「表内に存在する行を一覧表示」アクションではなく、「行の取得」アクションを使用します。
テーブル
・キー列
はカスタム値の入力で画面の通り手入力すればOKです。
最後に取得できた行からTotal points
列の値を取得します。
まだ存在しないExcel テーブルからは、動的なコンテンツとして取得することができないので、数式を使って以下のように取り出します。
body('行の取得')?['Total points']
あとは目的に応じて、通知を送るなりなんなりしてあげてください。
おわりに
取得できない点数を、Excel へのエクスポート機能、さらにそれをフローで行うためのAPI 操作と、かなりトリッキーなフローでした。
一度作ってしまえば、FormのIDだけを変更して使いまわせるので、formId
をインプットにした子フローにしておくと、使い勝手が良いかもしれません。
一見関係なさそうな機能でも、意外とつながってくることが多いので、Microsoft 全般のさまざまな知識を身に着けることが、フローの引き出しを増やすことにつながります!