LoginSignup
2
2

More than 5 years have passed since last update.

GoogleAppsScriptでGoogleFormからアップロードされたファイルをあれこれする方法

Posted at

tl;dr

GoogleFormからアップロードされたファイルはGoogleDriveに管理されるが、そのファイルを使って添付メールを送るとか、何かしたいときの方法についてのメモ

通常のフォームの内容の受け取り方

まずは基本の受け取り方。

コード.gs
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();
  }
}

のように取得できる。

アップロードされたファイルで受け取ろうとすると...

コード.gs
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) で取得できる。

アップロードされた内容を区別する方法

コード.gs
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-typeEnum ItemType のようだが、ここには FILE_UPLOAD はない。FormApp.ItemType.FILE_UPLOADundefined になってしまう。

キャストして比較するしかないようだ。

結論

コード.gs

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]); とかで処理すれば良い
      }
    }
  }
}

上記のようにしてアップロードされたファイルを取得するのがスジのようです。

2
2
0

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