実験トップ

GAS×Gmail · 登録不要 · コード全文

Gmailを送信元ごとに
自動でラベル分けする(GAS)。

取引先ごと・サービスごとにメールをラベルで分けたい。Gmailの「フィルタ」でもできますが、取引先が数十社になると設定画面で管理しきれず、過去のメールには付け直しの手間もかかります。このページでは Google Apps Script(GAS)で、スプレッドシートの一覧表に書いた「送信元 → ラベル」のとおりに自動でラベルを付ける仕組みを作ります。

1. Gmailのフィルタとの使い分け

こんなときおすすめ
振り分けが数件で、今後届くメールだけでよいGmail標準のフィルタで十分です(設定 → フィルタとブロック中のアドレス)
取引先が多く、一覧表で管理・共有したいこのページのGAS
過去のメールにもまとめて同じラベルを付けたいこのページのGAS(初回だけ全期間を処理)
付けた件数を確認してから本番にしたいこのページのGAS(お試しモード)

2. 手順

  1. Googleスプレッドシートを新しく作り、シート名を「ルール」にします。1行目は見出し、2行目から下の表のように書きます。
  2. メニュー「拡張機能」→「Apps Script」を開き、下のコードを貼り付けて保存します。
  3. DRY_RUN = true のまま ▶ で sortBySender を実行し、Gmailとスプレッドシートへのアクセスを許可します。実行ログに「[お試し] @a-sha.co.jp → 取引先/A社: 12件」のように出ます。
  4. 過去のメールにも付けたい場合は、LOOKBACK = '' にして DRY_RUN = false で1回実行します(件数が多いと数回に分かれます)。
  5. LOOKBACK = 'newer_than:2d' に戻して保存し、左の時計アイコン「トリガー」→ 関数 sortBySender・「時間主導型」・「分ベースのタイマー」・「15分おき」で保存します。
送信元(A列)ラベル(B列)受信トレイから外す(C列)
@a-sha.co.jp取引先/A社FALSE
billing@example-cloud.com請求TRUE
news.example-shop.jpメルマガTRUE

送信元はメールアドレス(info@…)でもドメイン(@a-sha.co.jp)でも書けます。ラベル名に「/」を入れると「取引先」の下に「A社」がまとまります。C列を TRUE にした行は、ラベルを付けたうえで受信トレイから外します(削除はしません)。

3. コード全文(コピペで動きます)

const DRY_RUN = true;                  // まずは true のまま実行し、ログで対象を確認する
const SHEET_NAME = 'ルール';            // A列: 送信元  B列: ラベル名  C列: 受信トレイから外す(TRUE/FALSE)
const LOOKBACK = 'newer_than:2d';      // 定期実行で見る範囲。過去のメールにも付けたい初回だけ '' にする
const BATCH = 100;                     // GmailApp の一括操作は1回100件まで
const TIME_LIMIT_MS = 4.5 * 60 * 1000; // 6分制限の手前で止め、続きは次回

function sortBySender() {
  const lock = LockService.getScriptLock();
  if (!lock.tryLock(10000)) return;
  const start = Date.now();
  try {
    const rows = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME).getDataRange().getValues().slice(1);
    for (const [rawSender, rawLabel, rawSkip] of rows) {
      const sender = String(rawSender).trim(), labelName = String(rawLabel).trim();
      if (!sender || !labelName) continue;
      // 空白や OR などが入ると検索式が広がるので、メールアドレス・ドメインの形だけ受け付ける
      if (!/^[A-Za-z0-9._%+\-]*@?[A-Za-z0-9.\-]+\.[A-Za-z]{2,}$/.test(sender)) {
        console.warn('送信元の書き方が不正なのでスキップ: ' + sender); continue;
      }
      const skipInbox = rawSkip === true || String(rawSkip).toUpperCase() === 'TRUE';
      const q = 'from:(' + sender + ')' + (LOOKBACK ? ' ' + LOOKBACK : '');
      const label = DRY_RUN ? null : (GmailApp.getUserLabelByName(labelName) || GmailApp.createLabel(labelName));
      let offset = 0, labeled = 0, archived = 0;
      while (Date.now() - start < TIME_LIMIT_MS) {
        const threads = GmailApp.search(q, offset, BATCH);
        if (!threads.length) break;
        offset += threads.length;   // ラベルを付けても検索結果は変わらないので、そのまま次へ進む
        const todo = threads.filter(t => !t.getLabels().some(l => l.getName() === labelName));
        const toArchive = skipInbox ? todo.filter(t => t.isInInbox()) : [];
        labeled += todo.length; archived += toArchive.length;
        if (DRY_RUN) continue;
        if (todo.length) label.addToThreads(todo);
        if (toArchive.length) GmailApp.moveThreadsToArchive(toArchive);
      }
      console.log((DRY_RUN ? '[お試し] ' : '') + sender + ' → ' + labelName + ': ' + labeled + '件' +
        (skipInbox ? '(うち受信トレイから外す ' + archived + '件)' : ''));
      if (Date.now() - start >= TIME_LIMIT_MS) { console.log('時間切れ。続きは次回の実行で処理します'); break; }
    }
  } finally {
    lock.releaseLock();
  }
}

4. このコードが防いでいる4つの失敗

5. よくあるつまずき

ラベルは付いたのに受信トレイに残っている:C列が TRUE になっているか確認してください。セルに「はい」などと書くと FALSE 扱いです。
関係ないメールまで付いた:gmail.com のように多くの人が使うドメインを書くと、その全員が対象になります。Gmailなどのフリーメールはアドレス単位で書いてください。付いたラベルはGmailでまとめて外せます。
「お試し」の件数が0件:送信元の表記を、実際のメールの差出人アドレスと比べてください。Gmailの検索窓に from:(@a-sha.co.jp) と入れて結果が出るかで確かめられます。
会社のGoogle Workspaceで使う:スクリプトからGmailへのアクセスが管理者に制限されている場合があります。

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事務自動化の基本

AI Revenue Experiment の用途解説ページです。導入実績や効果測定の結果ではありません。