Google Apps Script(GAS)で、次の処理をまとめて実行します。
- 日付をもとにファイル名を付けて
- テンプレートのスプレッドシートをコピー
- チェックボックスの状態を確認
- コピーしたファイル内でシートを複製・リネーム
記録用ファイルのA1は出力ID、A2は処理状態、A3は入力日付に使います。
A1・A2は専用セルとして確保し、既存の内容を控えてください。
初回はA1を空にし、A3へ日付として認識される値(例:2019/08/26)を入力します。
A3の日付は消しません。
まずテスト用の記録ファイル・テンプレート・保存先フォルダを用意します。記録ファイルには「シート1」、テンプレートには「コピー元」シートを作り、コピー元のA1:H1をすべてチェックボックスにしてください。標準値とカスタム値の両方を判定します。
テンプレートを日付別に複製&チェックボックス処理も自動化する
各段階のコードは流れを示す抜粋です。実行するときは「コードのまとめ」の全体を使い、3つのIDを置き換えてください。Apps ScriptエディタでmyFunctionを選んで実行し、対象ファイルとDriveへのアクセスを承認します。セル内のカスタム関数としては使いません。
Phase1:日付の取得と整形
const input = LogFileSheet.getRange('A3').getValue();
if (!(input instanceof Date) || isNaN(input.getTime())) {
throw new Error('A3に有効な日付を入力してください');
}
const date = Utilities.formatDate(input, LogFile.getSpreadsheetTimeZone(), 'yyMMdd');- スプレッドシートの
A3セルにある日付(例:2019/08/26)を取得 yyMMdd形式に変換 →190826の形式に整形
Googleスプレッドシートのほかの操作方法は、まとめ記事から確認できます。

Phase2:テンプレートの複製とID書き込み
const CopiedDriveFile = templateFile.makeCopy(OutputFileName, OutputFolder);
const CopiedFileId = CopiedDriveFile.getId();
LogFileSheet.getRange('A1').setValue(CopiedFileId);- 指定したテンプレートファイルを複製
- 元ファイル名に「_日付」を付けた名前で保存。同じフォルダに同名ファイルがあれば複製前に停止
- 複製したファイルのIDを記録用シートの
A1セルに書き込み
Phase3:チェックボックスの確認
const cells = CopiedFileSheet.getRange('A1:H1');
let checked = 0;
for (let col = 1; col <= 8; col++) {
const state = cells.getCell(1, col).isChecked();
if (state === null) throw new Error('A1:H1のチェックボックスを確認してください');
if (state) checked++;
}
LogFileSheet.getRange('A2').setValue('チェックあり: ' + checked + '件');- 複製したシートの1行目・1〜8列目を確認
isChecked()で1セルずつ判定し、チェック数をA2へ記録。全体コードではシート複製後に「完了」とともに記録
Phase4:シートのコピーと並び順調整
const DateSheet = CopiedFileSheet.copyTo(CopiedFile);
DateSheet.setName(date);
CopiedFile.setActiveSheet(DateSheet);
CopiedFile.moveActiveSheet(1);- 複製先ファイル内で「コピー元」シートを複製
- 日付(例:190826)をシート名に設定
- シートを先頭(一番左)に移動して整理
コードのまとめ
以下が全体コードです。記録用A1が空でない場合は再実行を止めます。ロックは同じスクリプト内の同時実行を抑えるもので、人の編集や別プロジェクトからの処理は防ぎません。途中のエラーで作成済みファイルが残る場合は、A1のIDと保存先を確認してください。自動削除や全処理の取り消しは行いません。
ロック解除前の書き込み確定は、GoogleのLock資料に沿ってSpreadsheetApp.flush()を呼びます。
2026年10月28日にローカル模擬試験で処理順と例外時の解除を確認しました。
Google上の実際の複製・書き込み・並行実行は未確認です。
function myFunction() {
const lock = LockService.getScriptLock();
if (!lock.tryLock(10000)) throw new Error('同じスクリプトで別の処理が実行中です');
try {
const LogFile = SpreadsheetApp.openById('記録用のシートID');
const LogFileSheet = LogFile.getSheetByName('シート1');
if (!LogFileSheet) throw new Error('記録用のシート1がありません');
if (LogFileSheet.getRange('A1').getValue() !== '') {
throw new Error('A1に前回の出力IDがあります。出力先を確認してください');
}
const input = LogFileSheet.getRange('A3').getValue();
if (!(input instanceof Date) || isNaN(input.getTime())) {
throw new Error('A3に有効な日付を入力してください');
}
const date = Utilities.formatDate(input, LogFile.getSpreadsheetTimeZone(), 'yyMMdd');
const templateFile = DriveApp.getFileById('コピー元のシートID');
if (templateFile.getMimeType() !== 'application/vnd.google-apps.spreadsheet') {
throw new Error('テンプレートにはGoogleスプレッドシートを指定してください');
}
const source = SpreadsheetApp.openById(templateFile.getId());
const sourceSheet = source.getSheetByName('コピー元');
if (!sourceSheet) throw new Error('テンプレートにコピー元シートがありません');
if (source.getSheetByName(date)) throw new Error('テンプレートに同じ日付名のシートがあります');
const sourceCells = sourceSheet.getRange('A1:H1');
for (let col = 1; col <= 8; col++) {
if (sourceCells.getCell(1, col).isChecked() === null) {
throw new Error('テンプレートのA1:H1を有効なチェックボックスにしてください');
}
}
const OutputFolder = DriveApp.getFolderById('格納先のフォルダID');
const OutputFileName = templateFile.getName() + '_' + date;
if (OutputFolder.getFilesByName(OutputFileName).hasNext()) {
throw new Error('保存先に同名ファイルがあります。既存ファイルを確認してください');
}
const CopiedDriveFile = templateFile.makeCopy(OutputFileName, OutputFolder);
const CopiedFileId = CopiedDriveFile.getId();
LogFileSheet.getRange('A1').setValue(CopiedFileId);
LogFileSheet.getRange('A2').setValue('処理中');
const CopiedFile = SpreadsheetApp.openById(CopiedFileId);
const CopiedFileSheet = CopiedFile.getSheetByName('コピー元');
const cells = CopiedFileSheet.getRange('A1:H1');
let checked = 0;
for (let col = 1; col <= 8; col++) {
const state = cells.getCell(1, col).isChecked();
if (state === null) throw new Error('複製先のチェックボックスが無効です');
if (state) checked++;
}
if (CopiedFile.getSheetByName(date)) throw new Error('複製先に同じ日付名のシートがあります');
const DateSheet = CopiedFileSheet.copyTo(CopiedFile);
DateSheet.setName(date);
CopiedFile.setActiveSheet(DateSheet);
CopiedFile.moveActiveSheet(1);
LogFileSheet.getRange('A2').setValue('完了 / チェックあり: ' + checked + '件');
} finally {
try {
SpreadsheetApp.flush();
} finally {
lock.releaseLock();
}
}
}実行後の確認と途中で止まった場合
実行後は、A1のIDで出力ファイルを開き、A2が「完了 / チェックあり: ○件」になったか確認します。
入力日付が2019/08/26なら、出力ファイル名の末尾と先頭シート名は190826です。
A3の日付、元テンプレート、コピー先のチェック数と値・書式も照合してください。
A2が「処理中」のまま、またはエラーが出た場合は、A1と保存先フォルダを確認します。
A1が空でも、ファイル複製後の記録で失敗して生成物が残る場合があります。
原因と生成済みファイルを確認するまで、A1を消して再実行しないでください。
応用例
- メール通知を加える場合は、処理完了後に宛先・件名・本文を指定する処理と追加の承認を設計します。本コードはメールを送りません。
- 同日の複数出力が必要なら、日付に加えて実行時刻や連番を管理します。A3が同じ日付なら、書式を変えるだけでは毎回異なる名前になりません
- チェック済みの行やデータのみを抽出して別処理へ渡す構成への拡張
関連コードはGitHubのMOTOKI-LLC/cg-method-codeにもあります。本文の修正版と同じ版とは限らないため、差分を確認してください。
GASでシートを操作する記事は、ほかにもあります。




