Gmailのスパムを削除する前に確認|GASで古いスレッド件数をdry-run監査

Gmailのスパムを削除する前に確認|GASで古いスレッド件数をdry-run監査

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

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

スパムが増えると、まとめて削除したくなります。ただ、自動削除を先に組むと、判定ミスに気づいた時には必要なメールまで戻せないことがあります。

この記事では、Gmailのスパム内にある古いスレッドを変更せず、件数と経過日数だけ確認する無料GASを紹介します。件名・差出人・本文・メールIDはログへ出しません。

先に知っておきたいこと

  • できること: スパム内の古いスレッドを最大100件まで読み取り、件数と経過日数の分布を確認する
  • しないこと: 削除、ゴミ箱移動、既読化、アーカイブ、ラベル変更、メール送信
  • 必要な権限: Gmailの検索・読み取り
  • 対象は自分のGmailです。共有アカウントや業務メールへ適用する場合は、管理者の運用ルールも先に確認してください

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

const SPAM_AUDIT_CONFIG = Object.freeze({
  DRY_RUN: true,
  OLDER_THAN_DAYS: 30,
  MAX_THREADS: 100
});

function auditGmailSpamPlanFree() {
  validateSpamAuditConfig_(SPAM_AUDIT_CONFIG);

  const query = `in:spam older_than:${SPAM_AUDIT_CONFIG.OLDER_THAN_DAYS}d`;
  const threads = GmailApp.search(query, 0, SPAM_AUDIT_CONFIG.MAX_THREADS);
  const now = new Date();
  const buckets = {
    '30〜59日': 0,
    '60〜89日': 0,
    '90日以上': 0
  };
  let messageCount = 0;

  threads.forEach((thread) => {
    const ageDays = Math.floor(
      (now.getTime() - thread.getLastMessageDate().getTime()) / 86400000
    );
    messageCount += thread.getMessageCount();

    if (ageDays >= 90) {
      buckets['90日以上'] += 1;
    } else if (ageDays >= 60) {
      buckets['60〜89日'] += 1;
    } else {
      buckets['30〜59日'] += 1;
    }
  });

  const result = {
    dryRun: SPAM_AUDIT_CONFIG.DRY_RUN,
    query,
    checkedThreads: threads.length,
    checkedMessages: messageCount,
    reachedLimit: threads.length === SPAM_AUDIT_CONFIG.MAX_THREADS,
    ageBuckets: buckets,
    action: 'NONE'
  };

  console.log(JSON.stringify(result));
  return result;
}

function validateSpamAuditConfig_(config) {
  if (config.DRY_RUN !== true) {
    throw new Error('安全のためDRY_RUNはtrue固定です。');
  }
  if (!Number.isInteger(config.OLDER_THAN_DAYS)
      || config.OLDER_THAN_DAYS < 7
      || config.OLDER_THAN_DAYS > 365) {
    throw new Error('OLDER_THAN_DAYSは7〜365の整数にしてください。');
  }
  if (!Number.isInteger(config.MAX_THREADS)
      || config.MAX_THREADS < 1
      || config.MAX_THREADS > 100) {
    throw new Error('MAX_THREADSは1〜100の整数にしてください。');
  }
}

実行前の準備

1. script.google.comで新しいApps Scriptプロジェクトを作ります。

2. 上のコードを貼り付けて保存します。

3. 最初は `OLDER_THAN_DAYS: 30`、`MAX_THREADS: 20` にして少量で試します。

4. `auditGmailSpamPlanFree` を手動実行し、Gmailの読み取り権限を確認します。

5. 実行ログの `action` が `NONE`、`dryRun` が `true` であることを確認します。

ログの見方

ログに出るのは集計値だけです。

  • `checkedThreads`: 確認したスレッド数
  • `checkedMessages`: 対象スレッド内のメール総数
  • `ageBuckets`: 最終メールからの経過日数別スレッド数
  • `reachedLimit`: 取得上限に達した可能性
  • `action: NONE`: メールを変更していないことを示す固定値

件名・差出人・本文・スレッドIDは記録しません。スパムにも個人情報や機密情報が含まれる可能性があるためです。

停止条件

  • `reachedLimit` が `true` の場合は、対象が100件を超えている可能性があります。上限を増やさず、検索期間を分けて確認します
  • 想定より件数が多い場合は、削除や状態変更へ進まず、Gmail画面でサンプルを目視します
  • 共有アカウント、保持義務のある業務メール、管理者ルールが不明な場合は実行対象にしません
  • 権限エラーや実行時間超過が出た場合は、トリガーを作らず手動確認へ戻します

制限と安全上の注意

  • このコードはメールを整理しません。削除候補の規模を確認するだけです
  • Gmailの検索結果やApps Scriptの利用上限は、アカウントや運用状況で変わります
  • 自動実行トリガーは設定しません。まず手動実行とGmail画面の照合を行ってください
  • 削除・ゴミ箱移動・既読化・アーカイブを追加する場合は別工程として設計し、バックアップ、対象限定、停止条件、復旧手順を用意してください

公開前チェックリスト

  • [ ] `DRY_RUN` が `true` のまま
  • [ ] `action` が `NONE`
  • [ ] 件名・差出人・本文・メールIDをログへ出していない
  • [ ] 取得上限に達していないか確認した
  • [ ] Gmail画面で対象の一部を目視した
  • [ ] 削除・既読化・アーカイブ・ラベル変更の処理を追加していない

まとめ

スパム整理は、削除コードを書く前に対象件数と古さを確認すると安全です。まずは読み取り専用のdry-runで規模を把握し、想定外があれば止められる状態を作ってください。

関連する有料Tips商品を見る

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 円相当)
  • カレンダーの二重登録を作成前に発見|GASで予定候補をdry-run監査

  • Googleフォームの採点ミスを回答公開前に発見|GASで正解キーをdry-run監査

関連のおすすめ記事

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

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

    SmartSenior

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

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

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

  • 毎朝のToDoを区分・優先度・期限つきでまとめる Morning ToDo Mail Pro

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

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