【GAS×Claude】Gmail自動仕分けの方法|請求書・問い合わせをAI分類

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

経理や総務の共有メールアドレスには、請求書の送付、支払状況の確認、社員からの経費の質問、営業メールなどが毎日まとめて届きます。1通ずつ振り分けるだけで、朝の時間が消えてしまいます。Gmailのフィルタ機能も便利ですが、差出人や件名のキーワードだけでは「本文を読まないと分からないメール」をうまく分けられません。

この記事では、GAS(Google Apps Script:Googleのサービスを自動化できるスクリプト環境)からClaude APIを呼び出し、受信メールの内容をAIに読ませて自動でラベル付けする仕組みを解説します。結果はスプレッドシートにも記録します。

対象読者は、Gmail(Google Workspace)を使う経理・総務の担当者や管理職の方です。コピペで動くコード、設定手順、プロンプト例、導入時のチェックリストを載せています。

スポンサーリンク

GASとClaude APIでGmailを自動仕分けする仕組み

今回作るのは、一定間隔で受信メールを確認し、AIの分類結果をGmailのラベルとスプレッドシートに反映する仕組みです。人はラベルごとにメールを処理し、怪しい判定だけを確認します。

処理の流れ

  • 時間主導型トリガー(決まった時刻や間隔でGASを実行する機能)で10〜15分ごとに起動する
  • GmailApp.searchで「未処理」の経理窓口メールを検索する
  • 件名・差出人・本文の冒頭をClaude APIに送り、分類・緊急度・要約をJSONで受け取る
  • 「AI/請求書」のような子ラベルを付け、処理済みラベルも付ける
  • スプレッドシートの「仕分けログ」シートに1行追記する

Gmailのフィルタとの違い

比較項目 Gmailのフィルタ GAS×Claude API
判定の材料 差出人・件名・キーワード 本文の意味まで読んで判断
表記ゆれへの強さ 弱い(条件の追加が必要) 比較的強い
要約・緊急度 できない 同時に出力できる
費用 無料 APIの従量課金が発生
判定の確実さ 条件どおりに動く 誤分類の可能性がある

条件が明確なメールはフィルタで処理し、判断が必要なものだけAIに回すと、費用も誤分類も抑えられます。

Gmail自動仕分けの事前準備(APIキーとラベル設計)

コードを書く前に、APIキーと分類ルールを用意します。

準備の手順

  1. Claude Console(Anthropicの開発者向け管理画面)でAPIキーを発行する
  2. 仕分けログ用のスプレッドシートを作り、「仕分けログ」シートを追加する
  3. 拡張機能メニューの「Apps Script」からエディタを開く
  4. プロジェクトの設定で、スクリプトプロパティにANTHROPIC_API_KEYを登録する
  5. 必要に応じて、モデル名をCLAUDE_MODELとして登録する
  6. Gmailで、AIに回したいメールに「経理窓口」ラベルが付くようフィルタを設定する

APIキーはコードに直接書かず、スクリプトプロパティに保存します。

分類カテゴリは6個前後に絞る

最初は「請求書」「督促・支払確認」「経費・立替」「問い合わせ」「営業・案内」「その他」の6つ程度で始めるのがおすすめです。

各カテゴリの定義を1行で書いておくと、プロンプトにそのまま使えます。

GASからClaude APIを呼び出すコード(コピペ用)

スプレッドシートのApps Scriptエディタに貼り付けて保存してください。

const PROPS = PropertiesService.getScriptProperties();
const API_KEY = PROPS.getProperty('ANTHROPIC_API_KEY');
const MODEL = PROPS.getProperty('CLAUDE_MODEL') || 'claude-haiku-5-5';
const CATEGORIES = ['請求書', '督促・支払確認', '経費・立替', '問い合わせ', '営業・案内', 'その他'];

