【GAS×Claude】督促メールの自動化|未入金リマインドを下書き作成

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

「支払期日を過ぎた請求書があるのに、督促メールを書く時間がない」。経理担当者なら一度は感じる悩みではないでしょうか。督促は取引先との関係に配慮が必要で、文面づくりに意外と時間がかかります。後回しにすると回収が遅れ、資金繰りや月次の売掛金残高確認にも影響します。

この記事では、GAS(Google Apps Script:Googleのサービスを自動化するプログラム)とClaude APIを組み合わせ、督促メールを自動作成する方法を解説します。スプレッドシートの売掛金台帳から未入金の請求を抽出し、経過日数に応じた文面をAIが作成します。そのうえでGmailの下書きに保存する仕組みです。送信は人が確認してから行うため、誤送信のリスクを抑えられます。

対象は、売掛金管理を担当する経理・総務の方です。コードはコピペで使えます。

スポンサーリンク

GASで督促メールを自動化する全体像とメリット

ポイントは「AIに書かせるのは文面だけ」「金額や期日はプログラムが差し込む」「送信は人が行う」の3点です。この役割分担で、AIの誤記を防ぎつつ手間を減らせます。処理の流れは次のとおりです。

  • トリガー:毎朝決まった時刻にGASを自動実行する
  • 抽出:台帳から未入金かつ期日超過の行を探す
  • 段階判定:経過日数で督促の段階(1〜3)を決める
  • 文面生成:Claude APIが件名と本文のひな形を作る
  • 差し込み:取引先名や金額などをGASが埋め込む
  • 下書き保存:Gmailの下書きに保存し、台帳に記録する

段階ごとのトーンは次の表のように設計します。日数は一例なので、自社の与信方針に合わせて調整してください。

段階 経過日数の例 文面のトーン 確認者
1(お知らせ) 期日後3日以上 行き違いの可能性に配慮した丁寧な確認 経理担当
2(再確認) 期日後14日以上 入金予定日の回答をお願いする 経理担当+営業担当
3(重要なお願い) 期日後30日以上 事実を明確に伝え、期限を区切って対応を求める 経理責任者

段階3を超える長期滞留は、責任者や営業担当が直接対応する領域です。仕組みは「初期対応の抜け漏れをなくす道具」と位置づけましょう。

準備するもの|売掛金台帳のスプレッドシートとClaude APIキー

売掛金台帳の列構成

シート名を「売掛金台帳」とし、1行目を見出しにして次の列を用意します。

  • A〜D列:請求書番号、取引先名、担当者名、メールアドレス
  • E〜F列:請求金額(税込・数値)、支払期日(日付形式)
  • G〜H列:入金済、除外(係争中・分割合意済みなど)。どちらもチェックボックス
  • I〜J列:督促段階、下書き作成日(GASが自動で記入)

APIキーとスクリプトプロパティの設定手順

  1. Claudeの開発者向けコンソール(platform.claude.com)でAPIキーを発行する
  2. スプレッドシートの「拡張機能」→「Apps Script」でエディタを開く
  3. 左メニューの「プロジェクトの設定」→「スクリプト プロパティ」を開く
  4. ANTHROPIC_API_KEY にAPIキー、CLAUDE_MODEL にモデルIDを登録する
  5. CC_ADDRESS に経理の共有アドレスを登録する(任意)

APIキーはコードに直接書かないでください。モデルIDは執筆時点(2026年11月)の公式情報では claude-sonnet-5-5 などです。最新のIDは公式サイトでご確認ください。

GASでClaude APIを呼び出し督促メールを生成するコード

次のコードを貼り付けます。AIには取引先名や金額を渡さず、差し込み用の記号入りのひな形だけを作らせます。

const PROPS = PropertiesService.getScriptProperties();
const SYSTEM_PROMPT = 'あなたは経理担当者です。入金確認メールのひな形を' +
  'JSONのみで {"subject":"...","body":"..."} の形式で返してください。';

