Power Automate を使って Microsoft Forms のアンケートをどこから答えたのかを特定してみる【#PowerAutomate】

# 概要

ポスターやイベント等で Microsoft Forms での利用で、毎回設問は同じなのに回答を分ける為にアンケートを作り直したり、コピーして複数作ったりしていませんか？そういった作業を Power Automate を組み合わせることで不要にし、どのアンケートを答えたのかをある程度特定します。
また、このやり方は非常に **汎用性の高い** ものになっている為、他にも様々な可能性があるやり方になっています。

本番稼働させる場合には Power Automate よりも Logic Apps の方が料金面や、動作速度の面、実行回数等を考慮するとおすすめです。（条件によります）

# 環境

- Microsoft Forms
- Excel Online
- Power Automate の Premiumコネクタが使えるライセンス（Power Apps Community Plan 等）（HTTPコネクタを利用する為）

[この手順](https://www.powerplatform.work/blog/2020/08/04/PowerApps%E3%82%92%E5%80%8B%E4%BA%BA%E3%81%A7%E7%84%A1%E6%96%99%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8B/)で環境を作成してもらうことで試すことは可能です。

# Microsoft Forms　の用意

重要な手順です。
作成する Forms のアンケートは
**Excel から Forms を作成します**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/a49c0cee-2fb7-a9c8-3a4b-f284a7ccf4ee.png)

この時、自動的に作成カラムされる、 **開始時刻** を後々特定に利用します。


# 保存先を用意

どこから答えたのかを保存するための保存先を用意します。
今回は簡易的に Excel を利用しますが、本番稼働させる場合には別途 SQLDB 等を用意するほうがいいかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/904296d6-4524-6c5f-4a2a-cb92b6b2f0e9.png)

必須なのは DateTime 列で他の列は特定したい値でテーブルを作成します。今回は Location を特定します。ほかには イベント名等が考えられるかもしれません。

# Power Automate の作成
フローの全容はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/6a8acbcb-cd6e-d58b-1a7a-ab801e253241.png)

それぞれを説明していきます。

## トリガー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/59401af9-4207-b8c1-18d7-fd69011ac599.png)

要求の トリガーを利用します。
似たものに HTTP のトリガーも存在しますが、そちらではない点に注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/75a25287-79cc-b579-65ff-f1ac580b4ed3.png)

relativePath を指定することで自動生成されるURLにパスを含めることができます。また指定しなかったとしても のちに query として取得できるのでこちらは設定しなくても問題ありません。（今回はサンプルのため両方使用する形になっています。）

## クエリやパスを取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/150af94e-fed0-ca24-0db7-b0680c73dbdf.png)
(値の見た目は実際には異なる場合がありますが、問題ありません)

トリガーによる値は 

```
triggerOutputs()
```
を使用することで取得可能です。
クエリを取得する場合は以下のように指定します。

```
triggerOutputs()['queries']?['クエリ名']
```

今回は queries の中の redirectURL を取得するので

```
triggerOutputs()['queries']?['redirectURL']
```
と指定しています。

また、relativePath に指定した Location の方も同様に

```
triggerOutputs()['relativePathParameters']?['location']
```

とすることで取得可能です。

## 応答

今回の特定は **開始時刻** を利用する為、できるだけ早く応答を返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/3b34f7a9-d0b6-2f45-980d-5653a0601390.png)



```html
<html>
<header>
<meta http-equiv="refresh" content="0;URL=variables('RedirectURL')">
</header>
</html>

```

meta タグで再表示を行い、指定したURLに対してリダイレクトを行っています。

また、HTML を変換する為、ヘッダーには text/html が指定しています。

## データを保存

最後に、取得した値を保存します。
ここで注意する点は、応答後のアクションです。
応答後のアクションは通常の構成ではスキップされてしまうため、実行の構成を以下のよう全てにチェックを入れるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/f9556715-00a0-b26f-26b2-64ab2d8e6551.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/e06abf96-1912-2b2d-f5b5-55e5ef896564.png)


保存する部分は適宜対応するアクションに変更してください。

以上で作成は完了です。

# 特定方法

実際に動かしてみましょう
URL は以下のようになるかと思います。

```
https://トリガーのURL&redirectURL=FormsのURL
```
location/ の後は自由に入れてみましょう

```
manual/paths/invoke/location/東京?api ~
```

上記のフローが正しく実行されると、以下のようにデータとして保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/51503e5e-22eb-b023-d0b2-5b8a446fa2ea.png)

注目する点は **開始時刻** と **DateTime** 列になります。
おそらく大体(前後 1~2秒程度)で揃っているはずです。（その為厳密なチェックは今回のロジックでは不可能です。）
あとはこれを Excel でも Power BI でも突き合わせるようにすれば特定が可能になります。

# まとめ

この方法を利用することで、アンケートをコピペすることなく、ある程度の特定が可能になります。アンケートを変更した際も redirectURL を変更したURLをQRコードなどで発行することで、フローの変更はする必要はないのは利点ではないでしょうか？（パラメータが変更の場合は修正が必要です。）

また、この方法はパラメータに様々な値を仕込むことができ、非常に汎用性が高いので、ぜひチャレンジしてみてください。


# 参考
こちらの Tweet を参考に作成しました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">パラメータを受け取れない <a href="https://twitter.com/hashtag/Forms?src=hash&amp;ref_src=twsrc%5Etfw">#Forms</a> なんだけど、どうしてもどっから呼ばれたとかパラメータが欲しくなる時もある。Forms Pro を使うのは高い。ならば、アタマを使おう！ということで、できました😁<br><br>たぶん動画を見るだけじゃわかんないと思いますが、考えてみてくださいー。そのうちわかります😎 <a href="https://t.co/P1Y7B71r90">pic.twitter.com/P1Y7B71r90</a></p>&mdash; Yugo Shimizu | Power BI MVP (@yugoes1021) <a href="https://twitter.com/yugoes1021/status/1291649925428609025?ref_src=twsrc%5Etfw">August 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>