masterシートから月ごとのシートを複製します。
年月はスプレッドシートのタイムゾーンで決め、同じ年月名のシートがあれば上書きせずに終了します。
練習コード・入力JSON・文字変換ブックをダウンロード(ZIP)できます。
この練習では、ZIP内のarticle-218.jsか、以下に掲載したコードを使います。
記事ごとに別のApps Scriptプロジェクトを使い、新規の練習ブックを対象にしてください。
以下は2026年10月2日のローカル模擬検証の記録です。
共通のGASサンプル全体では51項目をローカルの模擬環境で確認しています。
2026年10月28日には、本文と配布コードの一致を確認し、複製処理に関する6項目の模擬試験を再実行しました。
初回と再実行、月の境界、不正日時、複製元なし、ロック失敗、複製失敗が対象です。
Googleへの認可と実際のシートの複製・値・書式・数式参照は未検証です。
入力例:masterと練習ブックの設定
新規ブックにmasterというシートを作り、A1に「項目」、B1に「値」、A2に「練習」、B2に数値10を入れます。
必要な書式もmasterに指定します。
ブックの「ファイル」→「設定」でタイムゾーンを確認し、日本時間で使うなら東京にそろえます。
| 設定 | 内容 |
|---|---|
| SPREADSHEET_ID | 練習ブックのID |
| 複製元のシート名 | master |
| デモの日時 | 2026年10月1日0時30分、日本時間 |
| 日本時間の生成名 | 202610 |
手動実行と同じ年月での再実行
「拡張機能」→「Apps Script」を開き、プロジェクトの設定でSPREADSHEET_IDをスクリプトプロパティへ入れます。
次のコードを保存し、最初はdemoMonthCopyを実行します。
現在日時で複製する場合はAutoSheetCopyを実行します。
demoMonthCopyは実行日によらず、2026年10月1日0時30分(日本時間)を使います。
初回は対象ブックへのアクセス権限を確認して認可します。
function monthSheetName_(date, zone) {
if (!(date instanceof Date) || !Number.isFinite(date.getTime())) throw new Error('有効な日時を指定してください');
return Utilities.formatDate(date, zone, 'yyyyMM');
}
function AutoSheetCopy() { return copyMonthAt_(new Date()); }
function demoMonthCopy() { return copyMonthAt_(new Date('2026-10-01T00:30:00+09:00')); }
function copyMonthAt_(date) {
const id = PropertiesService.getScriptProperties().getProperty('SPREADSHEET_ID');
if (!id) throw new Error('SPREADSHEET_IDを設定してください');
const ss = SpreadsheetApp.openById(id);
const name = monthSheetName_(date, ss.getSpreadsheetTimeZone());
const lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) throw new Error('別の実行中です。完了後に同じ年月で確認してください');
try {
const master = ss.getSheetByName('master');
if (!master) throw new Error('masterシートがありません');
if (ss.getSheetByName(name)) return {status: 'exists', sheetName: name};
ss.insertSheet(name, 0, {template: master});
SpreadsheetApp.flush();
const result = {status: 'created', sheetName: name};
console.log(JSON.stringify(result));
return result;
} finally { lock.releaseLock(); }
}
確認結果と切り分け
| 条件 | 結果 |
|---|---|
| 日本時間の初回デモ | 202610が追加され、status:created |
| 同じデモを再実行 | status:exists。新しいシートを増やさない |
| masterがない | エラーで停止し、複製しない |
| 既存の202610に入力済みデータがある | 上書きしない |
| masterのA2とB2 | 複製後も元は「練習」と10のまま |
| 月が想定と違う | スプレッドシートのタイムゾーンと実行日時を確認する |
| 別の実行が進行中 | ロック取得に失敗した実行は停止する |
模擬検証では、同じデモ日時をロサンゼルスのタイムゾーンで判定すると202609になりました。
初回はブックの先頭に202610ができ、実行ログにcreatedが出るか確認します。
再実行時のexistsは戻り値だけで、掲載コードはログに出しません。
ブックでシート数と既存の202610の内容が変わらないことを確認してください。
タイムゾーンはシート名の月を決める条件です。
複製後の値・書式・数式参照は、実際のGoogleシートで確認する必要があります。
ロックの対象は同じプロジェクトの実行で、別プロジェクトや人の編集は対象外です。
作成後にエラーが出た場合は、年月シートが既に生成されていないか確認してください。
既存の年月シートは再実行しても修復しないため、削除せず内容を照合します。
定期実行する場合と停止方法
このコードはトリガーを自動で作成しません。
手動の複製結果を確認した後に定期実行へ移す場合は、エディタの「トリガー」からAutoSheetCopyを時間主導で指定します。
実行時間帯はプロジェクト側のタイムゾーンも確認します。
時間主導トリガーの実行時刻には幅があるため、月初の0時ちょうどに動く前提にはしません。
トリガーの動作条件はGoogleの時間主導トリガー資料を確認してください。
停止時にはエディタのトリガー一覧から該当する時間主導トリガーを削除し、生成済みのシートを確認します。
不要な複製を戻す場合も、入力後のデータを失わないよう元ブックのコピーを残してから判断します。
既存の年月シートを置き換える処理は含めていません。
公式資料
テンプレートを使うinsertSheet、ロックと反映の確定を参照してください。
関連記事・旧実装の参考資料
旧GitHubコードや外部の参考例は、現在の記事のZIPと異なる場合があります。
今回の練習は本文のセル番地・プロパティ・ZIPをそろえて実行してください。






月別シートの複製についてよくある質問
このスクリプトは、何を自動化しますか?
masterシートから、月ごとのシートを複製します。年月はスプレッドシートのタイムゾーンで決め、同じ年月名のシートがあれば、上書きせずに終了します。
同じ月に何度も実行すると、どうなりますか?
同じデモを再実行すると、statusがexistsになり、新しいシートを増やしません。既存の年月シートに入力済みのデータがある場合も、上書きしません。
masterシートがないときは?
エラーで停止し、複製しません。複製元のシート名がmasterであることを確認してください。
シート名の月が、想定と違います。
スプレッドシートのタイムゾーンと、実行日時を確認します。模擬検証では、同じデモ日時をロサンゼルスのタイムゾーンで判定すると、202609になりました。日本時間で使うなら、ファイルの設定のタイムゾーンを東京にそろえます。
複製すると、masterの内容は変わりますか?
このコードにはmasterへ書き込む処理はありません。模擬検証ではA2とB2は元の練習と10のままでした。実シート上での複製内容は別途確認してください。
別の実行が同時に進んでいたら?
ロック取得に失敗した実行は停止します。ただし、getScriptLockが調整するのは同じスクリプトプロジェクト内の実行です。別プロジェクトや人による同時編集は防げません。
定期実行するには、どうすればよいですか?
このコードは、トリガーを自動では作成しません。手動の複製結果を確認した後で、エディタのトリガーから、AutoSheetCopyを時間主導で指定します。実行時間帯は、プロジェクト側のタイムゾーンも確認してください。
この記事のコードは、動作確認済みですか?
共通のGASサンプル全体では51項目をローカルの模擬環境で確認しています。本記事の複製処理については、本文の確認表に範囲を示します。複製後の値・書式・数式参照は、実際のGoogleシートで確認する必要があります。Googleへの認可・実シートの操作は未検証です。まず新規の練習ブックで試してください。
