【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(“")」と書いてしまって承諾した後に削除するとうまくいきます。

1つの設問で複数のファイルをアップロードする対応(2021/05/05追記)

フジイダイスケ様よりコメントいただきました、複数ファイルアップロード時のファイル名変更の対応版です。

ファイル名の変更ルール:お名前_YYYYMMDDhhmmss_連番.拡張子

追加処理として、複数ファイルアップロード時のファイル名変更対応に加えて、ファイル名を変更した際に元ファイルの拡張子が消えてしまう問題がありましたので、元ファイルの拡張子を変更後のファイル名に追加するようにしております。

function myFunction(e) {
  var itemResponse;
  var fileName;
  var movie;
  var no = 1;    // ファイルアップロード時の連番
  
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();
  
  // お名前の回答結果を取得する
  itemResponse = itemResponses[0];
  fileName = itemResponse.getResponse() + '_' + dateToStr24HPad0(new Date(), 'YYYYMMDDhhmmss');
  
  // ファイルの回答結果を取得する
  itemResponse = itemResponses[1];
  itemResponse.getResponse().forEach(function( uploadFile ) {
    movie = DriveApp.getFileById(uploadFile);
    var ext = getExt(movie.getName());
    movie.setName(fileName + '_' + no + '.' + ext);
    no++;
  });
}

// フォーマットする自作関数
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;
}

// 拡張子を取得
function getExt(filename) {
    return filename.match(/[^.]+$/);
}

プログラム解説

複数のファイルがアップロードされた場合、ファイルの回答結果を取得する処理(itemResponse = itemResponses[1];)にてファイルIDの配列が取得できます。

あとはforEach文でファイル数だけリネームすれば対応可能です。