使ってみようAI
面倒なフォーマット設定はもう不要!バラバラなフォーマットの請求書をGoogleスプレッドシート×Geminiで自動データ化

フォーマット設定はもう不要!Googleスプレッドシート×AI(Gemini)で実現する、一番安くて賢い「請求書自動データ化」の仕組み

こんにちは。いわてデジタル活用室(運営:株式会社システムエンジニアリング)の開発担当です。
ペーパーレス化やインボイス制度への対応で、社内に「デジタル請求書(PDF)」や「スキャンした画像」が増えていませんか?

「手入力を無くしたい」と考え、数年前にOCR(文字認識)ツールを検討、あるいは導入したものの、結局やめてしまった……という企業様の話をよく耳にします。
なぜ従来のOCRは定着しなかったのでしょうか? 理由は明確です。
「取引先ごとにフォーマットが異なるため、事前の位置設定や調整がめちゃくちゃ面倒だったから」です。

新しく取引が始まるたびに、画面上で「ここは金額、ここは会社名……」と読み取り位置をマウスで囲んで設定し直す。少しでもレイアウトがズレたら誤認識する。「これなら手入力した方が早いのでは?」と諦めてしまうのも無理はありません。

しかし、今はAIの時代です。そんな面倒な調整は、すべて過去のものになります。

今回は、初期費用もサーバー維持費もほぼゼロ、しかも時間をかけずに導入できる
「一番賢くて安上がりな請求書自動データ化の仕組み」をご紹介します。

最新AI「Gemini」×スプレッドシートで何が変わるのか?

これまでのOCRは、画面の「位置」で文字を識別していました。
しかし、最新の生成AI(今回はGoogleのGemini 2.5 Flashを使用)は、人間と同じように「パッと見て、文脈で意味を理解」します。

そのため、

  • 取引先ごとにレイアウトがバラバラでも
  • 事前の位置設定を一切していなくても

AIに画像をぽいっと渡すだけで、「これが会社名だな」「これが合計金額だな」と自動で判別し、使い慣れたGoogleスプレッドシートの正しい列へ綺麗に仕分けてくれるのです。

驚きのポイント:和暦(令和)すら気にする必要なし!

実務で非常に助かるのが、日付の表記揺れへの対応です。
請求書に「令和8年6月8日」と書かれていても、「R8.6.8」と書かれていても、
システム側に面倒な変換ロジックを1行も書くことなく、AIが気を利かせて自動的に「2026/06/08(西暦)」に翻訳して格納してくれます。

【3分で試せる】自動データ化を実行するサンプルコード

実際にGoogleドライブ内の請求書画像を読み込んでスプレッドシートに書き出す、最小限のサンプルコード(GAS:Google Apps Script)を作成しました。

Googleアカウント(無料版でも可)をお持ちであれば、スプレッドシートの「拡張機能」➔「Apps Script」に以下のコードを貼り付けるだけで今すぐテスト可能です。
※事前に「Google AI Studio」から無料のAPIキーを取得し、テストする請求書画像のファイルIDを用意してください。

/**
 * Gemini APIを使って請求書画像をOCR解析し、スプレッドシートに書き込む
 */
