【GAS×Claude API】予実管理の差異コメントを自動生成する方法

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

月次決算が締まった後、毎月の予実報告で「差異コメント」を書く作業に時間を取られていませんか。科目ごとに数字を見比べ、担当部署にヒアリングし、経営会議向けの文章に整える作業は、地味ながら負担の大きい仕事です。特に9月末で上期が終わり、下期計画や来期予算の策定が始まる10月は、予実の振り返りが一段と重くなる時期です。

この記事では、Googleスプレッドシートの予実表から、GAS(Google Apps Script:Googleサービスを自動化する仕組み)でClaude APIを呼び出し、差異コメントの「下書き」を自動生成する方法を、コピペで動くコード付きで解説します。

対象読者は、経理・経営企画で予実管理を担当している方、GASを少し触ったことがある非エンジニアの方です。計算はシート、文章化はAIと役割を分けるため、安全に始めやすい構成です。

このブログの読者さんであれば、十分対応できるレベルになっています。

スポンサーリンク
もしも_楽天

GAS×Claude APIで予実管理の差異コメントを自動化するメリット

予実管理(予算と実績を比較し、差異の理由を分析・報告する業務)で時間がかかるのは、計算よりも差異の理由を文章に整える工程です。この「文章化」は生成AIが得意な領域です。

チャット画面に予実表を貼り付ける方法では、毎月の手作業が残り、出力の書式もぶれます。GASからAPIで呼び出す形にすると、次の利点があります。

  • 差異が一定以上の科目だけを抽出し、コメントを一括生成できる
  • プロンプトを固定でき、毎月同じ書式で出力される
  • 生成結果がシートに残り、確認履歴を追いやすい

ポイントは「AIに計算をさせない」ことです。差異額や差異率はスプレッドシートの数式で確定させ、AIには確定した数値と担当者メモだけを渡します。こうすることで、数字の誤りというハルシネーション(AIがもっともらしい誤情報を生成する現象)の典型的なリスクを抑えられます。

予実差異コメント自動生成の全体構成と準備

仕組みはシンプルで、スプレッドシート1枚とGASだけで完結します。処理の流れを文章のフロー図で示すと次のとおりです。

  • 入力:予算と実績をシート「予実」に貼り付ける
  • 計算:差異と差異率をシートの数式で算出する
  • 抽出:GASが「差異率10%以上かつ差異額50万円以上」の行を選ぶ
  • 生成:Claude APIへ数値と担当者メモを送り、コメント案を受け取る
  • 出力:G列にコメント、H列に「要確認」を書き込む
  • 確認:担当者が修正し、H列を「確認済」に変える

シートの列構成

列項目入力方法
A勘定科目手入力または貼り付け
B予算予算表から貼り付け
C実績会計ソフトの試算表から貼り付け
D差異数式「=C2-B2」
E差異率数式「=IF(B2=0,””,D2/B2)」
F担当者メモ各部署へのヒアリング結果を短く記入
GAIコメントGASが自動記入
H確認状況GASが「要確認」を記入、人が「確認済」に更新

あわせて、セルJ1に「2026年9月」のように対象月を入れておきます。

APIキーの準備

Anthropicの開発者向けコンソールでAPIキーを発行します。API利用は従量課金で、料金はモデルごとに異なります。最新の料金は公式サイトをご確認ください。

GASからClaude APIを呼び出す設定手順

ここからは実際の設定手順です。

  1. 予実表のスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」を選びます。
  2. エディタ左側の「プロジェクトの設定」(歯車アイコン)を開きます。
  3. 画面下部の「スクリプト プロパティ」で、プロパティ名「ANTHROPIC_API_KEY」、値に発行したAPIキーを登録します。
  4. エディタに戻り、次章のコード2つを貼り付けて保存します。
  5. 関数「generateVarianceComments」を選んで実行し、初回の権限承認を行います。
  6. G列にコメント、H列に「要確認」が入ることを確認します。

