Google FormのファイルアップロードとGAS


アドベントカレンダーが同日2つ入れてしまって焦っている大橋です。

少し前にGoogle Formでファイルアップロードがサポートされましたね！
かなり欲しい欲しいと言われていた機能ですし、この機能が無いがためにGoogle Apps ScriptでUIを作るってのもよくありました。
この機能についてチャント把握していなかったので、触りながら理解をしていきたいと思います。


## 前提

Google FormのファイルアップロードはG Suite(旧Google Apps for work)でないと使えません。 
またファイルアップロードアイテムを追加した場合、必ず同一ドメイン内のユーザしか回答が行なえません。

外部向けのGoogle Formでは現状この機能が使えない点ということに注意してください。


## 追加の仕方

Google Formの質問追加先メニュー内に「ファイルのアップロード先」というメニューが出てきますのでそれを選択してください。

![Kobito.Y0a4f1.png](https://qiita-image-store.s3.amazonaws.com/0/2965/1a44c4e0-1c9d-89ef-ed10-fe621d2e4efe.png "Kobito.Y0a4f1.png")

## 設定できること

### タイトル・説明文

通常の質問と同様にタイトルと説明文が設定できます。
説明文を追加する場合は右下のメニューから「説明」にチェックを入れてください。

![Kobito.u1zJST.png](https://qiita-image-store.s3.amazonaws.com/0/2965/92ca301c-3fa9-74e0-6c06-de9ec69c2377.png "Kobito.u1zJST.png")

### ファイルの最大数・最大ファイルサイズ

ファイルの最大数はアップロード可能なファイルの数です。
最大ファイルサイズは1つファイルあたりの最大ファイルサイズです。

![Kobito.DLEaxS.png](https://qiita-image-store.s3.amazonaws.com/0/2965/909c7193-7aae-5d11-a534-351b8601dff9.png "Kobito.DLEaxS.png")


ファイルの最大数を1より大きく設定した場合、ファイルをアップロードしても最大数になるまでフォーム側に「ファイルを追加」リンクが表示されます。

![Kobito.sNdBlS.png](https://qiita-image-store.s3.amazonaws.com/0/2965/f277cb0f-ae11-ba76-cb65-acf6a3cb5688.png "Kobito.sNdBlS.png")

また最大ファイルサイズを超えるファイルをアップロードしようとした場合は以下のようにエラーが表示されます。

![Kobito.o7p0v5.png](https://qiita-image-store.s3.amazonaws.com/0/2965/f2d6d329-2080-eb75-19cd-f4bd2a6ad818.png "Kobito.o7p0v5.png")


### 許可するファイル形式

許可するファイル形式はアップロードを許可するファイル形式を選択できます。
例えば画像のみにするとアップロード時に画像以外のファイルを選択できなくなります。

![Kobito.NHoZDk.png](https://qiita-image-store.s3.amazonaws.com/0/2965/e1228b4b-7cad-6016-e0ff-7872f34496b4.png "Kobito.NHoZDk.png")

![Kobito.8oLsaL.png](https://qiita-image-store.s3.amazonaws.com/0/2965/a9ba4da6-0a26-04b6-29df-ebb9aa56b26b.png "Kobito.8oLsaL.png")

### 画像

キャプチャを取れなかったのですがタイトルの右側をマウスオーバーすると他の質問同様に画像が添付できます。

![Kobito.jieGob.png](https://qiita-image-store.s3.amazonaws.com/0/2965/ab828250-def8-4976-eb32-228f21f56e2c.png "Kobito.jieGob.png")


画像を添付すると質問内にも画像が表示されるようになります。

![Kobito.Gqq8LK.png](https://qiita-image-store.s3.amazonaws.com/0/2965/1e9e5ea5-7620-7026-b334-bbf994351e8d.png "Kobito.Gqq8LK.png")


## アップロード後の挙動

### ファイルの保存先

アップロードされたファイルはGoogle Driveに保存されます。
Google Formの編集画面で回答タブを選択すると、アップロードされたファイルが確認できます。

「フォルダを表示」リンクをクリックすればファイルが保存されたGoogle Driveフォルダを表示できます。

![Kobito.Qg0aMp.png](https://qiita-image-store.s3.amazonaws.com/0/2965/fb5744ff-2760-2335-cb7d-94ed715b6e52.png "Kobito.Qg0aMp.png")


今回確認した限りではファイルは「MyDrive/{フォーム名}(File responses)/{質問タイトル}(File Responses)」にアップロードされるようです。

アップロードされたファイル名を若干変更され「{元のファイル名} - {アップロードした人の名前}.{元のファイルの拡張子}」になるようです。
![Kobito.6J7uEL.png](https://qiita-image-store.s3.amazonaws.com/0/2965/037f9378-fb83-8adc-9563-4dc83cbfdbc4.png "Kobito.6J7uEL.png")

### GASの挙動

`onFormSubmit`トリガーを利用して、GAS側でアップロードしたItemReponseオブジェクトの結果を取得した場合、結果はGoogle DriveのファイルID配列として取得されます。

結果については仮にアップロードされるファイルが1つでも、必ず配列になるようです。

![Kobito.mrazNt.png](https://qiita-image-store.s3.amazonaws.com/0/2965/2348b2e5-7b9f-d8a4-02f3-2d70d6340e37.png "Kobito.mrazNt.png")

![Kobito.pqRpj9.png](https://qiita-image-store.s3.amazonaws.com/0/2965/3dfabc44-0349-bf30-9817-c03a1a25be77.png "Kobito.pqRpj9.png")


## まとめ・使い道

使い道はかなり多くあるように思います。
例えば社員全員の顔写真を集めて、AdminAPI経由でアカウントの顔に設定したり、
CSVをアップロードしてもらって、定期レポートを作成したりと、
GASのUIとしての役割をもたせることも可能になると思います。

願わくば外部からのアップロードも許可されるとなお良いのですが、セキュリティ的な部分で難しいのかもしれません。

GASのアドベントカレンダーなのにGASの話が殆どなかったですねスミマセヌ。