メンテナンス不要！どんなForms クイズでも採点するPower Automate フロー

# はじめに

このフローの動作イメージです。

https://x.com/ksgiksg/status/1752686269031973253?s=20

Forms側でのクイズの設問数の追加や、答えの修正、点数の変更など。様々な変更に対応した採点フローです。
クイズの方を変更しても、フローの方は一切メンテナンスなしで正しい総得点が通知できています。


:::note warn
**注意**
Forms の機能として採点ができないもの（レビューが必要なもの）や、正解が設定されていない設問は**点数を取得できません。**

例：『日付』形式の設問
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/7c32fbfa-0e77-7ec1-e615-db9ebb152baa.png)
:::

# 回答内容の確認方法いろいろ
フローの解説に入る前に、Forms クイズの回答結果を確認してみましょう。

## Forms の編集画面から
回答があった場合、編集画面の「応答」タブから回答を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/1659fcdb-7f0d-cc79-ae63-1699b6b79aa3.png)

このページでは回答の割合など、概要のみが表示されますが、「解答のレビュー」から個別の回答を確認することもできます。

ユーザーごとの回答を確認すると、そのユーザーが回答した内容だけでなく、設定された正解と照らし合わせた点数も表示されます。

この点数がPower Automate でも取得できればいいのですが・・・ 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c31ab486-2028-3fc3-720e-ba67a605e7ef.png)


## Excel にエクスポートされる回答内容
同じく「応答」タブから、Excel にエクスポートして回答を確認することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/9a00abb7-f24f-8236-c6cd-3da46d760a79.png)

こちらも同じように、合計点数を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/6f3d670d-4274-e002-f16b-2a94a3835492.png)


## Power Automate で取得できる回答内容
肝心のPower Automate で取得できる情報です。
Forms コネクタのアクションには「応答の詳細を取得する」のみが存在していますが、この方法で詳細を確認しても、**取得できる情報はユーザーが何と回答したか**のみです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/595128e5-5a6c-fb70-fd05-9c6ab950e15c.png)

結論として、Power Automate のFormsコネクタでは点数は取得できず、フロー内で採点するためには、そのための**メモ**が必要です。

具体的には、正解の情報とその設問に対する配点の情報をそれぞれ記述しておく必要があります。

正解や配点のメモは、フロー内に直接書くのでも、あるいはSharePointリストなどの外部ソースに置いておいくのでもよいのですが、どちらにせよクイズを変更した際にはそうしたメモも同時に編集しなければなりません。

:::note warn
**備考**
メンテナンスが大変なだけでなく、回答のチェックもかなり面倒です。
複数回答可能な選択肢形式の設問や、ランキング形式の設問は特に採点が大変なので、あまりやりたい方法ではありません。
:::

# フローの解説
以上、フロー内での採点が難しいということを確認した上で、今回のフローの解説に移ります。

**「具体的にどうやって採点してるんだよ？」** ということを端的に説明すると、先ほど紹介した**Excel にエクスポートする機能**を使います。

エクスポートしたExcel に採点結果が出力されるので、フローでExcel をエクスポートできたら採点結果もわかりますね？


## フローの全体像
全体像はこちらです。
少し長いので折りたたんでおきます。
<details><summary>フローのスクリーンショット</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/9f819ed4-0c6e-c4dd-77bc-4fce195ef9a7.png)

</details>

## トリガー
トリガーは単純にFormsからの回答を受け取ればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/236b4764-71ce-6c82-29fc-14a7b32cf8b1.png)

:::note warn 
注意
2024年2月3日現在では、トリガーの「分割」設定が従来のデザイナーと異なる設定になるようなので注意してください。
:::

https://note.com/momo_rpa/n/nfc188890fd00

## 各種IDの取得
トリガーから、このフローに必要な情報を抜き出します。
トリガーの出力には、応答IDだけでなくフォームIDも含まれているので、この値を変数に格納します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/52a4d571-222c-1f6a-4832-3f306c9fa5ed.png)

