【Google Apps Script(GAS)】Googleフォームの複数の添付ファイルを、Googleドライブ上の任意の場所にフォルダを自動作成して保存する

今回は、Googleフォームの複数の添付ファイルを、Googleドライブ上の任意の場所にフォルダを自動作成して保存する方法についてご紹介します。

その前に、

・Googleフォームの回答内容を好みの形でスプレッドシートに集計する方法

・Googleドライブでのフォルダの作成方法やフォルダのIDの取得方法

・スプレッドシートIDの取得方法

・日時の取得方法

などについてはこちらの記事をご参照ください。

(今回はフォルダとファイル周りがメインになります)

【Google Apps Script(GAS)】Googleフォームの回答内容を、好みの形でスプレッドシートに集計する
今回は、Googleフォームの回答内容を、好みの形でスプレッドシートに集計する方法をご紹介します。 スプレッドシートからGoogleフォームを作成すると、「フォームの回答」というシートが自動で生成され、Googleフォームからの回...
【Google Apps Script(GAS)】フォルダの作成や削除
Google Apps Scriptではスプレッドシートの操作の自動化だけでなく、Googleドライブ上のフォルダ操作を自動化する事も可能です。 今回はGoogle Apps Scriptを使ってGoogleドライブ上にフォル...
【Google Apps Script(GAS)】スプレッドシートを、IDとシート名で指定する
Google Apps Scriptにおいて、スプレッドシートを、スプレッドシートに紐づけられているIDを使って取得するには下記スクリプトを使用します。 SpreadsheetApp.openById() ちなみにスプレ...
【Google Apps Script(GAS)】現在日時を指定した表示形式に変換して取得
Google Apps Scriptにおける、現在日時の取得と表示形式の変換方法についてご紹介します。 現在日時の取得と、表示形式の変換方法 Google Apps Scriptにおいて、現在日時を取得するには下記スクリプトを使...

※本ページはプロモーションが含まれています

スポンサーリンク
スポンサーリンク

Googleフォームの添付ファイルを、任意の場所にフォルダを作成して保存する

それでは、こちらのサンプル1を元にご紹介します。

・サンプル1

function form(e) {

var timeStamp = e.namedValues[“タイムスタンプ”]; //フォームからタイムスタンプを取得
var name = e.namedValues[“氏名”]; //フォームから氏名を取得
var doc = e.namedValues[“提出書類”]; //フォームから添付ファイルを取得
var comment = e.namedValues[“コメント”]; //フォームからコメントを取得

var ss_id = ‘[ここにスプレッドシートのIDを記載]’; //スプレッドシートのIDを指定
var sh_name = ‘提出リスト’; //スプレッドシートのシート名を指定
var sh = SpreadsheetApp.openById(ss_id).getSheetByName(sh_name); //シートを指定
var last_row = sh.getLastRow(); //最終行を取得

var file = String(doc); //フォームのファイル情報(URL)を文字列に変換

if (file != ”){ //添付ファイルがある場合(変数fileが空欄ではない場合)

var now = new Date();
var foldername = Utilities.formatDate(now, “JST”,”yyyyMMdd”); //フォルダ名には日付を取得して指定

var ary = file.split(‘, ‘); //フォームのファイル情報(URL)をカンマで区切って配列に格納
var count = ary.length; //ファイルの数(配列の数)をカウント

var folderid = ‘[ここに保存先フォルダのIDを記載]’; //保存先フォルダのIDを指定
var storagefolder = DriveApp.getFolderById(folderid); //保存先フォルダのURLを取得
var folder_childs = storagefolder.getFolders(); //保存先フォルダ内の子フォルダ一覧を取得

var flag = 0; //変数flagにいったん0を代入

if ( folder_childs.hasNext() ){ //取得した子フォルダ一覧の中で、子フォルダがある場合

while ( folder_childs.hasNext() ){ //取得した子フォルダ一覧の中で、まだnextで未取得のフォルダがあるか確認
var folder = folder_childs.next(); //フォルダを順番に取得
if ( folder.getName().indexOf(foldername) != -1 ){ //変数foldernameと同名フォルダが子フォルダにある場合
flag = 1; //変数flagに1を代入
}
}

if (flag == 0){ //変数foldernameと同名フォルダが子フォルダになかった場合

var newfolder = storagefolder.createFolder(foldername); //変数foldernameの名称でフォルダ作成
var newfolderid = newfolder.getId(); //作成したフォルダのIDを取得

} else if (flag == 1) { //変数foldernameと同名フォルダが子フォルダにある場合

var newfolder = storagefolder.getFoldersByName(foldername).next(); //存在していたフォルダを取得
var newfolderid = newfolder.getId(); //存在していたフォルダのIDを取得

}

}else{ //取得した子フォルダ一覧の中で、子フォルダが存在しなかった場合

var newfolder = storagefolder.createFolder(foldername); //変数foldernameの名称でフォルダ作成
var newfolderid = newfolder.getId(); //作成したフォルダの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=’, ”)); //配列にファイルIDを格納

filename.push(DriveApp.getFileById(fileid[i])); //配列にファイルを取得して格納

outputfilename.push(filename[i].getName()); //配列に保存用ファイル名を格納
filename[i].makeCopy(outputfilename[i], outputfolder); //ファイル保存場所に、保存用ファイル名でファイルを格納

}

var newfolderurl = newfolder.getUrl(); //保存先フォルダのURLを取得

} else if (file == ”) { //添付ファイルがない場合(変数fileが空欄の場合)

var newfolderurl = ‘ファイルなし’; //変数newfolderurlに「ファイルなし」の文字列を代入

}

sh.getRange(last_row + 1, 1).setValue(timeStamp); //フォームから取得したタイムスタンプをシートに記入
sh.getRange(last_row + 1, 2).setValue(name); //フォームから取得した氏名をシートに記入
sh.getRange(last_row + 1, 3).setValue(newfolderurl); //添付ファイルの保存先フォルダURLをシートに記入
sh.getRange(last_row + 1, 4).setValue(comment); //フォームから取得したコメントをシートに記入

}

フォームやシートを用意する

上記のサンプル1についてご紹介する前に、まず下記のようにフォームやシートを用意します。

書類提出フォーム

書類提出フォーム

 

提出リストシート

提出リストシート

Googleフォームの添付ファイルを、任意の場所にフォルダを作成して保存する

フォームの回答内容の取得方法についてはこちらの記事をご参照いただくとして、

【Google Apps Script(GAS)】Googleフォームの回答内容を、好みの形でスプレッドシートに集計する
今回は、Googleフォームの回答内容を、好みの形でスプレッドシートに集計する方法をご紹介します。 スプレッドシートからGoogleフォームを作成すると、「フォームの回答」というシートが自動で生成され、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 Apps Script(GAS)】Googleフォームの回答内容を、好みの形でスプレッドシートに集計する
今回は、Googleフォームの回答内容を、好みの形でスプレッドシートに集計する方法をご紹介します。 スプレッドシートからGoogleフォームを作成すると、「フォームの回答」というシートが自動で生成され、Googleフォームからの回...

実行結果

スプレッドシートへの記入結果や、Googleドライブへのファイル保存結果は下記のようになります。

添付ファイルがない場合は、C列に「ファイルなし」と記載されます。

また今回は、マイドライブに「テスト」というフォルダを手動で作成し、そこに日付フォルダを自動で作成し、「テストファイル1」と「テストファイル2」のエクセルファイルを保存する形でテストしました。

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

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

 

Googleドライブ保存結果

Googleドライブ保存結果

タイトルとURLをコピーしました