function createDunningDrafts() {
  const sheet = SpreadsheetApp.getActive().getSheetByName('売掛金台帳');
  const rows = sheet.getDataRange().getValues();
  const today = new Date();
  for (let i = 1; i < rows.length; i++) {
    const [no, company, person, email, amount, due, paid, skip, lastStage] = rows[i];
    if (paid === true || skip === true || !email) continue;
    const days = Math.floor((today - new Date(due)) / 86400000);
    const stage = getStage(days);
    if (stage === 0 || stage <= Number(lastStage || 0)) continue;

    const tpl = generateTemplate(stage, days);
    const values = {
      '{{取引先名}}': company, '{{担当者名}}': person, '{{請求書番号}}': no,
      '{{金額}}': Number(amount).toLocaleString('ja-JP') + '円',
      '{{支払期日}}': Utilities.formatDate(new Date(due), 'Asia/Tokyo', 'yyyy年M月d日')
    };
    const subject = fill(tpl.subject, values);
    const body = fill(tpl.body, values);
    if (/\{\{.+?\}\}/.test(subject + body)) throw new Error('未置換の項目: ' + no);

    GmailApp.createDraft(email, subject, body, { cc: PROPS.getProperty('CC_ADDRESS') || '' });
    sheet.getRange(i + 1, 9, 1, 2).setValues([[stage, new Date()]]);
  }
}

function getStage(days) {
  if (days >= 30) return 3;
  if (days >= 14) return 2;
  if (days >= 3) return 1;
  return 0;
}

function fill(text, values) {
  return Object.keys(values).reduce((t, k) => t.split(k).join(values[k]), text);
}

function generateTemplate(stage, days) {
  const res = UrlFetchApp.fetch('https://api.anthropic.com/v1/messages', {
    method: 'post',
    contentType: 'application/json',
    headers: {
      'x-api-key': PROPS.getProperty('ANTHROPIC_API_KEY'),
      'anthropic-version': '2026-10-21'
    },
    payload: JSON.stringify({
      model: PROPS.getProperty('CLAUDE_MODEL'),
      max_tokens: 1500,
      system: SYSTEM_PROMPT,
      messages: [{ role: 'user', content: buildPrompt(stage, days) }]
    }),
    muteHttpExceptions: true
  });
  if (res.getResponseCode() !== 200) throw new Error(res.getContentText());
  const text = JSON.parse(res.getContentText()).content
    .filter(b => b.type === 'text').map(b => b.text).join('')
    .replace(/```json|```/g, '').trim();
  return JSON.parse(text);
}

ポイントは、段階が上がったときだけ下書きを作ることです。同じ段階の下書きが毎日重複して作られません。また、記号が置換されずに残った場合は処理を止め、崩れた文面が取引先へ届くのを防ぎます。anthropic-version は執筆時点の公式リファレンスに合わせています。エラー時は公式ドキュメントをご確認ください。

督促メールの文例を安定させるプロンプト設計

次の関数を同じスクリプトに追加します。段階ごとのトーンと、書いてはいけない内容を明示するのがコツです。

function buildPrompt(stage, days) {
  const tone = {
    1: '期日超過を丁寧に知らせ、行き違いならご容赦いただく一文を入れる。',
    2: '前回の案内に触れ、入金予定日の返信をお願いする。',
    3: '長期未入金の事実を明確に伝え、1週間以内の連絡を求める。威圧的な表現は避ける。'
  }[stage];
  return [
    '以下の条件で、入金確認メールの件名と本文のひな形を作成してください。',
    '・督促段階:' + stage + '(期日からの経過日数:' + days + '日)',
    '・トーン:' + tone,
    '・宛名は「{{取引先名}} {{担当者名}}」とする',
    '・請求書番号は{{請求書番号}}、金額は{{金額}}、期日は{{支払期日}}と記号で書く',
    '・具体的な金額や日付、社名を自分で作らない',
    '・遅延損害金、法的措置、取引停止には触れない',
    '・本文は400字以内、署名は「経理部」のみ'
  ].join('\n');
}

