【Google Apps Script (GAS)】Googleフォームでアップロードするファイルのファイル名を変更する方法

2019年2月17日Google Apps

Googleフォームにてファイルをアップロードすることができます。

アップロードしたファイルはGoogleドライブに保存されますが、この時のファイル名をアップロードと同時に変更してしまおうというのが今回紹介するスクリプトの処理内容です。

例として、動画をアップロードし、アップロードしたファイルのファイル名を「氏名 + 年月日時分秒」のファイル名に変換するようにします。

Googleフォームを準備

スポンサーリンク

まずはGoogleフォームを準備します。
作成方法についてはこちらの記事を参照ください。

入力欄としては「氏名」と「動画のアップロード欄」を用意します。

準備ができたら、「スクリプトエディタ」を開き、スクリプトを記述します。

スクリプトエディタでスクリプトを記述する

右上の「その他」メニューからスクリプトエディタを選択し、エディタ画面を開きます。
「myFunction」という関数の中に下記の処理を記述します。

Googleフォームから回答情報を受け取るために「myFunction」の引数にeを追加します。

function myFunction(e) {
  var itemResponse;
  var fileName;
  var movie;
  
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();
  
  // お名前の回答結果を取得する
  itemResponse = itemResponses[0];
  fileName = itemResponse.getResponse() + '_' + dateToStr24HPad0(new Date(), 'YYYYMMDDhhmmss');
  
  // 投稿動画の回答結果を取得する
  itemResponse = itemResponses[1];
  movie = DriveApp.getFileById(itemResponse.getResponse());
  movie.setName(fileName);
}

/**
 * 日付をフォーマットする
 */
function dateToStr24HPad0(date, format) {
    
  if (!format) {
  // デフォルト値
    format = 'YYYY/MM/DD hh:mm:ss'
  }
    
  // フォーマット文字列内のキーワードを日付に置換する
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2));
  format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2));
  format = format.replace(/hh/g, ('0' + date.getHours()).slice(-2));
  format = format.replace(/mm/g, ('0' + date.getMinutes()).slice(-2));
  format = format.replace(/ss/g, ('0' + date.getSeconds()).slice(-2));
    
  return format;
}

日付をフォーマットする処理を関数化(15行目:dateToStr24HPad0())して見やすくしています。

処理の解説

スポンサーリンク

処理の流れは、

「回答データを取得する」

「回答データから氏名を取得する」

「氏名 + 年月日時分秒をfileNameの変数に格納する」

「回答データから動画を取得する」

「動画のファイル名をfileName(氏名 + 年月日時分秒のこと)に変更する」

となっています。

回答データを取得する

  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();

e.response.getItemResponses()でフォームの「お名前」「投稿動画」の回答を配列で取得しています。

回答データから氏名を取得する

  // お名前の回答結果を取得する
  itemResponse = itemResponses[0];

回答データの配列[0]に「お名前」に関する回答結果が格納されているのでそれを取得します。

氏名 + 年月日時分秒をfileNameの変数に格納する

  var fileName;
  :
  :
  fileName = itemResponse.getResponse() + '_' + dateToStr24HPad0(new Date(), 'YYYYMMDDhhmmss');

処理の先頭で「fileName」という変数を宣言しておき、後にその変数に「氏名 + '_’ + 年月日時分秒」を設定しています。

回答データから動画を取得する

  var movie;
  :
  :
  // 投稿動画の回答結果を取得する
  itemResponse = itemResponses[1];
  movie = DriveApp.getFileById(itemResponse.getResponse());

回答データから氏名を取得すると同じ方法で投稿された動画を取得します。

動画は投稿された時にはGoogleドライブに格納されていますので、itemResponses[1]で取得する際はファイルのIDが取れます。
ファイルIDからDriveAppオブジェクトのgetFileById()メソッドを使って格納された動画ファイルオブジェクトを取得します。

「動画のファイル名をfileName(氏名 + 年月日時分秒のこと)に変更する」

  movie.setName(fileName);

最後に取得した動画ファイルのファイル名を変更します。

トリガー設定

トリガーを「フォーム送信時」に実行するように設定することで、動画投稿と同時に「氏名 + 年月日時分秒」のファイル名に変更することができます。

注意点

スポンサーリンク

Appの使用承諾

このプログラムを動作させるには、「DriveApp」と「FormApp」の使用を承諾しないといけません。

DriveAppはトリガー設定時にポップアップで案内が出るので良いのですが、FormAppの方はログを見て初めて気付きました。

FormAppは一度ソースコードに直接「FormApp.create(“")」と書いてしまって承諾した後に削除するとうまくいきます。