masterシートから月ごとのシートを複製します。
年月はスプレッドシートのタイムゾーンで決め、同じ年月名のシートがあれば上書きせずに終了します。
練習コード・入力JSON・文字変換ブックをダウンロード(ZIP)できます。
記事ごとに別のApps Scriptプロジェクトを使い、新規の練習データを対象にしてください。
最終確認は2026年10月2日です。
GASの51項目はローカルの模擬検証、curlの3項目はローカルHTTP環境、数式の8項目はArtifact Toolでの検証です。
Googleへの認可・実シートの操作・カレンダーの列挙・配備後のHTTP通信・Google Sheetsでの数式計算は未検証です。
入力例:masterと練習ブックの設定
新規ブックにmasterというシートを作り、A1に「項目」、B1に「値」、A2に「練習」、B2に数値10を入れます。
必要な書式もmasterに指定します。
ブックの「ファイル」→「設定」でタイムゾーンを確認し、日本時間で使うなら東京にそろえます。
| 設定 | 内容 |
|---|---|
| SPREADSHEET_ID | 練習ブックのID |
| 複製元のシート名 | master |
| デモの日時 | 2026年10月1日0時30分、日本時間 |
| 日本時間の生成名 | 202610 |
手動実行と同じ年月での再実行
「拡張機能」→「Apps Script」を開き、プロジェクトの設定でSPREADSHEET_IDをスクリプトプロパティへ入れます。
次のコードを保存し、最初はdemoMonthCopyを実行します。
現在日時で複製する場合はAutoSheetCopyを実行します。
初回は対象ブックへのアクセス権限を確認して認可します。
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になりました。
タイムゾーンはシート名の月を決める条件です。
複製後の値・書式・数式参照は実際のGoogleシートで確認する必要があります。
定期実行する場合と停止方法
このコードはトリガーを自動で作成しません。
手動の複製結果を確認した後に定期実行へ移す場合は、エディタの「トリガー」からAutoSheetCopyを時間主導で指定します。
実行時間帯はプロジェクト側のタイムゾーンも確認します。
停止時には該当トリガーを削除または停止し、生成済みのシートを確認します。
不要な複製を戻す場合も、入力後のデータを失わないよう元ブックのコピーを残してから判断します。
既存の年月シートを置き換える処理は含めていません。
公式資料
テンプレートを使うinsertSheet、ロックと反映の確定を参照してください。
関連記事・旧実装の参考資料
旧GitHubコードや外部の参考例は、現在の記事のZIPと異なる場合があります。
今回の練習は本文のセル番地・プロパティ・ZIPをそろえて実行してください。






