2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Google Apps ScriptAdvent Calendar 2016

Day 2

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

Posted at

#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を取得するメソッドがないようです…。

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
up2.png
up3.png

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

容量.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

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?