今回は、Googleフォームの複数の添付ファイルを、Googleドライブ上の任意の場所にフォルダを自動作成して保存する方法についてご紹介します。
その前に、
・Googleフォームの回答内容を好みの形でスプレッドシートに集計する方法
・Googleドライブでのフォルダの作成方法やフォルダのIDの取得方法
・スプレッドシートIDの取得方法
・日時の取得方法
などについてはこちらの記事をご参照ください。
(今回はフォルダとファイル周りがメインになります)




Googleフォームの添付ファイルを、任意の場所にフォルダを作成して保存する
それでは、こちらのサンプル1を元にご紹介します。
・サンプル1
function form(e) { var timeStamp = e.namedValues[“タイムスタンプ”]; //フォームからタイムスタンプを取得 var ss_id = ‘[ここにスプレッドシートのIDを記載]’; //スプレッドシートのIDを指定 var file = String(doc); //フォームのファイル情報(URL)を文字列に変換 if (file != ”){ //添付ファイルがある場合(変数fileが空欄ではない場合) var now = new Date(); var ary = file.split(‘, ‘); //フォームのファイル情報(URL)をカンマで区切って配列に格納 var folderid = ‘[ここに保存先フォルダのIDを記載]’; //保存先フォルダのIDを指定 var flag = 0; //変数flagにいったん0を代入 if ( folder_childs.hasNext() ){ //取得した子フォルダ一覧の中で、子フォルダがある場合 while ( folder_childs.hasNext() ){ //取得した子フォルダ一覧の中で、まだnextで未取得のフォルダがあるか確認 if (flag == 0){ //変数foldernameと同名フォルダが子フォルダになかった場合 var newfolder = storagefolder.createFolder(foldername); //変数foldernameの名称でフォルダ作成 } else if (flag == 1) { //変数foldernameと同名フォルダが子フォルダにある場合 var newfolder = storagefolder.getFoldersByName(foldername).next(); //存在していたフォルダを取得 } }else{ //取得した子フォルダ一覧の中で、子フォルダが存在しなかった場合 var newfolder = storagefolder.createFolder(foldername); //変数foldernameの名称でフォルダ作成 } var fileid = []; //ファイルID用配列 for (var i = 0; i < count; i++) { //ファイル保存の繰り返し処理開始 fileid.push(ary[i].replace(‘https://drive.google.com/open?id=’, ”)); //配列にファイルIDを格納 filename.push(DriveApp.getFileById(fileid[i])); //配列にファイルを取得して格納 outputfilename.push(filename[i].getName()); //配列に保存用ファイル名を格納 } var newfolderurl = newfolder.getUrl(); //保存先フォルダのURLを取得 } else if (file == ”) { //添付ファイルがない場合(変数fileが空欄の場合) var newfolderurl = ‘ファイルなし’; //変数newfolderurlに「ファイルなし」の文字列を代入 } sh.getRange(last_row + 1, 1).setValue(timeStamp); //フォームから取得したタイムスタンプをシートに記入 } |
フォームやシートを用意する
上記のサンプル1についてご紹介する前に、まず下記のようにフォームやシートを用意します。

書類提出フォーム

提出リストシート
Googleフォームの添付ファイルを、任意の場所にフォルダを作成して保存する
フォームの回答内容の取得方法についてはこちらの記事をご参照いただくとして、

さきほどのサンプル1のスクリプトについてご説明しますと、
var file = String(doc)
では、フォームから取得した添付ファイルの情報を、
String()
でいったん文字列に変換し、変数fileに代入しています。
次に、
if (file != ”){
で、変数fileに値が代入されているか否かを判定し、値が入っている場合は、
var now = new Date();
var foldername = Utilities.formatDate(now, “JST”,”yyyyMMdd”);
で変数foldernameにyyyyMMdd形式の日付を代入します。
(今回作成するフォルダ名は日付とします)
var ary = file.split(‘, ‘);
は、
split()
で変数fileに格納されているファイル情報をカンマで区切り、配列変数aryに格納します。
var count = ary.length;
では、添付ファイルの数をカウントしています。
var folderid = ‘[保存先フォルダのIDを記載]’;
はファイルを保存するためのフォルダを作成したい場所のIDを記載し、
var storagefolder = DriveApp.getFolderById(folderid);
でファイルを保存するための場所を取得して変数storagefolderに代入しています。
var folder_childs = storagefolder.getFolders();
では保存先フォルダ内の子フォルダ一覧を取得します。
var flag = 0;
は、フォルダ有無の情報を受け渡すためのフラグです。
if ( folder_childs.hasNext() ){
で子フォルダがあるかどうかを判定し、
while ( folder_childs.hasNext() ){
var folder = folder_childs.next();
if ( folder.getName().indexOf(foldername) != -1 ){
flag = 1;
}
}
では変数foldernameと同名フォルダが子フォルダにある場合は変数flagに1を代入しています。
if (flag == 0){
は上記で子フォルダがなかった場合(flagが0の場合)の処理で、
var newfolder = storagefolder.createFolder(foldername);
var newfolderid = newfolder.getId();
で変数foldernameの名称でフォルダ作成し、IDを取得しています。
else if (flag == 1){
は上記で子フォルダがあった場合(flagが1の場合)の処理で、
var newfolder = storagefolder.getFoldersByName(foldername).next();
var newfolderid = newfolder.getId();
で存在していたフォルダを取得し、IDを取得しています。
次の
}else{
var newfolder = storagefolder.createFolder(foldername);
var newfolderid = newfolder.getId();
はそもそも子フォルダ自体がなかった場合の処理で、変数foldernameの名称でフォルダ作成し、IDを取得しています。
次に、
var fileid = [];
はファイルID格納用の配列、
var filename = [];
はファイル格納用の配列、
var outputfolder = DriveApp.getFolderById(newfolderid);
でファイル保存用に作成したフォルダの場所を取得し 、
var outputfilename = [];
はファイル保存時のファイル名格納用の配列となります。
for (var i = 0; i < count; i++) {
では添付ファイルの数だけ処理を繰り返します。
fileid.push(ary[i].replace(‘https://drive.google.com/open?id=’, ”));
は、配列変数aryに格納したファイル情報から「https://drive.google.com/open?id=」の文字列を置換で削除し、 配列変数fileidにファイルIDを格納します。
filename.push(DriveApp.getFileById(fileid[i]));
は、配列変数filenameに、ファイルを取得して格納します。
outputfilename.push(filename[i].getName());
は、配列変数filenameから
getName()
でファイル名を取得し、配列変数outputfilenameに保存用のファイル名を格納します。
filename[i].makeCopy(outputfilename[i], outputfolder);
は、配列変数filenameに格納されているファイルを、
makeCopy()
で変数outputfolderの保存場所に、変数outputfilenameのファイル名で保存し、これらの処理を、添付ファイルの数だけ繰り返します。
そして
var newfolderurl = newfolder.getUrl();
で、保存先フォルダのURLを取得します。
} else if (file == ”) {
var newfolderurl = ‘ファイルなし’;
は添付ファイルがない場合(変数fileが空欄の場合)の処理で、シートに記載するための変数newfolderurlに「ファイルなし」の文字列を代入します。
Googleフォーム上で添付ファイルを必須にすればこの処理は不要なのですが、今回は一例として入れてみました。
最後に、
sh.getRange(last_row + 1, 1).setValue(timeStamp);
sh.getRange(last_row + 1, 2).setValue(name);
sh.getRange(last_row + 1, 3).setValue(newfolderurl);
sh.getRange(last_row + 1, 4).setValue(comment);
で、タイムスタンプ、氏名、ファイル保存先URL、コメントの各情報をシートに記入します。
また、トリガーの設定も必要になりますので、設定方法についてはこちらの記事をご参照ください。

実行結果
スプレッドシートへの記入結果や、Googleドライブへのファイル保存結果は下記のようになります。
添付ファイルがない場合は、C列に「ファイルなし」と記載されます。
また今回は、マイドライブに「テスト」というフォルダを手動で作成し、そこに日付フォルダを自動で作成し、「テストファイル1」と「テストファイル2」のエクセルファイルを保存する形でテストしました。

提出リストシート 実行結果

Googleドライブ保存結果