プロンプトで押さえる3つのルール

  • 事実はAIに作らせない:金額や日付は記号で書かせ、台帳の値をプログラムで差し込む
  • 法的な表現を禁止する:遅延損害金や法的措置への言及は、契約内容を確認したうえで人が書き加える
  • 段階ごとにトーンを固定する:指示がないと、初回なのに強すぎる文面が出ることがある

未入金リマインドの自動化手順とGmail下書きの承認フロー

動作確認は、本番の台帳ではなくテスト用のシートで行うのが安全です。

  1. テスト用に台帳をコピーし、メールアドレスを自分宛てに書き換える
  2. エディタで createDunningDrafts を選び「実行」を押す
  3. 初回は権限の承認画面で内容を確認して許可する
  4. Gmailの下書きと置換漏れの有無を確認する
  5. 「トリガー」で時間主導型・毎朝9時台の実行を追加する

本番運用では、送信前に次のチェックリストで下書きを確認します。

  • 当日朝の入金明細と照合し、入金済みの見落としがないか
  • 宛名・金額・期日が台帳と一致しているか
  • 分割払いの合意など、営業側の個別事情がないか
  • 段階3の文面は経理責任者が確認したか
  • 送信後、対応履歴を台帳の備考に残したか

なお、執筆時点の公式情報では、GASの1回の実行は6分までです。URL Fetchの回数にも1日あたりの上限があります。件数が多い場合は分割実行を検討してください。

導入時の注意点・リスク|情報管理と誤送信対策

督促は取引先との信頼関係に直結します。導入前に次の点を確認しましょう。

情報漏えい・個人情報への配慮

今回のコードがAPIに送るのは督促段階と経過日数だけで、取引先名や担当者名は送りません。外部に渡す情報を最小限にする設計が大切です。データの取り扱いは提供元の規約を事前に確認してください。

ハルシネーションと誤送信

ハルシネーションとは、AIが事実と異なる内容をもっともらしく出力する現象です。差し込み方式で数値の誤りは防げますが、文面のニュアンスは保証できません。必ず人が確認してから送りましょう。

権限管理と社内規程

下書きはスクリプトを実行したアカウントのGmailに作られます。経理の共有アカウントで運用すると引き継ぎが楽です。APIキーや台帳を編集できる人は限定し、生成AIの社内ガイドラインがあればその範囲内で使いましょう。

よくある質問(FAQ)

Q. 下書きではなく自動送信にしてもよいですか?

GmailApp.sendEmail に置き換えれば自動送信できます。ただし、入金の行き違いや個別の支払合意があっても督促が届いてしまいます。関係悪化を避けるため、運用が安定するまでは下書き保存と人の確認を推奨します。

Q. Claude以外の生成AI(GeminiやChatGPT)でも作れますか?

作れます。変更が必要なのは generateTemplate 関数のエンドポイント、認証ヘッダー、リクエストの形式、レスポンスの読み取り部分です。差し込み方式や段階判定のロジックはそのまま使えます。社内で契約済みのAIサービスがあれば、そちらに合わせるのが管理面でも効率的です。

Q. 入金済みのチェックを手作業で付けるのが大変です

入金済みの更新が遅れると、入金済みの取引先に督促が届く原因になります。銀行明細と請求データを照合する入金消込を先に自動化しておくと、督促の精度も上がります。会計ソフトの売掛金残高をエクスポートし、毎朝台帳を更新する運用も選択肢です。

まとめ|督促メール自動化は「AIは文面、人は判断」で始める

GASとClaude APIを使えば、売掛金台帳から未入金の請求を抽出し、段階に応じた督促メールの下書きを毎朝自動で用意できます。成功のポイントは、金額や期日をAIに書かせずプログラムで差し込むこと、法的な表現を禁止すること、送信前に人が確認することの3つです。

まずはテスト用の台帳で段階1の下書きだけを作り、文面のトーンが自社に合うかを確かめてみてください。次のアクションとして、入金消込の自動化と組み合わせると、売掛金管理全体の抜け漏れをさらに減らせます。

関連記事

参考リンク

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