Google Apps ScriptとGeminiで請求書データを全部抽出する【GAS】

以前、AppSheet + Google Apps Script + Gemini APIで請求データをOCRして請求書データを引き抜くものを作成しました。しかし、前回のエントリーでは請求明細までは取得出来ていませんでした。

また、2025年4月9日にAppSheet Enterprise Plusライセンス向けに、AI Taskと呼ばれる新機能が追加され、簡単に請求書のデータを抽出出来るようになったものの、やはり請求明細については簡単に取り出せず。そこで、今回は前回の課題である「請求明細」まで含めた全データを抽出してスプシに書き出すものを、Gemini APIを利用して構築してみました。

今回利用するスプレッドシート等

今回は、現在まだプレビューリリース段階のGemini 2.5 ProのAPIを使って、データを生成AI経由でOCRにかけて、請求書データおよびその中にある請求明細データを一度に取得して、請求書および明細のシートにそれぞれ一括で書き出すものを作成しています。

途中まではAppSheetでアップしたPDFをGeminiでOCRと同じですが、今回のコードはスプシで利用することを前提としています。加工し直せばAppSheetでも十分利用することが可能です。その為、前回とは少々コードを変えていますので注意。

AppSheetのAI Taskで8時間頭捻って明細が結局スマートに取得出来なかったのが、GASだと1時間で簡単に構築出来ました。ノーコードツールは楽な面は楽ですが、やはりちょっと踏み込むとすぐに限界に達するのが難点。

AppSheetでアップしたPDFをGeminiでOCR

Google Apps ScriptでGeminiを叩いて音声から字幕生成【GAS】

Gemini APIを利用する利点

AI Task機能は別途AppSheet Enterprise Plusライセンスが必要です。そのため追加で購入が必要な上に、1ライセンスあたり1000クレジット/月が上限となっているため、リクエスト回数が多いと上限に達してしまい使えなくなってしまいます。

一方、GASからGemini APIをリクエストする場合には、リクエストに応じた課金は必要なものの、そのリクエストに大きな制限はありません(プログラム的なQuotaの制約はありますが)。もちろん、CoreプランであってもGASからAPIを叩いてる仕組みなので、Enterprise Plusライセンスは不要です。

概ね現場で利用するGemini APIのリクエストのパターンは決まっているので、1つコードを構築できれば簡単に使い回せるだけでなく、パターンが決まり事ということはメンテナンス性でも優れているので、個人的には無理にAppSheetでロジックを構築するよりもGemini APIを叩くGASアプリを構築したほうが柔軟性も高いと考えています。

また、AI Taskは現在2種類の作業しか出来ませんが、Gemini APIの場合はプロンプト次第で様々なことが可能になり縛られないので、ぜひ頑張ってGASの習得をおすすめします。

事前準備

Gemini API Keyを取得する

GeminiのAPIキーが必要です。以下のエントリーに独立してまとめています。課金されますので利用のしすぎには要注意。また課金されていない場合、学習に利用されてしまう恐れがあるので、きちんとGoogle Cloud上で課金アカウントとの紐付けなどをしておきましょう。

GeminiのAPIキーの取得と学習の可否

スクリプトプロパティに格納する

今回取得したGeminiのAPI Keyはapikeyというスクリプトプロパティの中に格納しています。コード内に直接記述した場合、誤って流出するおそれがあるので、スクリプトプロパティを使うか?共通で利用するJSONファイルなどを用意して、参照して読み込むように、コードとは分離して管理するのが望ましいでしょう。

図:apikeyをスクリプトプロパティに格納する

エンドポイントURLの確認

今回利用してるGemini APIのエンドポイントURLですが、2.5 Proはまだプレビュー段階でLastestが存在しません。よって、変更されたり削除される可能性もあります。とりあえずは以下のURLで構築していますが、都度最新版のエンドポイントURLを確認して、安定版が出たら、そちらを利用するようにしましょう。

ソースコード

冒頭のseikyu変数に請求書PDFのファイルIDを入れておきます。また、スクリプトプロパティからGemini APIのAPIキーを取得してendpointのURLと結合してリクエストしています。

前回の記事との相違点ですが

  • 請求書データと請求明細データを一括で取得し、JSON形式でまとめて出力させています。
  • それぞれのデータにはタイトル行があるので出力時はこのタイトル行は除外しています。また型変換を行って一時配列に格納してから、一括書き出ししています。
  • 請求データは1行なのでappendRowで請求書シートの行末に追記
  • 明細データは複数行なのでgetLastRowにて最終行を取得して明細シートの行末に一括追記

さらに応用して、書き出しデータを会計ソフトにインポート出来るようなスタイルで出力(勘定科目や借方・貸方などの生成)をしてあげる会計ソフト連動や、また履歴書データの読み込みならばそのままSmartHRなどにAPI連携でインポートなども可能になるかと思います。

現時点でAppSheetのAI Taskがいまいちな出来なので、GASで普通に取り込みをやらせたほうが短時間でスマートに開発が可能です。

図:請求書PDFから明細部分を取り出せました

AppSheetのAI Taskで請求書からデータ抽出

 

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)