クイック エンジニアリングブログ

株式会社クイック Web事業企画開発本部のエンジニアリングチームが運営する技術ブログです。

【スプレッドシート&GAS】毎週日報シートをコピーするのが面倒だったから自動化した

こんにちは、ねこです。
最近スプシばかりいじっているので暇さえあれば(無くても)スクリプトで自動化したがります。

今回はいろんなスプシで使いまわしてるスクリプトのうちのひとつ、「定期的にシートをコピーして先頭に持ってくるスクリプト」を紹介します。
「毎日じゃなくてそんなに手順あるわけじゃないんだけど誰かが定期的にやらないといけないやつ」を自動化しました。
こういうの、ふとした瞬間に面倒くささを感じるんですよね。
そんなモヤッとはコピペスクリプトに任せてしまいましょう。

スクリプトがやってくれること

毎週月曜日に↓の処理を実行してくれます。
speakerdeck.com

導入するときの反応

毎回シートを作ってくれる人に自動化していい?と聞いてみました。

f:id:aimstogeek:20190607143434p:plain:w380
ダブルねこハッピー
とっても嬉しそうですね!やりましょう!!

準備するもの

シート名等に日付を使うのでライブラリにMoment.jsを追加します。
tonari-it.com

実際のスクリプト

function copyNextSprintSheet() {
  var SS = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = SS.getSheets();
  // コピー元(先頭)のシート
  var sourceSheet = sheets[0];

  // コピー後のシート名を作る
  var openDate = Moment.moment();
  var closeDate = Moment.moment().add(4, 'days');
  var nextSheetName = '入力シート_' + openDate.format('MMDD') + '-' + closeDate.format('MMDD');

  if (SS.getSheetByName(nextSheetName) != null) {
    // すでに作られていたらなにもしない
    return;
  }

  // ① シートをコピー
  sourceSheet.copyTo(SS);

  // ② 「(コピー元シート名) のコピー」というシート名になっているのでコピー後のシート名にする
  var sourceSheetName = sourceSheet.getName();
  var copiedSheet = SS.getSheetByName(sourceSheetName + ' のコピー');
  copiedSheet.setName(nextSheetName);

  // ③ 書式はそのままに中身をクリア
  var areaLastRow = SS.getRange('B:B').getLastRow(); // メンバー列(B列)の最後の行を取得する
  copiedSheet.getRange('D6:J' + areaLastRow).clear({contentsOnly: true});

  // ④ D4セル(day1)に開始日を挿入
  copiedSheet.getRange('D4').setValue(openDate.format('YYYY/MM/DD'));
  
  // ⑤ コピー後のシートを一番初めの位置に移動する
  SS.setActiveSheet(copiedSheet);
  SS.moveActiveSheet(1);
}

定期実行の設定

スクリプトを保存したら「編集」>「現在のプロジェクトのトリガー」>「トリガーの追加」で毎週月曜日に上記のスクリプトを実行するように設定します。

f:id:aimstogeek:20190607103050p:plain:w420
スプレッドシートは便利だなあ

これで毎週月曜日にシートをコピーしてくれる人の手間が消えました。やったね!
みなさんもGASをうまく使って良きスプシライフを!


こんな感じでスプシをゴリゴリ使いまくるわたしたちは
\\『明日のはたらくを創る』仲間を募集中です!! //
919.jp