function geminiInvoiceOCR() {
  // --- 【設定部分】ここを書き換えてください ---
  const API_KEY = 'YOUR_GEMINI_API_KEY'; // 発行したAPIキーを入力
  const FILE_ID = 'YOUR_IMAGE_FILE_ID'; // テストするGoogleドライブの画像ファイルID
  // --------------------------------------------

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // 1. Googleドライブから画像ファイル(Blob)を取得
  const file = DriveApp.getFileById(FILE_ID);
  const imageBlob = file.getBlob();
  const base64Image = Utilities.base64Encode(imageBlob.getBytes());
  const mimeType = imageBlob.getContentType();

  // 2. Geminiへのプロンプト(指示文)を設定
  const prompt = "添付された請求書の画像から、以下の4つの項目を正確に抽出してください。フォーマットは問いません。\n" +
                 "必ず指定のJSON形式のみで返答してください。余計な解説テキストや ```json などのマークダウン装飾は一切不要です。\n\n" +
                 '{"company_to": "請求先名","company_from": "請求元名", "amount": 10000(金額を数値で), "date": "請求日(YYYY/MM/DD形式)", "dueDate": "振込期限(YYYY/MM/DD形式)"}';

  // 3. 正しいAPIリクエストURL(モデル名は url の中に含める)
  const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=${API_KEY}`;

  
  // 4. APIリクエストのデータ構造(Payload)を作成
  const payload = {
    "contents": [{
      "parts": [
        { "text": prompt },
        {
          "inlineData": {
            "mimeType": mimeType,
            "data": base64Image
          }
        }
      ]
    }]
  };

  const options = {
    "method": "post",
    "contentType": "application/json",
    "payload": JSON.stringify(payload),
    "muteHttpExceptions": true
  };

  // 5. Gemini APIを叩く
  const response = UrlFetchApp.fetch(url, options);
  const responseData = JSON.parse(response.getContentText());
  
  // 6. 返ってきたテキスト(JSON)をパースしてスプレッドシートへ書き込み
  try {
    let jsonText = responseData.candidates[0].content.parts[0].text.trim();
    
    // 万が一 ```json などのマークダウンが混ざった場合の防御策
    jsonText = jsonText.replace(/^```json\s*/i, '').replace(/```$/, '').trim();
    
    const result = JSON.parse(jsonText);
    
    // スプレッドシートの最終行にデータを追加
    sheet.appendRow([
      new Date(),       // 実行日時
      result.company_to,     // 請求先名
      result.company_from,   // 請求元名
      result.amount,    // 金額
      result.date,      // 請求日
      result.dueDate    // 振込期限
    ]);
    
    Logger.log("書き込み成功: " + jsonText);
  } catch(e) {
    Logger.log("エラーが発生しました。リクエスト応答: " + response.getContentText());
  }
}

【実際の実行結果】

サンプルとして、次のような請求書の画像を使用しました。

サンプルコードのGASを実行すると、次のようにスプレッドシートにデータが書き込まれます。

Geminiの無料版は一時的に混雑する場合があります
世界中で同時に無料版API(Gemini 2.5 Flashなど)へのリクエストが集中したとき、Geminiからの返却はエラーコード 503 、ステータス "UNAVAILABLE"(利用不可)となります。
"This model is currently experiencing high demand. ... Please try again later."
(意訳:このモデルは現在、非常に需要が高まっています。一時的なものなので、少し時間を空けてからもう一度お試しください)

今すぐできる対策
1. 少し時間を置いて「実行」してみる
1〜2分ほど待ってから、もう一度GASの「実行」ボタンを押してみてください。Google側の混雑の波が引いていれば、すんなり通ってスプレッドシートにデータが書き込まれます。
2. モデルを一つ前の「安定版」に変えてみる(混雑回避)
もし何度やっても503エラーが続く場合は、最新の2.5モデルが世界中で混み合っている可能性があります。
その場合は、現在最も普及していてサーバーが安定している一世代前のモデル gemini-2.0-flash に一時的に書き換えることで、混雑を回避して動くことがあります。
// 【現在のコード】
const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=${API_KEY}`;
「2.5」を「2.0」に書き換えます
// 【修正後のコード】
const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${API_KEY}`;

肝は「Geminiへのプロンプト(指示文)」にあり!

プログラムコード自体は非常にシンプルですが、実務で使えるレベルにするための最大の肝は、コード内(19行目付近)にある「AIへのプロンプト(指示文)」の書き方にあります。

ただ漠然と「請求書を読み取って」と指示するだけでは、AIは「丁寧な挨拶文」や「余計な解説」を付けて返してきてしまいます。それではプログラムがエラーを起こし、スプレッドシートに自動入力できません。

そこで、プロントを以下のように厳密に設計しています。

