リストフォームとSharePoint REST API を組合せて、「その他」でも表記ゆれしにくいアンケートを実施する

# はじめに
Microsoft の機能でアンケートと言えば、**Microsoft Forms** を使用するのが一般的でしょう。

Formsでは、選択式の質問でも「その他」で自由に回答してもらうことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/62d52f25-bc1c-243b-7383-ee0e3c0e99d0.png)

ただし、「その他」は回答者の匙加減によるところが大きいので、例えば同じ内容でも下記のように**表記ゆれ**が発生してしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/24803d26-28cd-7260-71b6-ca37d704c5c7.png)

後から集計しようと思うと、この表記ゆれには困らされますよね。
今回は、Formsではなく、新しく使えるようになったMicrosoft Lists/SharePoint Listの`フォーム`機能使って、この問題に対処できないか考えてみました。

# Lists のフォーム機能
先ほどの例と同じ回答ができるように、選択肢列を用意したリストを用意しました。
`値を手動で追加できます`にチェックを入れることで、「その他」のようなあらかじめ選択肢に用意されていない値を登録できる設定になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/80ee5c02-5c60-1cd1-759a-8e6e42aaeb00.png)

このリストに直接回答を登録できるフォームを作成しましょう。
リスト上部のメニューから`フォーム`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ff909e8d-d51a-69a8-bd11-51d1010cb1eb.png)

新しいフォームを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/cdf6857d-7469-7eff-733a-8160ddd9e138.png)

リストの列を使って、そのままアンケートに使用できるようなフォームを作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/7f1bc0d7-72af-c5ac-2a69-63ef02a4794d.png)

フォームのタイトルを設定したり、不要な`タイトル`列を削除したりして整えました。
ちなみに、このフォームの画面で選択肢を追加したり設定を変更すると、フォームを使用するタイミングに限らず、リストの列の設定として変更が反映されます。（回答必須にしておきました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/36a4e756-2593-a407-99e6-ddfcf3e6f7f3.png)

プレビューから確認すると、このようにその他の値も登録できることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/4d5107a7-afaf-b76e-4354-57ee46ccb0f1.png)

:::note warn
現在、このフォームに回答できるのは同じ組織のユーザーのみです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/cd6aa8dc-5724-febd-d239-4a438c4c22a1.png)

組織外のユーザーに対するアンケートには使用することができません。
※Forms の下記設定と同等です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/89a27ff4-c036-e6fe-7518-0b900a2f7c07.png)
:::

# 「その他」回答があったら、新たに選択肢を追加する
では、このフォームを使って、`用意した選択肢にない回答があった場合、新たに選択肢に登録する`というフローを作成します。

例えば、誰かが選択肢にない「犬」という回答をした場合、リストの設定を変更して、選択肢に「犬」を登録するというようなフローです。こうすることで、以降の回答者は、用意された選択肢の「犬」を選んで回答することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/fa72b2a5-b470-84ec-966d-4b1d5245d223.png)

## SharePoint REST API
フォームの設定はリストの設定と連動しています。
なので、直接フォームを編集しなくても、列の設定（選択肢）を変更できれば目的は達成できます。

前回の記事で、SharePoint REST API を使用して、Power Automate で選択肢を編集する方法を説明しています。

https://qiita.com/ksgiksg/items/0c82d16cc1938d73b877

この方法を応用して、新しい回答をトリガーに、新たな選択肢を追加するフローを組み立てます。

# フローの作成
流れとしては、
1. 新たな回答をトリガーにする
1. リストの設定を確認して選択肢を調べる
1. 回答が既存の選択肢に含まれるかを調べる
1. 含まれていない場合は選択肢を追加する

という順序になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/de5f022a-ae50-fe25-140c-4805eb20c7dc.png)

## ①新たな回答をトリガーにする
トリガーはSharePoint コネクタの`項目が作成されたとき`を使用します。
「フォームに回答があった＝リストに項目が登録されたとき」に動くフローになります。

注意点として、このトリガーは定期的に新たな回答がないか確認しに行くような動作になりますので、短期間に連続で回答があった場合には、新たな選択肢がまだ登録できていない可能性もあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/4c425be1-9e01-5f8a-cf04-26c0c2c8f038.png)

https://tana-techlog.net/?p=201

## ②リストの設定を確認して選択肢を調べる
前回説明したように、API を使用して選択肢を調べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/fb3986cd-f0d5-0924-fee1-94cec5d08f7b.png)

https://qiita.com/ksgiksg/items/0c82d16cc1938d73b877

ついでに、調べた選択肢を変数に格納しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/9c85a330-a24b-2cc1-7fee-3b295ab31ea8.png)

```powerfx:変数の初期化
body('SharePoint_に_HTTP_要求を送信します-選択肢の取得')?['d/Choices/results']
```

## ③回答が既存の選択肢に含まれるかを調べる
条件を使って、すでに選択肢に含まれているかどうかを調べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/a3dcc9cd-16bc-e29d-962e-d80ef0813b37.png)

```powerfx:条件
{
  "contains": [
    "@variables('Choices')",
    "@triggerBody()?['favorite']?['Value']"
  ]
}
```


含まれていて登録する必要がなければ、そこでフローを中断するようにしています。

https://wataruf.hatenablog.com/entry/2023/01/08/000000

## ④含まれていない場合は選択肢を追加する
登録するための、更新後の選択肢を作成します。
既存の選択肢に、新たな「その他」回答を加えて配列変数を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/06e86b4b-baf0-98d4-f148-a5120aa283a4.png)

登録したい内容が作成できたら、APIを使って選択肢の設定を更新します。
前回の記事で説明した内容ですが、違いはボディに先ほど用意した変数を使っているところです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f32893f2-fe3b-9a5f-107e-a7e0076ddb3f.png)

これでフローは完成です。

# おわりに
Lists の新しい機能である、フォームを活用した方法を紹介しました。

基本的には、この機能は、FormsとListsの転記作業を行っていたフローがいらなくなるという、Power Automate の使用頻度を減らすアップデートだと思います。
本来の意図とは違うことをしていますが、新たな機能ができれば新たな使い方ができるんじゃないか！と考えてみた結果の1つのソリューションでした。

Microsoft は多数のアプリや機能があり、それを組み合わせて使うことでとても多くのことができるサービスです。
この応用力がSaaS時代の武器にもなりますので、みなさんもいろいろと組み合わせて面白いものをつくってみてください！