#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,VideoItemそれぞれのリファレンスを読むとわかりますが、画像の方はgetImage()で取得可能ですが、動画はなぜか動画URLを取得するメソッドがないようです…。
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で追加します。
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が無効」の状態になっています。
// Youtube動画URLでないため、エラーを吐いて落ちる
form.addVideoItem().setVideoUrl("https://www.google.co.jp");
画像フィールドはフィールドを追加したあとに画像をセットしないとフォームが開けなくなります。
追加した直後に、フォームの編集画面が画像フィールドでローディング状態になっているときならそのフィールドを削除することで回避できますが、フォームを閉じてしまうと再度開いたときに「内部エラーが発生しました」と表示され、一切フォームをいじれなくなってしまいます。
// setImageをしないとフォームが壊れて開けなくなる
form.addImageItem();
#ファイルアップロードについて
##ファイルアップロードの仕様
フィールドの追加で「ファイルのアップロード先」を選ぶと、ファイルフィールドが追加できます。
アップロードされたファイルはフォームオーナーのGoogleドライブにアップロードされます。
Googleドライブ内のフォームと同じディレクトリに「フォーム名(File Response)」というフォルダが作成され、その下に更にフィールド名のフォルダが作成され、その中に格納されます。
また、ファイル名の末尾にアップロードしたユーザーの名前が付加されます。
##ファイルフィールドの仕様
各フィールドに対し、ファイルの最大数、最大ファイルサイズ、許可するファイル形式を設定できます。
ちなみにG Suite Business(Unlimited)でない場合、ファイルサイズを10GBとかにするとドライブの容量に対する警告メールが来ますw
##アップロードされたファイルを扱う
ファイルフィールドはFormApp.ItemTypeの中に含まれておらず、そもそもFileFieldのようなクラスもないため、スクリプト上からファイルアップロードのフィールドを追加することは出来ません。
Form.getItemsから、インデックスやタイトルを使ってフィールドを取得し、そのResponse内容を使うことでアップロードされたファイルにアクセスできます。
Responseから取得される文字列はファイルのIdなので、DriveAppを使ってファイルを取得することが出来ます。
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