まとめ
本スクリプトで実現できる処理とメリットは以下のとおりです。
| 処理内容 | メリット |
|---|---|
| 日付ごとにテンプレートを複製 | 日付別の帳票作成・管理の手間を削減 |
| チェックボックス判定 | 有効なチェックボックスのチェック数を記録 |
| 複製ファイルのIDを記録 | 複製先ファイルを検索する手間を削減 |
| シートのリネームと整理 | 最新シートが先頭に並び確認がスムーズに |
次の出力を作るときは、前回のA1・A2を別の記録へ控え、作成済みファイルを確認したうえでA1・A2を空にし、A3を更新します。練習を戻す場合も、生成ファイルを確認して手動で整理してください。元テンプレートは変更しません。Google実機での再検証・共有権限の確認は未実施です。仕様はFile.makeCopy、Range.isCheckedを参照してください。

テンプレート複製についてよくある質問
このスクリプトは、何を自動化しますか?
日付をもとにファイル名を付けてテンプレートのスプレッドシートをコピーし、チェックボックスの状態を確認して、コピーしたファイル内でシートを複製・リネームするまでを、一括で処理します。
日付は、どこから取得しますか?
スプレッドシートのA3セルにある日付(例:2019/08/26)を取得し、yyMMdd形式に変換して、190826のような形に整形します。
複製したファイルのIDは、どこに記録されますか?
複製したファイルのIDを、記録用シートのA1セルに書き込みます。複製先のファイルを探す手間を減らせます。
チェックボックスは、どの範囲を確認しますか?
コピー元シートのA1:H1を1セルずつisCheckedで確認します。標準値・カスタム値のチェックボックスを扱い、無効なセルがあれば停止します。完了時はA2にチェック数を記録し、A3の入力日付を保持します。
同じ日に何度も実行すると、どうなりますか?
このコードはA1に出力IDがある場合、または保存先に同名ファイルがある場合に停止します。A3が固定の日付なら、yyyyMMdd_HHmmへ書式だけを変えても実行ごとに名前は変わりません。複数出力が必要なら、実行時刻や連番の管理を別途設計します。
完了をメールで知らせるには?
本コードにはメール送信はありません。追加する場合は完了後の送信処理、宛先・件名・本文、追加の承認と再実行時の二重送信防止を設計してください。
チェック済みの行だけを、別の処理に渡せますか?
応用例として、チェック済みの行やデータのみを抽出して、別処理へ渡す構成へ拡張できます。元のコードを変更する前に、ファイルを複製しておくと安全です。
最初に試すときの注意点は?
指定したテンプレートファイルを複製するため、まずテスト用のテンプレートと保存先で試してください。画面やメニューは変わることがあるため、最新の操作は公式ヘルプで確認してください。
