Googleフォームアップデートに関わるGASの検証（2016）

#2016年のフォームアップデート内容

Googleフォームがアップデートされ、画像・動画の表示とファイルアップロード（G Suiteのみ）が出来るようになりました。

・Google フォームで質問や回答に画像を追加できるようになりました
https://gsuiteupdates-ja.googleblog.com/2016/08/google_23.html

・G Suite でより速く目標に到達するための 5 つの新しい方法（※3節目でフォームでのファイルアップロードについて言及）
https://gsuiteupdates-ja.googleblog.com/2016/10/g-suite-5.html


#画像・動画フィールドを扱う

##フィールドを取得する

これまでの他のフィールドと同じく、getItemで取得したItemをasImageItem,asVideoItemとして取得できます。
[ImageItem](https://developers.google.com/apps-script/reference/forms/image-item "ImageItem"),[VideoItem](https://developers.google.com/apps-script/reference/forms/video-item "VideoItem")それぞれのリファレンスを読むとわかりますが、画像の方はgetImage()で取得可能ですが、動画はなぜか動画URLを取得するメソッドがないようです…。

```code.gs
var form = FormApp.getActiveForm();

var imageItem = form.getItems(FormApp.ItemType.IMAGE)[0].asImageItem();
Logger.log(imageItem.getTitle());
  
// FormApp.ItemTypeの中にVIDEOはない模様（2016/11/25時点）
var videoItem = form.getItems()[2].asVideoItem();
Logger.log(videoItem.getTitle());
```

##フィールドを追加する

こちらも同じようにaddImageItem,addVideoItemで追加します。

```code.gs
var form = FormApp.getActiveForm();

var blob = UrlFetchApp.fetch("https://www.google.co.jp/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png").getBlob();
form.addImageItem().setTitle("画像フィールド").setImage(blob);

form.addVideoItem().setTitle("動画フィールド").setVideoUrl("https://www.youtube.com/watch?v=kczb7IJJg0g");
```


動画フィールドはYoutubeの動画URLしかサポートしていません。
Youtube動画URLでない場合、エラーが発生します。
この場合フィールド自体は追加されて「動画URLが無効」の状態になっています。

```code.gs
// Youtube動画URLでないため、エラーを吐いて落ちる
form.addVideoItem().setVideoUrl("https://www.google.co.jp");
```

画像フィールドはフィールドを追加したあとに画像をセットしないとフォームが開けなくなります。
追加した直後に、フォームの編集画面が画像フィールドでローディング状態になっているときならそのフィールドを削除することで回避できますが、フォームを閉じてしまうと再度開いたときに「内部エラーが発生しました」と表示され、一切フォームをいじれなくなってしまいます。

```code.gs
// setImageをしないとフォームが壊れて開けなくなる
form.addImageItem();
```

#ファイルアップロードについて

##ファイルアップロードの仕様
フィールドの追加で「ファイルのアップロード先」を選ぶと、ファイルフィールドが追加できます。

アップロードされたファイルはフォームオーナーのGoogleドライブにアップロードされます。
Googleドライブ内のフォームと同じディレクトリに「フォーム名（File Response）」というフォルダが作成され、その下に更にフィールド名のフォルダが作成され、その中に格納されます。
また、ファイル名の末尾にアップロードしたユーザーの名前が付加されます。

##ファイルフィールドの仕様
各フィールドに対し、ファイルの最大数、最大ファイルサイズ、許可するファイル形式を設定できます。
![up1.png](https://qiita-image-store.s3.amazonaws.com/0/7695/9a91eb46-5765-62f3-eb53-31c50ae73ecd.png)
![up2.png](https://qiita-image-store.s3.amazonaws.com/0/7695/af1a3c42-2dc7-1a4b-e8e4-924cc4fe696c.png)
![up3.png](https://qiita-image-store.s3.amazonaws.com/0/7695/f2e6ea0c-c3ac-9d2c-9c11-668331f070dd.png)  

ちなみにG Suite Business（Unlimited）でない場合、ファイルサイズを10GBとかにするとドライブの容量に対する警告メールが来ますｗ

![容量.png](https://qiita-image-store.s3.amazonaws.com/0/7695/cb1fc9db-415d-60c8-808f-e9e7c4bbd101.png)

##アップロードされたファイルを扱う

ファイルフィールドはFormApp.ItemTypeの中に含まれておらず、そもそもFileFieldのようなクラスもないため、スクリプト上からファイルアップロードのフィールドを追加することは出来ません。
Form.getItemsから、インデックスやタイトルを使ってフィールドを取得し、そのResponse内容を使うことでアップロードされたファイルにアクセスできます。
  
Responseから取得される文字列はファイルのIdなので、DriveAppを使ってファイルを取得することが出来ます。

```code.gs
var form = FormApp.getActiveForm();
var res = form.getResponses()[0];
  
var id = res.getItemResponses()[0].getResponse();
var file = DriveApp.getFileById(id);
  
Logger.log(file.getName());
```
ちなみにフォームの回答の方にはアップロードされたファイルへのURLが記録されています。

#Reference
・Class FormApp
https://developers.google.com/apps-script/reference/forms/form-app