Formsクイズ ランキング形式の問題をPower Automate で細かく採点する

# やりたいこと
Formsのクイズ、使ったことありますか？
自動で採点してくれたり、間違えた場合の解説も設定することができたりと、大変便利な機能です。
私は、生徒へのテストや社内教育の確認テストなど有効活用しています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/392eb213-320a-3259-dbf8-4076d02c1f4e.png)

今回は質問の種類の一つ、[ランキング]形式のクイズについてのお話です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/9cfde02f-c7e3-0e45-66f4-1cdc39a9a69a.png)

ドラッグアンドドロップで並び替えて回答するこのクイズですが・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/cee195ef-0f5e-44a7-3730-854b9d1507b6.png)

このように１ヵ所でも間違うと、0点扱いになってしまいます。悲しいですね😥
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/56b51fe7-6122-f22c-5f04-51d61b0e3a52.png)

ということで、これを細かく採点してあげるフローをPower Automate で作成します！
上の例でいうと8/10点となるように、計算してあげようということです。

# フローの概要
フローの全体像です。
![make.powerautomate.com_environments_Default-b794cd83-44cc-447c-856e-a27e55624c65_flows_new_newFlowName=%E4%B8%A6%E3%81%B3%E6%9B%BF%E3%81%88%E3%82%AF%E3%82%A4%E3%82%BA%E3%81%AE%E6%8E%A1%E7%82%B9&trigger=%2Fproviders.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f63d7488-9aea-e90a-f822-1448f344e01f.png)

クイズに回答すると、チャットで点数を教えてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/4305f9bb-5e96-3e37-5d66-4197977cb667.png)

# フローの解説
## 変数の初期化
このフローでは変数を多用します。

| 名前 | 種類 | 内容 |
|:-|:-|:-|
|**カウンタ**|整数|ループ用のカウンタ変数。|
|**得点**|整数|正解数を記録するための変数。|
|**メッセージ**|文字列|通知メッセージのために、各回答の正解・不正解を記録する変数。|
|**正解**|アレイ|採点のための正解順に選択肢を並べた配列。|
|**回答**|アレイ|Formsからの回答を配列として取得するためのハコ。|

### 変数の詳細：カウンタ
のちのDo untilのループで使用します。
Power Automateでは、*Array?[index]* の形式で配列から値を取り出すことができますが、*index* は0始まりとなるため、**カウンタ** の初期値も0にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/09434818-1a7f-f054-660b-4c272b533833.png)


### 変数の詳細：正解
Formsの応答からは、正解の情報を取得することができないので、フローの中でベタ打ちしています。
きちんと正解順になるように設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/8e22d564-2c7f-e242-6605-88ad3174fb8b.png)

### 変数の詳細：回答
Formsの応答から回答を取得しますが、取得できる回答は半角カンマ(,)区切りの単純なテキストです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b1395af5-8f3a-9370-91fb-15fc7379dcff.png)

そのため*split* 関数で配列に直して変数に入れておきます。
関数を入力する際は、動的な値から選択すると簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/69ae6e77-89bb-d9f0-c730-96ba5ac02d36.png)
結果がこのように配列として取得できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/23ef52b0-d522-8996-5ddb-d07117834107.png)

:::note warn
注意
回答選択肢の中にカンマを含む場合は、splitで単純には分割できなくなってしまいます。
フローが複雑になってしまうので、可能な限りカンマを含まないようにForms側で注意しましょう。
:::

## ループ処理(採点)
このフローの肝の部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c175f021-7a4d-87d2-9855-ed578b233635.png)

### 終了条件
ループの最後に**カウンタ** 変数を1増やすアクションを設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/1f798dc4-b857-b371-4509-1ab61d3b6a16.png)

**カウンタ** 変数がクイズの選択肢の数を上回ったときに処理を終了すればいいので、**正解** 変数の要素数と比較すればよいわけです。
*length* 関数で要素数を取得することができますが、要素数は1始まり・カウンタは0始まりと差があるため、「次の値に等しい」という条件でOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f7cc9daa-2f70-c803-8075-4169051b62ce.png)

### 配列からi番目の値を取り出す
前述のとおり、*Array?[index]* の形式で配列から値を取り出すことができますので、以下のように**カウンタ** を使って値を取り出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/eb62a843-1582-f76e-8c23-3b4c85004b68.png)

### 条件分岐
先ほど取得したi番目の値を比較し、正解と回答が一致しているか？を条件にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/8bd188e8-10ec-d046-c1a3-cf764bd5688f.png)

正解不正解を**メッセージ** に記録するとともに、一致している場合は**得点** を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/a5c34141-0431-6adb-0374-caa863ecf2b9.png)



## 採点結果の通知
最後に結果を通知して終了です。
HTML入力のテキストはフローの編集の際に壊れがちなので、一度作成アクションでメッセージ全文を作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/447ac1ac-29da-efb3-ae86-12defefdadef.png)


# 最後に
このフローをgithubに公開しています。
参考になれば幸いです。

https://github.com/ksgiksg/Power-Automate/blob/main/%E4%B8%A6%E3%81%B3%E6%9B%BF%E3%81%88%E3%82%AF%E3%82%A4%E3%82%BA%E3%81%AE%E6%8E%A1%E7%82%B9_20230218135606.zip

以上