APIキーはコードに直接書かず、スクリプトプロパティに保存します。コードを共有・複製してもキーが漏れにくくなります。

なお、GASには1回の実行あたり6分の実行時間上限があります。科目数が多い場合は、部門ごとにシートを分けるなどで上限内に収めましょう。

コピペで使える予実分析GASコードとプロンプト例

メイン処理(API呼び出し部分)

以下が本体のコードです。閾値(しきいち)は冒頭の定数で変更できます。生成済みの行はスキップするため、再実行しても上書きされません。

const SHEET_NAME = '予実';
const MODEL = 'claude-sonnet-5-5'; // 執筆時点の公式モデルID。利用前に公式で最新を確認
const RATE_LIMIT = 0.1;   // 差異率10%以上
const AMOUNT_LIMIT = 500000; // 差異額50万円以上

function generateVarianceComments() {
  const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
  const rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, 8).getValues();
  const month = sheet.getRange('J1').getDisplayValue();

  rows.forEach((r, i) => {
    const [item, budget, actual, diff, rate, memo, aiComment] = r;
    if (!item || aiComment) return;
    if (Math.abs(rate) < RATE_LIMIT || Math.abs(diff) < AMOUNT_LIMIT) return;

    const prompt = buildPrompt(month, item, budget, actual, diff, rate, memo);
    const text = callClaude(prompt);
    const rowNo = i + 2;
    sheet.getRange(rowNo, 7).setValue(text);
    sheet.getRange(rowNo, 8).setValue('要確認');
    Utilities.sleep(1000);
  });
}

function buildPrompt(month, item, budget, actual, diff, rate, memo) {
  return [
    '対象月:' + month,
    '勘定科目:' + item,
    '予算:' + budget + '円',
    '実績:' + actual + '円',
    '差異(実績-予算):' + diff + '円',
    '差異率:' + (rate * 100).toFixed(1) + '%',
    '担当者メモ:' + (memo || '(なし)')
  ].join('\n');
}

function callClaude(userText) {
  const apiKey = PropertiesService.getScriptProperties().getProperty('ANTHROPIC_API_KEY');
  const payload = {
    model: MODEL,
    max_tokens: 400,
    system: SYSTEM_PROMPT,
    messages: [{ role: 'user', content: userText }]
  };
  const res = UrlFetchApp.fetch('https://api.anthropic.com/v1/messages', {
    method: 'post',
    contentType: 'application/json',
    headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  });
  if (res.getResponseCode() !== 200) {
    return 'エラー:' + res.getResponseCode();
  }
  const body = JSON.parse(res.getContentText());
  return body.content
    .filter(b => b.type === 'text')
    .map(b => b.text)
    .join('');
}

モデルIDは、執筆時点(2026年10月)の公式モデル一覧に掲載の「claude-sonnet-5-5」を例にしています。利用時は公式サイトで最新のIDをご確認ください。

システムプロンプト(出力ルール)

AIへの指示は別の定数にまとめ、同じファイルの末尾に追加します。

const SYSTEM_PROMPT = `あなたは事業会社の経営企画担当です。
与えられた予実データから、月次報告用の差異コメントを作成してください。

# ルール
- 120字以内、です・ます調、1〜2文
- 数値は入力値のみを使い、新しい数値を計算・推測しない
- 差異の要因は「担当者メモ」に書かれた内容だけを根拠にする
- メモがない場合は要因を推測せず「要因は確認中です」と書く
- 「有利差異」「不利差異」を、費用科目か収益科目かを踏まえて正しく使う
- 最後に、来月以降の見通しに触れる場合はメモに根拠があるときだけにする`;

「新しい数値を作らない」「メモにない要因を推測しない」の2点が、このプロンプトの要です。

実際に送られる入力の例

GASは1行ごとに、次のような入力をAPIへ送ります。以下は想定ケースの数値です。