function classifyInbox() {
  const query = 'label:経理窓口 -label:AI処理済 newer_than:3d';
  const threads = GmailApp.search(query, 0, 20);
  const done = getLabel_('AI処理済');
  const sheet = SpreadsheetApp.getActive().getSheetByName('仕分けログ');
  threads.forEach(function (thread) {
    const msg = thread.getMessages().pop();
    const body = msg.getPlainBody().slice(0, 3000);
    const r = askClaude_(msg.getSubject(), msg.getFrom(), body);
    const cat = r ? r.category : '要確認';
    thread.addLabel(getLabel_('AI/' + cat));
    if (r && r.urgency === '高') thread.markImportant();
    sheet.appendRow([new Date(), msg.getFrom(), msg.getSubject(), cat,
      r ? r.urgency : '', r ? r.summary : '', r ? r.confidence : '']);
    thread.addLabel(done);
  });
}

function askClaude_(subject, from, body) {
  const res = UrlFetchApp.fetch('https://api.anthropic.com/v1/messages', {
    method: 'post',
    contentType: 'application/json',
    headers: { 'x-api-key': API_KEY, 'anthropic-version': '2026-10-21' },
    payload: JSON.stringify({
      model: MODEL,
      max_tokens: 400,
      system: SYSTEM_PROMPT,
      messages: [{ role: 'user', content:
        '件名: ' + subject + '\n差出人: ' + from + '\n本文:\n' + body }]
    }),
    muteHttpExceptions: true
  });
  if (res.getResponseCode() !== 200) {
    console.warn(res.getContentText());
    return null;
  }
  const text = JSON.parse(res.getContentText()).content
    .filter(function (b) { return b.type === 'text'; })
    .map(function (b) { return b.text; }).join('');
  try {
    const json = JSON.parse(text.replace(/```json|```/g, '').trim());
    return CATEGORIES.indexOf(json.category) >= 0 ? json : null;
  } catch (e) {
    return null;
  }
}

function getLabel_(name) {
  return GmailApp.getUserLabelByName(name) || GmailApp.createLabel(name);
}

コードのポイント

  • 処理済みラベルを付けたスレッドは検索条件で除外し、二重処理を防ぎます
  • 本文は先頭3,000文字に絞り、API費用を抑えます
  • AIの回答が想定外のカテゴリなら「AI/要確認」に回し、人が見る前提にします

分類のような軽い処理なら、高速・低価格のモデルで十分なことが多いです。執筆時点(2026年10月)の公式のモデル一覧では、Claude Haiku 5.5(claude-haiku-5-5)が分類や抽出向けの最速モデルとして案内されています。料金やモデル名は変わるため、利用前に公式ドキュメントを確認してください。

anthropic-versionヘッダーの注意点

Claude APIでは、リクエストにanthropic-versionヘッダー(APIの仕様バージョン)を付けます。執筆時点の公式ドキュメントでは、最新版として2026-10-21が推奨されています。このバージョンではtemperatureなどのパラメータが廃止され、送るとエラーになると案内されています。

旧版のコードを流用する場合は、移行ガイドを確認してください。

メール分類の精度を上げるプロンプト例

コードの中で参照しているSYSTEM_PROMPTを、同じファイルの末尾に追加します。AIへの指示を「役割・カテゴリ定義・出力形式・禁止事項」に分けて書くと、回答が安定しやすくなります。

const SYSTEM_PROMPT = [
  'あなたは経理部の共有メール窓口の仕分け担当です。',
  '受信メールを読み、次のカテゴリから1つだけ選んでください。',
  '- 請求書: 請求書・納品書の送付や再送',
  '- 督促・支払確認: 支払期日の超過、入金有無の確認',
  '- 経費・立替: 社員からの経費精算や立替の質問',
  '- 問い合わせ: 取引先や社内からのその他の質問・依頼',
  '- 営業・案内: 広告、セミナー案内、営業メール',
  '- その他: 上記のどれにも当てはまらないもの',
  '緊急度は「高・中・低」で判定。期日や督促の記載があれば高。',
  '本文に書かれていない事実は推測しないでください。',
  '出力は次のJSONのみ。説明文は不要です。',
  '{"category":"","urgency":"","summary":"40字以内","confidence":0.0}'
].join('\n');