応答IDは動的なコンテンツからも選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/3bfb2657-3445-168f-a765-fd71a73d8abf.png)

フォームIDの方は動的なコンテンツからは指定できないので、数式で指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/42c150b5-79d0-d46b-8be1-8b253d93a4d7.png)

```powerfx:formId
triggerOutputs()?['body/resourceData/formId']
```

以降は、ここで変数に保存されたIDを使用するため、このフロー全体を通してメンテナンスが必要な設定はトリガーのみになります。

別のクイズを採点したい場合は、トリガーで別のFormを指定するだけで同じフローが使い回せるということです。

## Excel のエクスポート
先ほどのIDを使って回答をExcel にエクスポートします。
Excelを取得する手順は、わたるふさんの以下の記事を参考にさせていただきました。

---
**参考にさせていただいた記事**

https://wataruf.hatenablog.com/entry/2022/06/26/125948

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5a1139c5-a51a-076d-7ffe-a7738c237076.png)

ただし、今回は回答の全体を取得する必要はなく、トリガーとして発動された回答のみの結果を取得できればよいので、`minResponseId`を`1`から始めずに容量を最小限にしています。

```powerfx:SharePoint に HTTP 要求を送信します:URI
/formapi/DownloadExcelFile.ashx?formid=@{variables('formId')}&timezoneOffset=180&minResponseId=@{variables('responseId')}&maxResponseId=@{variables('responseId')}
```

:::note warn
**追記**
FormsAPIの仕様はMicrosoft 公式のLearn での解説が無いようです。
「SharePoint に HTTP 要求を送信します」アクションを使用しているように、リクエストはSharePoint REST API 経由となります。
以上より、あまり一般的な方法ではありませんので、実務などで使用される場合はその点ご留意の上お使いください。
:::

その後、取得したExcelをOneDriveの適当な場所に保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ab11f76e-8804-b890-83c2-8bbcdacee782.png)

ファイル名は重複しないように、タイムスタンプやGUIDなどを使うとよいでしょう。
今回は簡単にGUIDを使用しています。
```powerfx:ファイルの作成:ファイル名
@{guid()}.xlsx
```


## 得点の取得
エクスポートしたExcelから採点結果を取得します。
一旦、エクスポートされたExcel ファイルの中身を実際に開いて確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/0e29279e-456e-6170-3daf-592a2db92ed9.png)

トリガーとなった`ID`：`9`の回答の点数が、`Total points`列に出力されていることが確認できますね。
Excel コネクタを使ってこの点数を取り出すことができれば目的は達成です。

:::note 
information
他にも、各設問の回答内容とその得点数などが記載されていることが確認できます。
（今回は使用しません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/50c8388a-e19b-446d-7394-0a45e3ad58aa.png)
:::

ということでExcel コネクタの登場です。
1件の情報が取得できればよいので、「表内に存在する行を一覧表示」アクションではなく、「**行の取得**」アクションを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/44766127-c018-870f-d95a-cc1a0e83fe2e.png)

`テーブル`・`キー列`はカスタム値の入力で画面の通り手入力すればOKです。

最後に取得できた行から`Total points`列の値を取得します。
まだ存在しないExcel テーブルからは、動的なコンテンツとして取得することができないので、数式を使って以下のように取り出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c7ea7429-9816-47a1-4bae-614e236c18cb.png)

```powerfx:作成（得点の取得）
body('行の取得')?['Total points']
```

あとは目的に応じて、通知を送るなりなんなりしてあげてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c02b5c07-d3d8-4c87-1ac6-a92c749eeadb.png)


# おわりに
取得できない点数を、Excel へのエクスポート機能、さらにそれをフローで行うためのAPI 操作と、かなりトリッキーなフローでした。

一度作ってしまえば、FormのIDだけを変更して使いまわせるので、`formId`をインプットにした**子フロー**にしておくと、使い勝手が良いかもしれません。

一見関係なさそうな機能でも、意外とつながってくることが多いので、Microsoft 全般のさまざまな知識を身に着けることが、フローの引き出しを増やすことにつながります！