Gmail下書きのバックアップ漏れを保存前に発見|GASで件数だけをdry-run監査

Gmail下書きのバックアップ漏れを保存前に発見|GASで件数だけをdry-run監査

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

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

メール下書きのバックアップを自動化したい一方で、本文や宛先をログへ出すのは不安ではないでしょうか。この記事では、Gmailの下書きを変更せず、件数・空の下書き・宛先未入力だけを集計する事前監査を試します。

この監査で先に止められること

  • 想定件数を超えたままバックアップ処理を始める
  • 件名と本文が空の下書きを保存対象へ混ぜる
  • 宛先未入力を完成済みメールと誤認する
  • 件名、本文、宛先を実行ログへ残す

このコードは下書きの作成、更新、送信、削除をしません。Gmailが標準で行う下書き保存を置き換えるものでもありません。

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

const DRAFT_AUDIT_CONFIG = Object.freeze({
  DRY_RUN: true,
  MAX_DRAFTS_TO_CHECK: 50,
  WARNING_COUNT: 40
});

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

  const maxDrafts = Number(DRAFT_AUDIT_CONFIG.MAX_DRAFTS_TO_CHECK);
  const warningCount = Number(DRAFT_AUDIT_CONFIG.WARNING_COUNT);
  if (!Number.isInteger(maxDrafts) || maxDrafts < 1 || maxDrafts > 100) {
    throw new Error('MAX_DRAFTS_TO_CHECKは1〜100の整数にしてください。');
  }
  if (!Number.isInteger(warningCount) || warningCount < 1 || warningCount > maxDrafts) {
    throw new Error('WARNING_COUNTは1〜MAX_DRAFTS_TO_CHECKの整数にしてください。');
  }

  const allDrafts = GmailApp.getDrafts();
  const drafts = allDrafts.slice(0, maxDrafts);
  const summary = {
    dryRun: true,
    totalDraftsFound: allDrafts.length,
    checkedDrafts: drafts.length,
    emptyDrafts: 0,
    missingRecipientDrafts: 0,
    overWarningCount: allDrafts.length >= warningCount,
    truncated: allDrafts.length > drafts.length
  };

  drafts.forEach(function(draft) {
    const message = draft.getMessage();
    const subject = String(message.getSubject() || '').trim();
    const body = String(message.getPlainBody() || '').trim();
    const recipient = String(message.getTo() || '').trim();

    if (!subject && !body) summary.emptyDrafts += 1;
    if (!recipient) summary.missingRecipientDrafts += 1;
  });

  // 本文・件名・宛先・下書きIDはログへ出さない
  console.log(JSON.stringify(summary));
  if (summary.truncated) {
    console.warn('確認上限を超えています。上限より後ろの下書きは未確認です。');
  }
  return summary;
}

実行前の準備

1. Google Apps Scriptで新しい検証用プロジェクトを作ります。

2. 上のコードを貼り付け、タイムゾーンを普段使う地域へ合わせます。

3. `MAX_DRAFTS_TO_CHECK`は最初は10程度に下げても構いません。

4. `auditGmailDraftBackupPlanFree`を選び、手動で1回だけ実行します。

5. Gmailの読み取り権限を確認し、意図しない権限が表示されたら中止します。

ログの読み方

  • `checkedDrafts`: 今回確認した件数
  • `emptyDrafts`: 件名と本文が両方空だった件数
  • `missingRecipientDrafts`: 宛先未入力だった件数
  • `overWarningCount`: 下書き総数が警告値以上か
  • `truncated`: 確認上限より後ろに未確認分があるか

個々のメール内容は出力しません。件数だけで判断できない場合は、Gmail画面で対象を手動確認してください。

自動実行へ進む前の停止条件

  • `truncated`がtrueのまま
  • 空または宛先未入力の件数が想定外
  • 共有端末や共有アカウントで実行している
  • 実行ログの閲覧範囲を確認できていない
  • 業務ルール上、メール本文のスクリプト読取が認められていない

制限と安全上の注意

  • この例は監査専用で、下書きをスプレッドシートへ保存しません。
  • 本文は空判定のため実行中に読み取りますが、ログや外部サービスへ送信しません。
  • 下書きが多い環境では実行時間やGmailサービスの利用上限に達することがあります。
  • 定期トリガーを付ける前に、少量の下書きで手動実行し、権限とログを確認してください。
  • 復元や上書きは自動化せず、必要な場合も人が内容を確認して行ってください。

まとめ

いきなりバックアップ処理を動かす前に、対象件数と入力不備だけをdry-runで確認すると、過剰取得や機密情報のログ出力を避けやすくなります。監査結果に問題がないことを確認してから、保存方法や運用範囲を決めてください。

関連する有料Tips「Gmail下書きテンプレGAS Pro」を見る

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

※学習・検証用の例です。実データへ適用する前に、検証用アカウントまたは影響を限定した環境で確認してください。Google公式・Google公認の商品ではありません。


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

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

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

この記事のライター

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

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

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

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

    ¥2,980
    1 %獲得
    (29 円相当)
  • あとで見るURLを二重登録しない|GASで読書・動画ウォッチリストをdry-run監査

  • X投稿の重複を出す前に止める|GASで投稿キューをdry-run監査

関連のおすすめ記事

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

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

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

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

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

    GoGorilla

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

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

    SmartSenior