Gmailのメールを自動でラベル分けするGASスクリプト

GASGmail自動化
Gmailのメールを自動でラベル分けするGASスクリプトのサムネイル

はじめに

こんにちは、GASおじです。今回はGmailのメールを自動でラベル分けするGoogle Apps Script(GAS)のスクリプトを紹介します。中小企業の経営者やフリーランスの皆さん、毎日大量のメール管理に悩んでいませんか?手作業でラベルを付けるのは時間も手間もかかるし、うっかり見逃しも起こりやすいですよね。

おじさんが提案するこのスクリプトは、既存のデータを壊さずに新しいスプレッドシートへ結果を出力し、入力検証やバッチ処理も意識しています。しかも追加の専用SaaS料金は不要。Googleアカウントの利用枠内で動かせるのでコストも抑えられます。

では、さっそく始めましょう。

初期設定と必要権限

まずはGASのプロジェクトを作成し、次の権限を設定します。

  • Gmailの読み取り権限(https://www.googleapis.com/auth/gmail.readonly
  • スプレッドシートの作成・編集権限(https://www.googleapis.com/auth/spreadsheets

また、このスクリプトはinstallable trigger(インストール型トリガー)で定期実行が可能です。トリガーの設定はGASエディタの時計アイコンから行ってください。

個人情報の取扱いについて

このスクリプトはGmailのメールデータを処理しますが、外部への送信は一切ありません。スプレッドシートもGoogleアカウント内で管理されるため、管理者権限のある方以外には見えません。安心して使ってください。

Gmailのメールを自動でラベル分けする仕組み

今回のスクリプトは以下の流れで動きます。

  1. Gmailの特定条件のメールを検索
  2. メールごとにラベルを判定
  3. 判定結果を新規作成した日時付きのスプレッドシートに出力
  4. 処理前に入力の検証を行い、不正な条件は処理しない
  5. 既存データは一切消さず、新しいファイルに結果を書き出すことで安全性を確保

これにより、既存のスプレッドシートやメールラベルを誤って消すリスクを回避しています。

コード例:Gmailメールのラベル分け&結果出力

function autoLabelGmail() {
  // ラベル分け条件のサンプル(ここは使う人が自由に編集してください)
  const labelRules = [
    { keyword: '請求書', label: 'Invoice' },
    { keyword: '見積', label: 'Quotation' },
    { keyword: '納品', label: 'Delivery' },
  ];

  // 検索クエリ(過去7日間の未処理メールに限定)
  const query = 'newer_than:7d -label:Processed';
  
  // 入力検証:labelRulesが配列かチェック
  if (!Array.isArray(labelRules) || labelRules.length === 0) {
    Logger.log('ラベルルールの設定が不正です。');
    return;
  }

  // 新規スプレッドシートを作成(日時付き)
  const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
  const ss = SpreadsheetApp.create(`Gmailラベル分け結果_${timestamp}`);
  const sheet = ss.getActiveSheet();

  // ヘッダー行を設定
  sheet.appendRow(['メールID', '件名', '送信者', '受信日時', '判定ラベル']);

  // Gmailスレッドを検索
  const threads = GmailApp.search(query);
  if (threads.length === 0) {
    Logger.log('該当するメールはありません。');
    return;
  }

  // バッチ処理用の書き込みデータを用意
  const rows = [];

  for (const thread of threads) {
    const messages = thread.getMessages();
    for (const message of messages) {
      const subject = message.getSubject() || '';
      const from = message.getFrom() || '';
      const date = message.getDate();
      const id = message.getId();

      // ラベル判定(最初にマッチしたキーワードのラベルを採用)
      let matchedLabel = '未分類';
      for (const rule of labelRules) {
        if (subject.includes(rule.keyword)) {
          matchedLabel = rule.label;
          break;
        }
      }

      // 行データを作成
      rows.push([id, subject, from, date, matchedLabel]);

      // メールに「Processed」ラベルを付与(ラベルがなければ作成)
      const label = GmailApp.getUserLabelByName('Processed') || GmailApp.createLabel('Processed');
      thread.addLabel(label);
    }
  }

  // バッチ書き込みでシートに出力
  sheet.getRange(2, 1, rows.length, rows[0].length).setValues(rows);

  Logger.log(`処理完了。${rows.length}件のメールを${ss.getUrl()}に出力しました。`);
}

ポイント解説

  • 既存データは一切削除しません。結果は新規作成したスプレッドシートに書き込む仕様です。
  • メールには「Processed」ラベルを付けることで、同じメールを何度も処理しないようにしています。
  • バッチ処理で一括書き込みし、処理速度とAPIコール数を抑えています。
  • 入力検証でラベルルールの不備をチェック。不正な設定での誤動作を防ぎます。
  • installable triggerを使えば定期的な自動実行も可能です。

導入コスト削減の試算と注意点

例えば、1通あたりのメール仕分けに手作業で平均30秒かかっているとします。1日50通なら約25分、1ヶ月(20営業日)で約8時間半の作業時間削減です。

  • 時給3000円と仮定すると、1ヶ月あたり約25,500円の労働コスト削減
  • 年間に換算すると約30万円超え

もちろんこれはあくまで仮定の計算式であり、実際の効果は環境や運用次第です。保証や導入実績の提示はしません。

また、Googleアカウントの利用枠内で動作するため、Apps Scriptの実行時間やAPI呼び出し回数の制限には注意してください。過剰なトリガー設定や大規模処理は制限にかかることがあります。

復元手順とトラブル対処法

  • 処理結果は新規のスプレッドシートに書き込まれるため、既存データの誤消去リスクはありません。
  • 万が一スクリプトを修正する前に結果をバックアップしたい場合は、対象のスプレッドシートをコピーしてください。
  • スクリプトの誤動作でメールに不要なラベルが付いた場合、Gmailの検索やフィルタ機能でまとめてラベルを外せます。
  • トリガーを解除したい場合はGASエディタのトリガーページから停止可能です。

まとめ

GASおじが紹介したGmailのメール自動ラベル分けスクリプトは、中小企業やフリーランスの皆さんのメール管理を効率化し、作業時間とコストを抑える助けになります。追加の専用SaaS料金は不要で、Googleアカウントの利用枠内で動作しますが、実行上限に注意しつつ運用してください。

ぜひトリガーを設定して定期実行し、日々のメール仕分けを自動化してみてください。GASを使いこなせば、こうした業務効率化は案外カンタンですよ。


GASおじラボで500ツール使い放題 →
おじさんの作った便利なGASツールをまとめて使いたい方はこちらから!