Gmailの古いメールを
自動で削除・アーカイブする(GAS)。
「Googleアカウントの保存容量がいっぱい」「受信トレイが何万件」——手で消すのは大変ですが、一括削除は大事なメールまで消しそうで怖いものです。このページでは Google Apps Script(GAS)で、決めたルールに合う古いメールだけを、毎日少しずつゴミ箱かアーカイブへ移す仕組みを作ります。
1. できること
| 項目 | このページのコード |
|---|---|
| 初期ルール | プロモーション・SNS通知タブは最後のやり取りから30日でゴミ箱へ/受信トレイは90日でアーカイブ(消さずに受信トレイから外すだけ) |
| お試しモード | DRY_RUN = true の間は何も動かさず、対象の件数と件名の例だけをログに出します |
| 触らないもの | スター付き・「保存」ラベル付きのスレッド、最後のメッセージがまだ新しいスレッド |
| 大量のメール | 100件ずつ処理し、4.5分で止めて続きは次回(6分の実行時間制限に当たりません) |
ゴミ箱に移したメールは30日間は元に戻せます。完全削除はしません。
2. 手順
- script.google.com で「新しいプロジェクト」を作り、下のコードを貼り付けます。
- 残したいメールにスターを付けるか、Gmailで「保存」というラベルを作って付けておきます。
DRY_RUN = trueのまま ▶ でcleanupGmailを実行し、Gmailへのアクセスを許可します。実行ログに「[お試し] プロモーション: 245件 ゴミ箱へ 例: …」のように出ます。- 件数と例を見て問題なければ、
DRY_RUN = falseにして保存し、もう一度実行します。 - 左の時計アイコン「トリガー」→ 関数
cleanupGmail・「時間主導型」・「日付ベースのタイマー」・「午前3時〜4時」などで保存します。初回で終わらなかった分は毎日続きが処理されます。
3. コード全文(コピペで動きます)
const DRY_RUN = true; // まずは true のまま実行し、ログで対象を確認する
const RULES = [ // days: 最後のメッセージからこの日数が過ぎたスレッドが対象
{ name: 'プロモーション', query: 'category:promotions', days: 30, action: 'trash' },
{ name: 'SNS通知', query: 'category:social', days: 30, action: 'trash' },
{ name: '受信トレイ整理', query: 'in:inbox', days: 90, action: 'archive' },
];
const PROTECT = ' -is:starred -label:保存'; // スター付きと「保存」ラベルは絶対に触らない
const BATCH = 100; // GmailApp の一括操作は1回100件まで
const TIME_LIMIT_MS = 4.5 * 60 * 1000; // 6分制限の手前で止め、続きは次回
function cleanupGmail() {
const lock = LockService.getScriptLock();
if (!lock.tryLock(10000)) return;
const start = Date.now();
try {
for (const r of RULES) {
if (!(r.days >= 1)) throw new Error(r.name + ': days を1以上にしてください');
const q = r.query + ' older_than:' + r.days + 'd' + PROTECT + (r.action === 'archive' ? ' in:inbox' : '');
const cutoff = new Date(Date.now() - r.days * 86400000);
let offset = 0, done = 0, sample = [];
while (Date.now() - start < TIME_LIMIT_MS) {
const threads = GmailApp.search(q, offset, BATCH);
if (!threads.length) break;
// 検索は「どれか1通が古い」スレッドも返すので、最後のやり取りが新しいものは除外
const targets = threads.filter(t => t.getLastMessageDate() < cutoff);
if (sample.length < 5) targets.slice(0, 5 - sample.length).forEach(t => sample.push(t.getFirstMessageSubject()));
if (DRY_RUN) { done += targets.length; offset += threads.length; continue; }
if (targets.length) {
if (r.action === 'trash') GmailApp.moveThreadsToTrash(targets);
else GmailApp.moveThreadsToArchive(targets);
}
done += targets.length;
offset += threads.length - targets.length; // 除外したぶんだけ次の検索位置をずらす
}
console.log((DRY_RUN ? '[お試し] ' : '') + r.name + ': ' + done + '件 ' +
(r.action === 'trash' ? 'ゴミ箱へ' : 'アーカイブ') + ' 例: ' + sample.join(' / '));
}
} finally {
lock.releaseLock();
}
}
書き換えるのは RULES です。例:{ name: '通販の発送通知', query: 'from:(@example-shop.jp) subject:発送', days: 60, action: 'trash' }、{ name: '大きいメール', query: 'larger:10M', days: 365, action: 'archive' }。query はGmailの検索窓と同じ書き方です。検索窓で試してから入れると確実です。
4. このコードが防いでいる4つの失敗
- 最近返信が来たスレッドまで消える:Gmailの検索は「スレッドのどれか1通が条件に合う」と結果に出るので、
older_than:30dだけだと、昨日返信があった古いやり取りも対象になります。このコードは最後のメッセージの日付を確かめ、新しいものは除外します。 - 確認せずに一括で消してしまう:最初はお試しモードで件数と件名の例だけを出します。ルールの書き間違い(検索式が広すぎる)に、動かす前に気づけます。
- 大事なメールが巻き込まれる:スター付きと「保存」ラベルは、どのルールでも検索式に除外条件を足しています。
- 数万件でエラーになる:一括操作は1回100件までなので100件ずつ、実行時間は4.5分で区切ります。
LockServiceで、前回の実行が終わる前に次が重なっても二重に動きません。
5. よくあるつまずき
SNS通知が0件:Gmailの設定でタブ(カテゴリ)を使っていないと
category:social には何も入りません。from: で送信元を指定するルールに変えてください。間違えて消した:Gmailの「ゴミ箱」を開き、スレッドを選んで「受信トレイに移動」で戻せます(30日以内)。
会社のGoogle Workspaceで使う:保存義務のあるメール(契約・請求など)は、社内ルールや管理者の保持設定を先に確認してください。
6. AIはどこに使う?
整理そのものにAIは不要です。ルールで決めたほうが確実で、あとから説明もできます。AIが役立つのは、残したメールの中の問い合わせを分類して返信の下書きを作るほうです。作り方は Gmailの問い合わせ返信をAIで下書き にまとめています。
このページのコードを含む6本を、1つのシートでまとめて動かしたい方へ
無料記事のコードは1本ずつ単独で使う前提のため、同じプロジェクトに複数入れると定数名が衝突します。セット版は添付保存・Slack/Chat通知・古いメール整理・送信元ラベル・シート書き出し・未返信リマインドの6本が同時に動くよう整理し、「今すぐ実行/定期実行ON・OFF(二重登録なし)」メニューと日本語の導入手順を付けました。APIキー不要で、追加費用はかかりません。
Gmail自動化GAS 6本セット(APIキー不要/$9)を見る →Gumroad での販売です。デジタル納品のため、ダウンロード後の返金はお受けできません(不具合時は誠実に対応します)。
自分で設定するのが不安な方へ(ココナラ・日本円):シート1列のAI一括処理と、当日分の自動サマリーメールのGAS2本+日本語手順書を、ココナラで販売しています(3,000円・税抜〜)。初期設定サポート(+4,000円)や、あなたの実データで自動化フローを1つ一緒に作る導入伴走(+12,000円)は任意のオプションです(いずれも税抜)。対応できるかは購入前の見積り相談で確認できます。
ココナラで導入相談・購入する →メールを「減らす」だけでなく、問い合わせ対応も軽くしたい方へ
届いた問い合わせをAIで分類し、登録した事実(FAQ)だけを使って返信の下書きを作る拡張版です。noreply・通知・メルマガは自動でスキップし、お試しモードで結果を確認してから本番にできます。自動送信はせず、下書きまでです。
Gmail問い合わせ AI 下書き返信・拡張版(FAQ参照・除外送信元・お試しモード/$3)を見る → 請求書PDF+AI添え状・議事録AI要約など、そのまま動くGAS5本+日本語の導入手順書(PRO版・$39)→手で貼って使うプロンプトだけ欲しい方へ:事務AIプロンプト集12種(無料・投げ銭歓迎)
Gumroad での販売です。このページのメール整理のコードは無料で、有料版には含まれていません。AI を使う機能には OpenAI の API キー(従量課金)が必要です。デジタル納品のため、ダウンロード後の返金はお受けできません(不具合時は誠実に対応します)。
Gmailを送信元ごとに自動でラベル分け · Gmailの新着をSlack・Google Chatに通知 · Gmailの未返信メールを毎朝リマインド · Gmailの受信メールをスプレッドシートに書き出す · Gmailの添付ファイルをドライブに自動保存 · 無料本:GAS×ChatGPT事務自動化の基本