Gmailのスパムを削除する前に確認|GASで古いスレッド件数をdry-run監査
ツールおじ|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公認の商品ではありません。
