Google Form への自動回答（応答）を Power Automate で実装する

# 2023/04/10 追記

本記事では、有償プランでのみ利用可能な「HTTP コネクタ」を利用していますが、
```「OneDrive for Business」コネクタの「URL からのファイルのアップロード」```を利用することで、
for 365の範囲（つまり有償プランなし）実現可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/e6a89b2f-53bb-e16e-bd68-c3cdca30e514.png)

[Hiroさん](https://twitter.com/mofumofu_dance)（@h-nagao）のブログをご参照ください。すごいです。ありがとうございます。

https://qiita.com/h-nagao/items/65f498d9d4e4f1a5fa50

# はじめに

最近は、朝の出席連絡をGoogle Formで回答する学校が増えてきているようです。
時勢がら、検温及び健康チェックをし、登校前にフォーム経由で学校へ連絡する仕組みです。
こういった効率化は素敵だと思います。

弊宅の子供が通う学校でもこのシステムが採られています。
有難いことに毎日元気に登校してくれるので、回答の大部分は「元気です！」「登校可能です！」です。
のような毎朝の定型作業となると、フォームへの回答を自動化したくなるのはPower Platform好きの性、よってPower Automateで実現してみました。


# 注意

~~今回利用する、「HTTP コネクタ」はプレミアムコネクタです。
有償プランもしくは、[開発者向けプランを](https://powerapps.microsoft.com/ja-jp/developerplan/?msclkid=14848bb0b02c11ec90c214e204fe7006)をご利用ください。~~

```「OneDrive for Business」コネクタの「URL からのファイルのアップロード」```を利用することで、プレミアムコネクタの利用を回避可能です。
本blog冒頭をご参照ください。


# Google Form 自動応答の仕様

Power Automate による、Google Form 自動応答フローを作成します。

Google Form へは Getリクエストで回答します。
回答内容は、GETリクエストのデータURLの後ろに ? でつなげ、回答毎に「質問のID=回答内容」の形式を &　結合します。 

```
https://docs.google.com/forms/d/e/[ﾌｫｰﾑID]/formResponse?entry.[質問のID]=[質問の回答]&entry.[質問のID]=[質問の回答]&entry.[質問のID]=[質問の回答]
```
という形式です。

# Google Form 自動応答のリクエストURLの作成

自動回答に必要な情報は下記の2つです。

* フォームのURL
* 各質問のID

自動回答対象のフォームのURLは以下のようになっているはずです。

```
https://docs.google.com/forms/d/e/[フォームID]/viewform
```

取得したURLの末尾を"formResponse"に変更します。

```
https://docs.google.com/forms/d/e/[フォームID]/formResponse
```

次に、自動回答対象のGoogle フォームを開いたブラウザでF12キーを押下し、開発者ツールを起動します。
Ctrl-Fで検索ツールを開き、"entry."で検索すると、

```
name="entry.[質問のID]" value="=[質問の回答]"
name="entry.[質問のID]" value="=[質問の回答]"
name="entry.[質問のID]" value="=[質問の回答]"
```

の要素が並んでいる箇所が見つかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/0d5d7c99-b433-19c5-a0fc-707dac5f8f89.png)

この要素を、? から続く"entry.[質問のID]=[質問の回答]" のパラメータに変換し & で繋げていきます。
**実際には　"いない" などの2バイト文字にはURLエンコードする必要があります**

```
https://docs.google.com/forms/d/e/[ﾌｫｰﾑID]/formResponse
?entry.126758984=9901
&entry.234969339=いない
&entry.436601476=出席
&entry.985114939=のどが痛い
&entry.985114939=気持ちが悪い
&entry.1014231498=ない → 質問5へ
&entry.2084789122=37.0℃未満
```

:::note warn
この"entry."という質問ID群の記載順は、フォーム上の質問の並びと一致していません。
フォームに回答を入力すると、開発者ツール側の"Value"の値も変動します。
各質問に対するIDの取得時に利用しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/f061abd8-49fa-09f6-0a5b-91e905311685.png)
:::

:::note info
チェックボックスに対して複数の回答をチェックする場合は、選択する回答毎にパラメータを繋げます。
同一質問IDのパラメータが複数並ぶ形式となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/fd4b3f6f-bd33-cd00-4309-138445d78e44.png)

このような場合は、以下のような記載となります。
**実際には"発熱"などの2バイト文字にはURLエンコードする必要があります**

```
&entry.249713034=発熱
&entry.249713034=せきがでる
&entry.249713034=のどが痛い
```

:::


# Power Automate 自動応答の仕様

フローの全体図になります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/1732354e-e62c-cf8b-0aaf-cedb2d367230.png)


トリガーは、
「自動化したクラウドフロー」によるタイマー実行（毎朝）で完全自動化しても良いですし、
「インスタントクラウドフロー」による手動実行を、以下のように Power Automateアプリ（モバイルデバイス版）から起動、も良いと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/206cd5f5-d462-3d46-6796-57756b404112.png)


回答に英数字以外が含まれる場合は、URLエンコードしてください。
uriComponent()関数を利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/1d05722d-8f75-f0ac-1455-5129a3b20bb8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/427a7c1e-8889-3c25-338b-5120b9de3c63.png)

最後に Google Form へのGETリクエストします。
HTTPアクションで、以下設定を行います。
URIには、concat()関数で作成したリクエストURLを設定します。


![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/9af2b35f-995c-9d4d-4095-3a13eba67752.png)


```
concat('https://docs.google.com/forms/d/e/[ﾌｫｰﾑID]/formResponse',
'?entry.[質問のID]=',outputs('作成'),
'&entry.[質問のID]=',outputs('作成_2'),
'&entry.[質問のID]=',outputs('作成_3'),
'&entry.[質問のID]=',outputs('作成_4'),
'&entry.[質問のID]=',outputs('作成_5'),
'&entry.[質問のID]=',outputs('作成_6')
)
```


# 動作

Google Formへのリクエストが成功すると、StatusCode 200 が返ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/0c9d0217-bd8a-3a26-e5f3-416bccf2dec0.png)

存在しない質問IDを指定したり、回答必須の質問に返答しない場合は StatusCode 400 が返ってくるようです。



# まとめ
　
* Google Form に対し、Power Automate でGETリクエストを投げる事で回答が可能
* 回答内容は、リクエストURLにパラメータで指定
* フォームの各質問にはIDが割り振られているため、ブラウザの開発者ツールで調べる必要あり


朝の忙しい時間には、こういった効率化で時短していきましょう！