【GAS】Gmailの受信トレイをスプレッドシートのルールで自動仕分けする方法

IT
この記事は約8分で読めます。

育休中、意識的にメールを整理しようとしたのがきっかけでした。

通知メール・メルマガ・サービス系メールが混在して、本当に読むべきメールが埋もれる。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.jp7dAmazon注文確認
newsletter@example.com30dメルマガ
mybank.co.jp件名に明細を含むkeep銀行明細
  • 差出人:From アドレスに含まれる文字列(部分一致)
  • 条件:空欄なら差出人だけで一致。件名に〇〇を含む で件名追加絞り込み
  • 分類7d / 30d / keep の3択
  • メモ:自分用の備忘録(処理には使わない)

作成したスプレッドシートのID(URLの /d/XXXXX/editXXXXX 部分)をメモしておきます。

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 以外はアーカイブ(受信トレイから除去)

時間トリガーを設定する

コードを書いただけでは動きません。定期実行のトリガーを設定します。

  1. GASエディタの左メニュー「トリガー」(時計アイコン)をクリック
  2. 「トリガーを追加」→ 以下のように設定:
    • 実行する関数:autoLabelKnownSenders
    • イベントのソース:時間主導型
    • 時間ベースのトリガーのタイプ:1時間おきのタイマー
  3. 「保存」→ Googleアカウントの権限を承認
GASトリガー設定画面

これで1時間ごとに自動実行されます。

初回実行・動作確認

トリガーを待たずに手動で試す場合は、エディタ上部の「実行」ボタン(▶)を押します。GASの「実行ログ」に以下のように表示されれば成功です。

[7d] Amazon注文確認 | ご注文の確認 #xxx-xxxxxxx
[keep] 銀行明細 | 2月分のご利用明細
完了: 12件分類
GAS実行ログの出力例

ハマりポイント: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件(実用上は十分)

ルールをスプレッドシートで管理する利点は、コードを触らずにルールを追加・変更できる点です。同居している家族でも編集できますし、行を追加するだけで即反映されます。

受信トレイが毎日爆発している方はぜひ試してみてください。

コメント

タイトルとURLをコピーしました