対象月:2026年9月
勘定科目:広告宣伝費
予算:3000000円
実績:3900000円
差異(実績-予算):900000円
差異率:30.0%
担当者メモ:下期キャンペーンの前倒し出稿。10月分予算から振替予定

この入力なら「下期キャンペーンの前倒し出稿により予算比90万円(30.0%)超過。10月分予算から振替予定です。」といった趣旨の下書きが想定されます。出力は実行ごとに変わるため、必ず人が確認してから転記します。

予実管理AIの精度を上げる運用のコツ

担当者メモの書き方をそろえる

AIコメントの質は、F列の担当者メモの質でほぼ決まります。「何が・なぜ・今後どうなるか」の3点を短く書くルールにしましょう。「前倒し出稿/下期キャンペーン開始のため/10月予算から振替」のような書き方で十分です。

閾値は会社の重要性基準に合わせる

差異率10%・差異額50万円はあくまで例です。経営会議で説明が求められる水準に合わせて調整してください。

確認フローをシート上で完結させる

H列をプルダウン(入力規則)にすると、確認漏れが一目で分かります。確認済の行だけを報告資料に転記するルールにすれば、未確認の出力が経営層に届く事故を防げます。

導入時の注意点・リスク

予実データは、未公表の業績情報を含む機密性の高いデータです。バックオフィス目線で、導入前に次の点を必ず確認してください。

  • 社内規程との整合:生成AIの利用ガイドラインで、外部APIへの業績データ送信が認められているか確認します。上場(準備)企業ではインサイダー情報管理規程にも照らします。
  • データの取り扱い:送信データの扱いは提供元の利用規約・プライバシーポリシーで確認し、情報システム部門と合意しておきます。
  • 送信情報の最小化:取引先名や個人名はメモに書かない運用にします。個人別の人件費シートは対象外が安全です。
  • 権限管理:スクリプトの編集権限者はAPIキーも参照できます。共有範囲は担当者に限定してください。
  • ハルシネーション対策:推測を禁止しても誤りはゼロになりません。確認工程は省略しないでください。
  • コスト管理:従量課金のため、コンソール側で利用上限を設定しておくと安心です。

よくある質問(FAQ)

Q1. GASの経験がなくても導入できますか?

コードはコピペで動く形にしているため、スクリプトエディタを開いて貼り付け、APIキーを登録できれば動作します。列構成が記事と異なる場合は列番号の調整が必要です。まず記事と同じ列構成のテスト用シートで動作確認し、その後に本番の予実表へ移すと失敗が少なくなります。

Q2. ChatGPT(OpenAI API)でも同じことはできますか?

できます。考え方は同じで、呼び出すURL、ヘッダー、リクエストの形式をOpenAIの仕様に合わせて書き換えれば動きます。ただし、レスポンスの構造が異なるため、テキストを取り出す部分も修正が必要です。社内で契約済みのAIサービスに合わせるのが規程面でもスムーズです。

Q3. 部門別・月別の予実にも対応できますか?

対応できます。部門別なら、部門ごとにシートを分け、シート名を引数で受け取るよう関数を改修するのが簡単です。月別推移に触れたい場合は、前月差異や累計値も入力に加えます。入力が増えるほどコストも増える点に留意してください。

まとめ:GAS×Claude APIで予実報告を「確認する仕事」に変える

予実差異コメントの作成は、GASとClaude APIを組み合わせることで「ゼロから書く仕事」から「下書きを確認する仕事」に変えられます。ポイントは、計算はシートの数式で確定させ、AIには文章化だけを任せることです。担当者メモを根拠に限定し、確認フローを残すことも欠かせません。

次のアクションとして、まずは前月の予実表をコピーしたテスト用シートで、本記事のコードを動かしてみてください。プロンプトと閾値を調整し、自社の報告スタイルに合う形が固まったら、下期の月次報告から本番運用に切り替えるのがおすすめです。

関連記事

参考リンク

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