日付トリガーの処理漏れを設置前に発見|GASで実行予定行をdry-run監査

日付トリガーの処理漏れを設置前に発見|GASで実行予定行をdry-run監査

Gasおじ|GoogleアカウントをAIエージェント化

Gasおじ|GoogleアカウントをAIエージェント化

毎日の集計を日付トリガーへ任せたいのに、日付の入力ミスや同じ対象の二重登録があると、動かしてから処理漏れに気づきます。この記事では、スプレッドシートの実行予定日・対象ID・状態を読み取り、期限超過、日付不正、重複候補を監査シートへ出す無料のGAS例を紹介します。トリガーの作成、メール送信、元データ更新は行いません。

先に知っておきたいこと

  • `DRY_RUN = true` を固定し、元シートの値や状態を変更しません。
  • 対象はスプレッドシート内の予定行だけです。時間主導型トリガー自体の作成・削除は対象外です。
  • 日付はスプレッドシートのタイムゾーンを基準に日単位で比較します。
  • 対象IDや予定日をログへ出します。顧客名、メールアドレス、認証情報は入力しないでください。

準備するシート

`Schedule` と `AuditLog` の2枚を用意します。`Schedule` の1行目を `対象ID`、`実行予定日`、`状態` とし、2行目以降へ値を入れてください。状態は `未処理` または `完了` のどちらかにします。

コピーして使える最小コード

const DRY_RUN = true;

function auditDateTriggerPlanFree() {
  if (DRY_RUN !== true) throw new Error('安全のためDRY_RUN=trueで実行してください');

  const ss = SpreadsheetApp.getActive();
  const source = ss.getSheetByName('Schedule');
  const log = ss.getSheetByName('AuditLog') || ss.insertSheet('AuditLog');
  if (!source) throw new Error('Scheduleシートがありません');

  const lastRow = source.getLastRow();
  if (lastRow < 2) throw new Error('監査する予定行がありません');
  if (lastRow > 501) throw new Error('500件を超えています。対象を分けてください');

  const rows = source.getRange(2, 1, lastRow - 1, 3).getValues();
  const timeZone = ss.getSpreadsheetTimeZone();
  const today = Utilities.formatDate(new Date(), timeZone, 'yyyy-MM-dd');
  const counts = {};

  rows.forEach(row => {
    const id = String(row[0]).trim();
    const date = row[1];
    if (id && date instanceof Date && !isNaN(date.getTime())) {
      const key = id + '|' + Utilities.formatDate(date, timeZone, 'yyyy-MM-dd');
      counts[key] = (counts[key] || 0) + 1;
    }
  });

  const output = rows.map((row, index) => {
    const id = String(row[0]).trim();
    const date = row[1];
    const status = String(row[2]).trim();
    const reasons = [];
    let dateText = '';

    if (!id) reasons.push('対象IDが空欄');
    if (!(date instanceof Date) || isNaN(date.getTime())) {
      reasons.push('実行予定日が不正');
    } else {
      dateText = Utilities.formatDate(date, timeZone, 'yyyy-MM-dd');
      if (status === '未処理' && dateText < today) reasons.push('期限超過');
      if (id && counts[id + '|' + dateText] > 1) reasons.push('同日・同一IDの重複候補');
    }
    if (!['未処理', '完了'].includes(status)) reasons.push('状態が不正');

    return [index + 2, id, dateText, status, reasons.join(' / ') || '確認済み'];
  });

  log.clearContents();
  log.getRange(1, 1, 1, 5).setValues([['元行', '対象ID', '実行予定日', '状態', '判定']]);
  log.getRange(2, 1, output.length, 5).setValues(output);
  console.log(JSON.stringify({ checked: output.length, today, dryRun: DRY_RUN }));
}

実行手順

1. 対象スプレッドシートを複製し、Apps Scriptへコードを貼り付けます。

2. `Schedule` に5〜10件の検証用データを入れます。

3. `auditDateTriggerPlanFree` を選び、権限を確認して実行します。

4. `AuditLog` の「期限超過」「重複候補」「不正」を確認します。

5. 問題行を人が修正し、監査結果が「確認済み」になってから別工程でトリガー設置を検討します。

失敗しやすい点と停止条件

  • シート不足、予定行なし、501行以上なら停止します。
  • 文字列に見える日付でも、セルが日付型でなければ不正として扱います。
  • 同じ対象IDでも予定日が違えば重複候補にはしません。業務上の重複は人が判断してください。
  • `AuditLog` は毎回上書きされます。過去結果が必要なら実行前に複製してください。
  • 自動送信、注文状態の更新、売上集計、トリガー作成はこの無料例の対象外です。

公開前チェックリスト

  • 元データを更新していない
  • トリガーを自動作成・削除していない
  • メールや外部サービスへ送信していない
  • 個人情報や認証情報をログへ出していない
  • 少量のコピー環境で日付とタイムゾーンを確認した

まとめ

日付トリガーは、動かす前に入力予定を監査すると処理漏れや二重処理を減らしやすくなります。まずは予定日・対象ID・状態の不備だけを読み取り専用で見つけ、問題のない小さな範囲から自動化してください。

個人販売の注文・発送管理GAS Proを見る

GasおじのTips商品一覧を見る

※学習・検証用の例です。実データへ適用する前にコピー環境と少量データで確認してください。Google公式・Google公認の商品ではありません。


あなたも記事の投稿・販売を
始めてみませんか?

Tipsなら簡単に記事を販売できます!
登録無料で始められます!

Tipsなら、無料ですぐに記事の販売をはじめることができます Tipsの詳細はこちら
 

この記事のライター

Gasおじ|GoogleアカウントをAIエージェント化

おう、Gasおじだ。 AIツールとSaaSに散々突っ込んで遠回りした結果、最後に強かったのは「今あるGoogleアカウント」だった。 今ではAIエージェントであらゆるタスクを自動化して無双してるぞ。 GAS、スプレッドシート、フォーム、Gmail、AIエージェントを組み合わせれば、個人でも小さな会社でも、手作業だらけの業務はかなり自動化できる。 ここでは机上のAI論じゃなく、現場で動くテンプレ、コード、手順だけを置いていくぞ。 高いツールを増やす前に、まずお前さんのGoogleアカウントを仕事するエージェントに変えようじゃないか。

このライターが書いた他の記事

  • Gmailの定型連絡を「送信せず」まとめて下書き化する|Gmail下書きテンプレGAS Pro

    ¥2,980
    1 %獲得
    (29 円相当)
  • GASのtry-catch入門|元データを守るエラー処理とログの実装例

  • あとで見るURLを二重登録しない|GASで読書・動画ウォッチリストをdry-run監査

関連のおすすめ記事

  • Gmailの定型連絡を「送信せず」まとめて下書き化する|Gmail下書きテンプレGAS Pro

    ¥2,980
    1 %獲得
    (29 円相当)
    Gasおじ|GoogleアカウントをAIエージェント化

    Gasおじ|GoogleアカウントをAIエージェント化

  • 【Python】 Con-Que 【データベース接続】

    ¥3,000
    1 %獲得
    (30 円相当)
    GoGorilla

    GoGorilla

  • USBメモリで持ち運べるLinux Mint 22.1と永続的な書き込み領域の作成法【Rufus だけで作成する方法を初心者向けに徹底解説】

    ¥500
    1 %獲得
    (5 円相当)
    SmartSenior

    SmartSenior