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

以前、Googleドライブで電子帳簿保存法対応のアップローダとOCRを装備したことがあります。GASとGoogle DriveのOCR機能で実装したものでした。まだ生成AIもメジャーではなくVision APIなどを使ってのOCRが主流の時代。しかし扱いにくいものでした。

この時PDFをアップすると中身をOCRしてスプシに書き出していましたが、これをAppSheet + Gemini APIで出来ないか?ということで、請求書をアップするだけで電帳法対応し中身をデータとして取り出す一歩としてチャレンジしてみました。

今回利用するサンプル等

以前のGASでのアップロードとOCRに関しては以下のエントリーにまとめています。昨今はOCRは専用のAPIよりも生成AIのほうが断然読み取り精度や面倒なフォーマットなどをよしなにやってくれるので、プログラム的に取り出しやすいということで、レシート読み取りなどをやらせてみたり、カメラで取った内容から書き出しをしたりなどが盛んに行われています。

今回は業務で利用する請求書のPDFを読み取らせて、データを取り出せるかをGoogle Apps Script + Gemini APIを含めて実装しています。GeminiはGemini 2.0 Flashを利用しています。

過去にバクラクのAI-OCR使ったことがありますが非常に精度が高く便利でしたが、Gemini APIで作った今回のアプリも負けていないのではないかと思います。

Google Driveで始める電子帳簿保存 & インボイス制度対応

事前準備

Gemini 2.0 FlashのAPIキーを取得する

Gemini Advancedなどの後ろで動いてるAPIを直接利用します。以下の手順でGemini 2.0 FlashのAPIキーを今回は取得してみます。

  1. Googleアカウントにログインした状態にしておく
  2. こちらのウェブサイトにアクセスする
  3. APIキーを作成をクリックする
  4. 1個だけはそのままAPIキーを作成で続行できます。2つ目は既存のGCPプロジェクトを選ぶよう指示が出ます。GCPプロジェクトを指定しなかった場合には新規にGCPプロジェクトが生成されます。
  5. APIキーが発行されるのでコピーする

このAPIキーは無料ですが、流出することの無いように大切に保管する必要があります。このキーは後でGAS側で利用します。

図:APIキーを発行してる画面

スクリプトプロパティに値を格納

前述までに取得しておいたGeminiのAPIキーおよび画像ファイルの出力先フォルダとして、GASのスクリプトプロパティに値をセットします。ただし、folderidについては後述のAppSheet側での実装の後でなければフォルダのIDが不明であるため、入れ物だけ用意しておき後で記入することになります。

  • folderid:出力先フォルダのID
  • geminikey : Gemini APIのAPIキー

図:2つ値をセットしておく

スタンドアローンのGASの準備

AppSheetテンプレートをコピーした後はGASへの参照が切れています。故に自身でスタンドアローンコンテナのGASファイルを作成して繋げてあげる必要があります。ここではそのGASのファイルの作成手順です。

  1. Google Driveを開いて、左上の新規をクリック
  2. その他 => Google Apps Scriptをクリック
  3. スクリプトエディタが直接開いて警告文が出るのでそのまま作成を続行する
  4. ドライブにはスタンドアローンファイルが生成される
  5. スタンドアローンスクリプトをダブルクリックしてスクリプトエディタを開く
  6. 左上のプロジェクト名がファイル名になるので、無題のプロジェクトではなくきちんと名前を付けましょう。(今回は緯度経度変換スクリプトという名前にしています)。
  7. 後述のGoogle Apps Scriptをコピー&ペーストして保存する
  8. AppSheetのAutomation内のCall a scriptで参照してるGASを今回作ったものに差し替えます

見つからない場合には、Chrome Webstoreから拡張機能インストールしましょう(Google Apps Scriptで検索すると出てくる)。

図:新規から作成することが出来る

技術的ポイント

AppSheet側での実装

テーブルの設定

請求書シートを取り込み後にファイル列にはファイルのパスが入ることを想定するので、データの型を「File」に変更しておきます。これだけでAppSheet上ではクリックするだけでローカルからのアップロードや、ドラッグアンドドロップでファイルを簡単にアップロードできるようになります。

ただしファイルのIDはAppSheetでは取得できずファイル名が入ることになるため、IDを取得するためのロジックをGAS側で実装する必要があります。

図:File型にしておくのがポイント

アップロードフォルダ

前述のアップロードしたファイルは、スプレッドシートがある場所にシート名にてフォルダが自動作成されてそこに格納されるので、パスとしては「請求書_Files_/ファイル名」といった形で自動で格納されます。一個試しにアップしてみてフォルダができるかどうか?確認しましょう。

このフォルダのIDを前述のfolderidに格納しておきます。GASでこのフォルダ内でファイル名を手がかりにファイルを特定してピックアップしますので、重要な値になります。

※この時アップされるファイル名は重複を避ける為にAppSheet側でランダムなファイル名としてアップされています。

図:フォルダが自動作成されます

Google Apps Script側の実装

今回のアプリの最も肝になる部分のGeminiにファイルを投げてOCRしてもらい、登録したレコードに取得したデータを追記するコードになります。アップロード後のAutomationで作動し、レコードのIDとファイル名を引数として渡して完了したらTrue/Falseで返すようにしています。事前に読み書き先のスプシのIDをコード内に記述しておいてください。

ポイントとしては

  • 指定のフォルダ内だけをターゲットにファイル名で特定しアップロードしたファイルIDを取得する
  • 画像の時と同様にBASE64でファイルはエンコードする
  • プロンプトにて詳細な請求書データの読み方と事例を記述して配列データで返してもらう
  • 返り値内に余計な文字が付くのでこれを除外する
  • 1行目がタイトル行なので2行目のみを対象にデータを拾って、対象のレコードに追記する

といった流れになります。自分のサンプルの場合かなり綺麗に取得することが出来ました。こういった配列でよしなにしてくれるというのがCloud Vision APIでは出来ないので、Gemini APIでOCRはその辺りが実に優秀です。

正直過去のOCRアプリケーション時代を知ってると、生成AIのOCR精度はものすごく高くてびっくりするレベルです。

図:OCRの精度が半端ない

使ってみる

使う側の手順は簡単。今回のサンプルを開いて以下の手順でファイルをアップするだけです。

  1. 請求書アップの右下+ボタンをクリックする
  2. ファイルのところにドラッグアンドドロップするか?ファイルを選択します。(ローカルからアップロードします)
  3. 保存をクリックするとアップロードされます。
  4. 同時に後ろでGemini問い合わせが実行されて、OCRされた内容が対象レコードに追記されます。
  5. 対象のレコードを開いてみると見事に取り出された値が格納されています。

これで受け取った請求書についての電子帳簿保存法に従った格納先やタイムスタンプ、ラベルなどを付けるスクリプトなどを整備してあげれば、請求書の読み取りだけでなくその後の会計ソフトへの流し込みなども非常に楽になるでしょう。

※今回の事例では「請求明細」については読み取り指示をしていないので、追加で請求明細も取得するようなプロンプトや出力指示を加えると尚良いでしょう。

図:アップロードはとても簡単

図:追記された各種データ

関連リンク

コメントを残す

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

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