見出し画像

【GAS】Google Apps Script 活用事例 月初になったら、spreadsheet(ファイル)を複製して、フォルダを確認したら、月次データが出来上がっている状態にする方法

手作業を排除したいッ!!

10:00から働いて、2〜3時間くらいで仕事が終わったらいいのになと考えています。常々8時間労働は長いなと感じています。物理的な労働時間が減っても、生産性を上げるためには、下記の3つしか方法がないなと考えています。

1. 自分の処理速度を上げる。
2. 人や部下に任せる。アウトソーシングする。
3. 機械にやらせる。自動化する。

自分の処理速度を上げるのには、限界がありますし、スピードと正確性は、なんだかんだトレードオフの関係だったりもします。2に関していえば、自分の場合は、役職がついていないため、そういう事も難しい....となると、自動化して、機械にやらせるしかない。という事になります。

アートボード 3

今回は、実務で異なるスプレッドシート間のコピペを自動化しました。

1. 前月使用した、月次集計用のファイルコピーします。
2. コピーしたファイルには前々月のデータが残っているので、消します。
3. 他のシートの値を取得
4. コピーしたファイルにペーストする。

こんな感じです。作業自体は大したことはありません。クラウドになっても、あのシートどこいったっけ? そもそも、何て名前だったっけ?という事が実務ではよくあるので、「探す時間」も効率化出来るという意味は、そこそこ大きいのかなと思います。

完成形のコード

function copyFile() {
 
 var spreadsheet  = SpreadsheetApp.getActiveSpreadsheet();
 var sheet        = spreadsheet.getSheetByName('シート名');
 var sourceFileId = spreadsheet.getId();
 
 Logger.log(sourceFileId);
 
 
 var date       = new Date(); //現在日時のDateオブジェクトを作る
 var today      = Utilities.formatDate(date, 'JST', 'yyyy_MM_dd');
 var month      = date.getMonth()+1; //※getMonthの返り値が0~11(1月~12月)なので、+1してる
 date.setMonth(month-2);//Dateオブジェクトに1ヶ月前の月を設定したいので、「月」に-2をセットする
 var lastMonth  = Utilities.formatDate(date, 'JST', 'yyyy_MM_');
 
 
 var fileRename        = lastMonth + '月次集計'; //コピーするファイルの名前を作成
 var copyDir           = DriveApp.getFolderById('***********'); // コピ―したファイルを保存するフォルダIDを取得&入力
 var sourceSpreadsheet = DriveApp.getFileById(sourceFileId); // コピー元のファイルIDを取得&入力
 
 
 //コピー後のファイル取得
 var newFile           = sourceSpreadsheet.makeCopy(fileRename, copyDir);
 var duplicateFileId   = newFile.getId();//コピーしたファイルをすぐに使いたい場合はIDを取得すると良い
 var copyToSheet       = SpreadsheetApp.openById(duplicateFileId).getSheetByName('RAW');
 var copyToClear       = copyToSheet.getRange('A:J').clearContent();
 
 Logger.log(duplicateFileId);
 
 
/*貼り付ける元となるシートの取得 実務ではRPAなのかな?....
   自動でSQLを実行して、スプレッドシートに書き出してくれるようになっています。
*/
 var sqlSheet    = SpreadsheetApp.openByUrl('*******');
 var targetSheet = sqlSheet.getSheetByName('シート名');
 var sqlValues   = targetSheet.getDataRange().getValues();
 
 Logger.log(sqlSheet.getName());
//  Logger.log(sqlValues);
 
 
 var copyToSetValues = copyToSheet.getRange(1, 1, sqlValues.length, sqlValues[0].length).setValues(sqlValues);
 
 Logger.log(copyToSetValues);
 
}

1. getActiveSpreadsheet で、コピーするシートIDを取得
2. DriveAppではないと、makeCopy メソッドが使えない。
3. renameメソッドは文字通り、renameだけで保存場所の指定が出来ない。

makeCopyメソッドは、保存場所の指定とリネームの両方が出来ちゃう、一人二役なメソッドというのが重要なポイントです。

var newFile           = sourceSpreadsheet.makeCopy(fileRename, copyDir);
var duplicateFileId   = newFile.getId();
var copyToSheet       = SpreadsheetApp.openById(duplicateFileId).getSheetByName('RAW');

書き出した当初、コピーは上手くいったけど、コピーしたシートを取得して何かをしたい時にはどうするんだろう?と思ったけど、先人の知恵が役に立ちました。

今まで月初になったら、ファイルをコピーして.....RAWデータをCSVでインポートして、名前なんかを手動で書いていた頃と比べると工数がグッと下がりました。

翌月の月初にトリガーを設定。

スクリーンショット 2020-01-24 20.41.38

これで月初になったら、自分が欲しいファイルが既に指定のフォルダに格納、リネームまでシッカリされた状態で、フォルダを開いたらもう既に完成している状態で仕事が出来るようになっています。

月次集計作業では、こんな工夫もしています。


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