confidence(確信度)はAI自身による目安です。「0.6未満は人が確認する」など運用ルールの材料に使います。

誤分類が続く場合は、カテゴリ定義に境界のケースを1行足すと精度が上がります。

トリガー設定とスプレッドシートでの運用ルール

手動実行で数件を試し、ラベルとログが正しく出ることを確かめてから自動実行を設定します。

トリガーの設定手順

  1. エディタでclassifyInboxを選び、手動で1回実行して権限を承認する
  2. 左メニューの「トリガー」から「トリガーを追加」を選ぶ
  3. 実行する関数にclassifyInbox、イベントのソースに「時間主導型」を選ぶ
  4. 間隔を「10分おき」または「15分おき」に設定して保存する
  5. 翌日、仕分けログとGmailのラベルを見比べて誤分類を確認する

GASの割り当て(上限)に注意する

GASには1日あたりの利用上限があります。公式ドキュメントでは、URL Fetchの呼び出しは一般のGoogleアカウントで1日20,000回、Google Workspaceで1日100,000回とされています。また、1回の実行時間は6分までです。

今回のコードは1回の実行を最大20スレッドに絞り、時間切れを防いでいます。

Gmail自動仕分けの導入時の注意点・リスク

メールには取引先や社員の個人情報が含まれます。次の点を社内で確認してください。

  • 外部送信の範囲:本文が外部のAPIに送られます。API経由で送ったデータの扱いを、提供元の規約やプライバシーポリシーで確認し、社内の情報管理規程と照らし合わせます
  • 対象メールの限定:給与・人事・健康情報を扱うアドレスは対象外にするなど、AIに回すメールをラベルで絞ります
  • APIキーの管理:キーはスクリプトプロパティに保存し、エディタの編集権限を持つ人を最小限にします
  • 誤分類への備え:AIは誤った判断や、もっともらしい要約(ハルシネーション)を出すことがあります。ラベルは「目安」と位置づけ、支払判断などは必ず原文で確認します
  • 実行アカウント:トリガーは設定した人の権限で動くため、異動・退職時の引き継ぎ手順を決めておきます

導入前チェックリスト

  • AIに送るメールの範囲を決め、ラベルで絞り込んだか
  • APIの利用について、情報システム部門や上長の承認を得たか
  • 誤分類時の確認ルール(要確認ラベル、確信度の基準)を決めたか
  • APIの月間利用額の上限や、利用状況の確認方法を決めたか

よくある質問(FAQ)

Q1. プログラミング経験がなくても導入できますか?

コードはコピペで動くように書いているため、GASのエディタを開いて貼り付けられれば試せます。最初はテスト用ラベルを作り、数通だけで動作を確認すると安心です。

Q2. ChatGPTやGeminiのAPIでも同じことができますか?

できます。変わるのは、askClaude_関数の中のURL、ヘッダー、リクエストの形式、レスポンスからテキストを取り出す部分です。カテゴリ定義やJSONで返させるプロンプトの考え方はそのまま使えます。社内で契約済みのサービスに合わせて選ぶのが現実的です。

Q3. 自動返信まで任せてもよいですか?

いきなり自動送信するのはおすすめしません。まずは仕分けと要約だけを任せ、慣れてきたらGmailApp.createDraftで返信の下書きを作り、人が確認して送る形にすると安全です。送信の判断は必ず人に残しておきましょう。

まとめ:GAS×Claude APIでGmailの仕分けを任せ、確認に集中する

GASとClaude APIを組み合わせると、本文の意味まで読んだうえでGmailを自動仕分けできます。ポイントは、カテゴリを絞って定義を言葉にすること、JSONで回答させて想定外は「要確認」に回すこと、ログで誤分類を見直すことの3つです。

対象メールの限定やAPIキーの管理も先に決めておきましょう。次のアクションとして、まずはテスト用ラベルを作り、本記事のコードとプロンプトで10通ほど仕分けを試してみてください。精度を確認できたら、トリガーを設定して日々の運用に組み込みましょう。

関連記事

参考リンク

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