育休中、意識的にメールを整理しようとしたのがきっかけでした。
通知メール・メルマガ・サービス系メールが混在して、本当に読むべきメールが埋もれる。Gmailのフィルタ機能でラベル付けはできるのですが、ルールが増えるとGmailの設定画面での管理がつらくなってきます。
そこで「スプレッドシートでルールを管理して、GASで自動仕分けする」仕組みを作りました。
この記事でわかること
- Google Apps Script(GAS)でGmailを自動ラベリングする仕組みの作り方
- 仕分けルールをスプレッドシートで管理する設計パターン
- 時間トリガーで定期実行し、受信トレイを自動で整理する手順
完成イメージ
- スプレッドシートの1行 = 1ルール(差出人・条件・分類・メモ)
- GASが定期実行(1時間ごと)→ 未処理メールを読んでルールに一致したら自動ラベリング
- 分類は3種類:
7d(7日後に消す)30d(30日後に消す)keep(残す) reviewedラベルを付けてアーカイブ → 受信トレイがすっきり
スプレッドシートの準備
まず Google スプレッドシートを新規作成し、シート名を「ルール」にします。

| A列:差出人(含む文字列) | B列:条件 | C列:分類 | D列:メモ |
|---|---|---|---|
| amazon.co.jp | 7d | Amazon注文確認 | |
| newsletter@example.com | 30d | メルマガ | |
| mybank.co.jp | 件名に明細を含む | keep | 銀行明細 |
- 差出人:From アドレスに含まれる文字列(部分一致)
- 条件:空欄なら差出人だけで一致。
件名に〇〇を含むで件名追加絞り込み - 分類:
7d/30d/keepの3択 - メモ:自分用の備忘録(処理には使わない)
作成したスプレッドシートのID(URLの /d/XXXXX/edit の XXXXX 部分)をメモしておきます。
GASのコードを書く
Google Apps Script にアクセスし、新しいプロジェクトを作成。以下のコードを貼り付けます。
全体コード
// ===== 設定 =====
var RULES_SHEET_ID = 'ここにスプレッドシートIDを入れる';
var RULES_SHEET_NAME = 'ルール';
var LABEL_CACHE_ = {};
function getOrCreateLabel_(name) {
if (LABEL_CACHE_[name]) return LABEL_CACHE_[name];
const label = GmailApp.getUserLabelByName(name) || GmailApp.createLabel(name);
LABEL_CACHE_[name] = label;
return label;
}
function loadRules_() {
const sheet = SpreadsheetApp.openById(RULES_SHEET_ID).getSheetByName(RULES_SHEET_NAME);
const data = sheet.getDataRange().getValues();
const rules = [];
const validClassifications = ['7d', '30d', 'keep'];
for (let i = 1; i < data.length; i++) {
const row = data[i];
const sender = (row[0] || '').toString().trim();
const condition = (row[1] || '').toString().trim();
const classification = (row[2] || '').toString().trim().toLowerCase();
const memo = (row[3] || '').toString().trim();
if (!sender || !classification) continue;
if (!validClassifications.includes(classification)) continue;
rules.push({ sender, condition, classification, memo });
}
return rules;
}
function classificationToLabels_(classification) {
switch (classification) {
case '7d': return ['reviewed', 'auto-delete/7d'];
case '30d': return ['reviewed', 'auto-delete/30d'];
case 'keep': return ['reviewed', 'keep'];
default: return ['reviewed'];
}
}
function matchesRule_(from, subject, rule) {
if (!from.includes(rule.sender)) return false;
if (!rule.condition) return true;
const m = rule.condition.match(/件名に(.+)を含む/);
if (m) return subject.includes(m[1]);
return false;
}
function autoLabelKnownSenders() {
if (RULES_SHEET_ID === 'ここにスプレッドシートIDを入れる') {
throw new Error('RULES_SHEET_ID が設定されていません。');
}
const rules = loadRules_();
if (rules.length === 0) {
Logger.log('ルールが0件です。スプレッドシートを確認してください。');
return;
}
const threads = GmailApp.search('in:inbox -label:reviewed', 0, 250);
let processed = 0;
for (const thread of threads) {
const firstMsg = thread.getMessages()[0];
const from = firstMsg.getFrom();
const subject = firstMsg.getSubject();
for (const rule of rules) {
if (!matchesRule_(from, subject, rule)) continue;
for (const labelName of classificationToLabels_(rule.classification)) {
thread.addLabel(getOrCreateLabel_(labelName));
}
if (rule.classification !== 'keep') thread.moveToArchive();
Logger.log('[' + rule.classification + '] ' + rule.memo + ' | ' + subject);
processed++;
break;
}
}
Logger.log('完了: ' + processed + '件分類');
}
RULES_SHEET_ID の値を、先ほどメモしたスプレッドシートIDに書き換えてください。
仕組みの解説
① ルール読み込み(loadRules_)
スプレッドシートの2行目以降を読み込み、有効なルールだけを配列に格納します。分類が 7d / 30d / keep 以外の行はスキップします(タイポ防止)。
② ラベルのキャッシュ(getOrCreateLabel_)
Gmailのラベルはまだなければ自動作成します。同じ名前で何度もAPIを叩かないよう、一度取得したラベルをキャッシュしています。
③ マッチング(matchesRule_)
From ヘッダに差出人文字列が含まれているか確認。条件列が 件名に〇〇を含む 形式なら件名も追加チェックします。
④ メイン処理(autoLabelKnownSenders)
in:inbox -label:reviewedで「受信トレイにあり、まだ処理していないスレッド」を最大250件取得- 各スレッドをルールと照合し、一致したらラベルを付与
keep以外はアーカイブ(受信トレイから除去)
時間トリガーを設定する
コードを書いただけでは動きません。定期実行のトリガーを設定します。
- GASエディタの左メニュー「トリガー」(時計アイコン)をクリック
- 「トリガーを追加」→ 以下のように設定:
- 実行する関数:
autoLabelKnownSenders - イベントのソース:時間主導型
- 時間ベースのトリガーのタイプ:1時間おきのタイマー
- 実行する関数:
- 「保存」→ Googleアカウントの権限を承認

