質問: 現在google formを使用してタイムカードとして利用しています。 回答はスプレッドシートに自動的に集計されていますが、このスプレッドシート内に月が変わるごとに新しいシート(「2017.04」といった具合)を自動生成することは可能でしょうか? ご存知の方入らっしゃいましたらご教授いただければ助かります。
回答: 毎月1日になったら 1前月を取得してシート名を生成し、2新シートを挿入し、3旧シートからデータを転記し、4旧シートのデータは削除する、という流れが考えられます。 また、回答先シートのシート名は「当月」とし、新シート名は「201703」のような形にするものとしています。 「毎月1日になったら」というスクリプトトリガーの設定ですが、月タイマーで「1」を選択し、毎月1日の午前2時頃(時間は適当)になったらスクリプト(copy関数)を実行するように設定すればよいと思います。 日タイマーでもよいです。下記コードではコメントアウトしていますがcheckDate関数を作って毎日午前2時などにこの関数を実行させるように設定し、日付をチェックして1日だったらcopy関数を実行するといった具合です。 トリガーは失敗することがたまにあるのでその場合はメールで知らせるようにするのが一般的です(再トライするコードもありますがここでは控えさせて頂きます)。 ``` // スプレッドシート var ss = SpreadsheetApp.getActiveSpreadsheet(); // 回答先シート var current = ss.getSheetByName("当月"); /* function checkDate() { // スクリプトトリガ実行日 var dd = new Date().getDate(); // もし1ならcopy実行 if (dd === 1) { copy(); } } */ function copy() { try { // 新シート生成 // 既存シート数 var index = ss.getNumSheets(); // 日付 var date = new Date(); // 年 var yy = date.getFullYear(); // 月(前月が返ることに注意) var mm = date.getMonth(); // 10月未満の場合は頭に0を付す if (mm < 10) { mm = "0"+mm; // 1月の場合は0が返るから12月とする } else if (mm === 0) { mm = 12; } // シート名生成 var name = yy+mm; // シート挿入 ss.insertSheet(name,index+1); // 旧シートからコピー // 最終行 var lr = current.getLastRow(); // 最終列 var lc = current.getLastColumn(); // 新シート var newSheet = ss.getSheetByName(name); // 旧シートからデータを転記 newSheet.getRange(1,1,lr,lc).setValues(current.getRange(1,1,lr,lc).getValues()); // おそらくフォーマットが狂うので整形(ここでは2列目以降に出勤時間、退勤時間が並んでいるものと想定) newSheet.getRange(2,2,lr-1,lc-1).setNumberFormat("hh:mm"); // 旧シート初期化 current.deleteRows(2,lr-1); // あえて.getRange().clear()は使わない // トリガーが失敗したら知らせる } catch(e) { MailApp.sendEmail("管理者メールアドレス", "エラー", e.getMessage); } } ```