添付された請求書の画像から、以下の4つの項目を正確に抽出してください。フォーマットは問いません。
必ず指定のJSON形式のみで返答してください。余計な解説テキストや ```json などのマークダウン装飾は一切不要です。

{"company": "取引先名", "amount": 10000(金額を数値で), "date": "請求日(YYYY/MM/DD形式)", "dueDate": "振込期限(YYYY/MM/DD形式)"}

プログラムが処理しやすい形(JSON)に徹底的に縛る

ポイントは、AIに「指定したJSON形式(システムが読み込めるデータ構造)以外、1文字も喋るな」と厳しく釘を刺している点です。

さらに、金額は「〇〇円」という文字ではなく「数値(10000)」で返すこと、日付は「令和〇年」ではなく「西暦(YYYY/MM/DD)」で返すことをプロンプト内で明確に定義しています。

この「AIの機嫌をコントロールし、システムが誤動作しないデータを吐き出させるプロンプトの技術」こそが、開発会社である当社のノウハウであり、実務で使えるシステムにするための本当の境界線なのです。

よくある疑問:「AI関数」ではなく、なぜプログラミング(GAS)?

「最近のスプレッドシートなら、最初からAI関数(GEMINI関数など)が使えるよね?わざわざプログラミング(GAS)をする必要はあるの?」と思われるかもしれません。

確かに文章の要約や翻訳なら関数が手軽ですが、実務の「請求書OCR」においては、以下の理由からGASを使って裏側で仕組み化する方が圧倒的に有利です。

  1. ファイル操作の自動化:
    関数だけでは「Googleドライブの画像を開いて中身を解析する」という一連の自動フローを作ることができません。
  2. 無料枠を使い切ってしまう「再計算」のリスク:
    今回ご紹介したGemini API(無料版)には、「1分間に15回まで」という無料枠の制限があります。社内の検証や通常の業務で使う分には、この回数を超えることはまずありません。 しかし、スプレッドシートの「関数」は、シートを開いたり、別のセルを編集したりするたびに、すでに読み込み終わったセルまで「すべて同時に再計算(AIへの再問い合わせ)」が走ってしまう性質があります。 もしシートに30件の請求書データが並んでいた場合、1箇所セルを書き換えただけで、一瞬で30回(1分間の無料制限オーバー)の問い合わせが発生し、エラーで画面が動かなくなってしまうのです。※有料版APIの場合、これがそのまま無駄な課金に繋がります。

GASであれば、「ボタンを押した時だけ」「新しいファイルが届いた時だけ」ピンポイントで1回だけAIを動かし、結果を確定データとしてセルに書き込めるため、無料枠の範囲内で最も安全に、安定して運用することができます。

まとめ:実務で本当に使えるシステムへ育てるには?

今回ご紹介したコードは「1枚の画像を指定して処理する」実験用のシンプルなものです。
これを本物の実務で使える業務システムに変えるには、以下のような「次の一手」の拡張が必要になります。

  • フォルダ内に溜まった複数枚の請求書を、夜間にまとめて一括自動処理する
  • 処理が終わった請求書ファイルを、自動で「処理済みフォルダ」へ移動させて二重処理を防ぐ
  • エラーで読み込めなかったファイルだけを管理者にメールで通知する

これらはすべて、GASの技術で実装できます。

高額な専用OCRソフトを契約する前に、まずは使い慣れたスプレッドシートと最新AIで、自社専用の格安な自動化システムを作ってみませんか?

【資料ダウンロード&お問い合わせ案内】

無料ダウンロード資料

この記事でご紹介した仕組みを、実際の現場で稼働させるためのステップをまとめた
『Googleスプレッドシート×Geminiで実現する、請求書データ化「実務運用」拡張ガイド(PDF)』
は、こちらからダウンロードできます。

    あなたの会社の請求書で「無料読み取りテスト」実施中!

    「うちの取引先の請求書でも、本当に読み取れる?」と気になった方は、ぜひお気軽にお問合せください。
    当社の検証環境で実際にデータ化し、その精度を確かめられる「無料レポート」をお届けいたします。

    Google Workspaceの導入や活用に関するご相談を承っております。
    導入から運用までトータルでサポートし、貴社の業務環境に合わせた最適な活用方法をご提案いたします。
    「自社に合った使い方を知りたい」「スムーズに導入したい」など、まずはお気軽にご相談ください。

    この記事は役に立ちましたか?

    参考になりましたら、下のボタンで教えてください。

    コメント

    この記事へのトラックバックはありません。

    PAGE TOP
    ログイン