Amazonで商品を見るセール会場へ

Googleスプレッドシート│テンプレートを日付別に複製&チェックボックス処理も自動化する

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へ書式だけを変えても実行ごとに名前は変わりません。複数出力が必要なら、実行時刻や連番の管理を別途設計します。

完了をメールで知らせるには?

本コードにはメール送信はありません。追加する場合は完了後の送信処理、宛先・件名・本文、追加の承認と再実行時の二重送信防止を設計してください。

チェック済みの行だけを、別の処理に渡せますか?

応用例として、チェック済みの行やデータのみを抽出して、別処理へ渡す構成へ拡張できます。元のコードを変更する前に、ファイルを複製しておくと安全です。

最初に試すときの注意点は?

指定したテンプレートファイルを複製するため、まずテスト用のテンプレートと保存先で試してください。画面やメニューは変わることがあるため、最新の操作は公式ヘルプで確認してください。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

スプレッドシート・GASのおすすめ書籍

作業環境の作り方

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次