tl;dr
GoogleFormからアップロードされたファイルはGoogleDriveに管理されるが、そのファイルを使って添付メールを送るとか、何かしたいときの方法についてのメモ
通常のフォームの内容の受け取り方
まずは基本の受け取り方。
function myFunction(e) {
var responses = e.response.getItemResponses();
var item;
for (var i = 0; i < responses.length; i++) {
item = responses[i];
// 質問項目の取得 item.getItem().getTitle();
// 質問の入力値 item.getResponse();
}
}
のように取得できる。
アップロードされたファイルで受け取ろうとすると...
function myFunction(e) {
var responses = e.response.getItemResponses();
var item;
for (var i = 0; i < responses.length; i++) {
item = responses[i];
console.log(item.getResponse());
}
}
ログには
[1Sc2Ekxsep23l5Zdiu9z_2-QTxOe42Jku, 1Zy85-9jTm7wvM8OJF7fhh0aBs0B0hA_F]
のような配列が入ってきたりする。(ファイルが二個アップロードされた場合)
これらは、GooleDrive上にアップロードされたファイルで、DriveApp.getFileById(id)
で取得できる。
アップロードされた内容を区別する方法
function myFunction(e) {
var responses = e.response.getItemResponses();
var item;
for (var i = 0; i < responses.length; i++) {
item = responses[i];
console.log(item.getItem().getType());
}
}
このように、getItem() して Item
を取得し、ItemType
からgetTypeすると、FILE_UPLOAD
というコンソール出力を得る。
しかし
https://developers.google.com/apps-script/reference/forms/item にあるように
// Cast the generic item to the text-item class.
if (item.getType() == 'TEXT') {
var textItem = item.asTextItem();
textItem.setRequired(false);
}
なぜか ==で
比較をしないと通らない様子。この item.getType() は typeof で調べると object
のようだ。
getType
で得られるのは、
https://developers.google.com/apps-script/reference/forms/item-type の Enum ItemType
のようだが、ここには FILE_UPLOAD
はない。FormApp.ItemType.FILE_UPLOAD
も undefined
になってしまう。
キャストして比較するしかないようだ。
結論
function myFunction(e) {
var responses = e.response.getItemResponses();
var item;
var files;
for (var i = 0; i < responses.length; i++) {
item = responses[i];
if (item.getItem().getType() == "FILE_UPLOAD") {
files = item.getResponse();
console.log(files);
for (var j = 0; j < files.length; j++) {
// files[j] を DriveApp.getFileById(files[j]); とかで処理すれば良い
}
}
}
}
上記のようにしてアップロードされたファイルを取得するのがスジのようです。