見出し画像

グーグルフォームで添付されたデータをさらりとリネームする方法

こんにちわ。

グーグルフォームすっごく便利。
もはや、アンケートとして使ってなくてデータ収集に用いてるよ。

今回はグーグルフォームの機能を利用してデータを収集したんだけど、ファイル名がぐちゃぐちゃだったんだよね。

フォームから取得するときにファイル名を変更するってやつはできるんだけど、取得後の変更をさらりとスマートにやりたいなって思ったんだよね。

■今回やったこと
 ・PDFのファイル名を、「お名前_PDF」 にする。
 ・参照元はフォームの内容が記載してあるスプレッドシート(※)

■概要
 ・対象数:50人
 ・対象ファイル数:不明
  ※PDFデータは必須ではない為、貰っていない人もいる

■悩んだこと
 ・同一人物が複数回提出してる

■解決策
 複数回提出した人は、最後に提出したデータが正しいデータとして、
 リネームする。

■フォーム

画像3


※スプレッドシートの内容(パンダとねことキジが重複してるよ)

画像2


■コード

function myFunction() {

//シートオブジェクトの取得
let sheetId = 'スプレッドシートID';
let sheetName = 'フォームの回答 1'; //フォームの回答が反映されるシート
let sheet= SpreadsheetApp.openById(sheetId).getSheetByName(sheetName);
//リネームした列を別シートに載せる
let uketsuke =SpreadsheetApp.openById(sheetId).getSheetByName('結果');

//シート全体を配列化
let values = sheet.getDataRange().getValues();

//先頭行(項目部分)を削除
values.shift();

//空の配列
let arr = [];

for(let i = values.length-1;  i >= 0; i--){
 //名前を取得
 let animal = values[i][1];
 //ファイルのパスを取得
 let filePath=values[i][3];

 //配列の中に同じ名前が無かったらarrの配列に入れる
 //arr.flat().includes(animal)は、arr内にanimalがあるか見ている
 //あったらtrue、無かったらfalseを返す。
 if(!arr.flat().includes(animal)){
   arr.push(values[i]);
   fileName = animal + '_PDF';
  let fileId = filePath.replace(/^.*\?id=/,'');
  let files = DriveApp.getFileById(fileId);
   //リネーム
  files.setName(fileName);
 }
}

//先頭行を追加
arr.unshift(['タイムスタンプ','名前','年齢','証明書保存先'])

uketsuke.getRange(1,1,arr.length,4).setValues(arr);

}


■解説
 まずは「フォームの回答1」と言うシートに載っている表をvaluesに格納
 表を下から読んでいくよ。
 ※下から読む理由
  複数回提出した人は、最後に提出したデータが正しいデータとしたから
 んで、arrっていう新しい配列を用意して、①arrに重複データがなければ、
 ②対象の列をarrにpush、③ファイルをリネームって流れにしたよ。

 リネームをしているのは、↓だよ。
  let fileId = filePath.replace(/^.*\?id=/,''); //無駄な情報を削除
  let files = DriveApp.getFileById(fileId); //ドライブのファイルを取得
  files.setName(fileName);                          //リネーム

 最後にarrの先頭行に項目を追加。arrを結果シートに転記

 結果シートはこんな感じ下から読んだから順番が逆になってるよ。

スクリーンショット 2022-03-18 22.53.55

ファイル名もきれいになりました。

スクリーンショット 2022-03-18 22.56.34

■まとめ
 フォームから取得するときにファイル名を変えちゃえばいいんだけど、
 やり忘れた時はこんな感じでやればいいね〜。

この記事が気に入ったらサポートをしてみませんか?