これで1時間ごとに自動実行されます。
初回実行・動作確認
トリガーを待たずに手動で試す場合は、エディタ上部の「実行」ボタン(▶)を押します。GASの「実行ログ」に以下のように表示されれば成功です。
[7d] Amazon注文確認 | ご注文の確認 #xxx-xxxxxxx
[keep] 銀行明細 | 2月分のご利用明細
完了: 12件分類

ハマりポイント:Web App API(curl)は諦めた
当初は「Claude Codeからcurlでルールを追加できるようにしたい」と考えて、GASをWeb Appとしてデプロイするコードも書きました(doPost 関数)。
しかしGoogleは2023年以降、Web AppへのAPIアクセスに認証を必須化しており、curlで単純にPOSTする方法は動きません。OAuth2トークンをcurlで取得するフローを実装してみたものの、リダイレクトが絡んで難航。
curl -X POST https://script.google.com/macros/s/xxxx/exec -d "data=..."
# → 302リダイレクト or 認証エラー
最終的には「スプレッドシートを直接編集する」運用に切り替えました。Claude CodeからGoogleシートを操作するMCPを使えばより自動化できますが、それはまた別の話。
教訓:Googleのサービスをcurlで叩くのは2026年現在かなり茨の道。素直にGASのスプレッドシート操作で完結させる方が早い。
まとめ
| 項目 | 内容 |
|---|---|
| 管理方法 | スプレッドシート(1行1ルール) |
| 分類 | 7d(7日)/ 30d(30日)/ keep |
| 実行頻度 | 時間トリガーで1時間ごと |
| 処理件数 | 1回最大250件(実用上は十分) |
ルールをスプレッドシートで管理する利点は、コードを触らずにルールを追加・変更できる点です。同居している家族でも編集できますし、行を追加するだけで即反映されます。
受信トレイが毎日爆発している方はぜひ試してみてください。


コメント