発注書と見積書の金額照合をGASで自動化|「読めないはず」という予想が外れた話

「発注書と見積書の金額照合をGASで自動化|『読めないはず』という予想が外れた話」「第188話」という文字と、作業着姿の男性が光るパソコンの画面(スプレッドシート)を見て驚いているイラストが描かれたアイキャッチ画像。机の上には紙の書類が置かれている。 Uncategorized

皆さんこんにちは、横浜で清掃業をしているヤスです。

見積書を出して、お客様から発注書が届く。金額は合っているだろうと思いつつ、念のため1枚ずつPDFを開いて見比べる。件数が増えると、これが地味に面倒な作業です。

しかもズレは、たいてい小さいものです。今回のテストで見つかったのは3,600円の差でした。目で追っていたら、見落としてもおかしくない金額です。

前回(メールの依頼内容から見積書を自動で作る仕組み)では、見積書をPDFで作って案件フォルダに保存するところまで作りました。今回はその後編で、届いた発注書の金額と見積金額が合っているかを照合する仕組みです。

作る前に、ひとつ予想を立てていました。「スキャンした発注書からは、文字が取れないはずだ」。これを記事の山場にするつもりで、検証用の画像PDFまで用意しました。

結果から言うと、この予想は外れました。なぜ外れたのかは、後半で順番に書きます。

※この記事に登場する会社名・人名・住所・金額は、すべて練習用に作った架空のダミーです。実在のお客様や実際の取引の話ではありません。

完成形:フォルダを順に見て、金額の違いを色分けで出す

案件書類フォルダの各案件を順に見る
  ↓
フォルダの中から見積書PDFと発注書PDFを探す
  ↓
GoogleドライブでPDFをテキストに変換する
  ↓
AIがそのテキストから「最終的な金額」を1つ取り出す
  ↓
GASが引き算して判定する
  ↓
「発注照合」シートに結果を色分けで書き出す

使ったのは、GAS(Googleのサービスを自動で動かすためのプログラム)、Drive API(GASからGoogleドライブの機能を使うための窓口)、OpenAI API(AIを外から呼び出すための窓口)、Googleスプレッドシート、Googleドライブです。

判定は5種類にしました。

判定意味
一致発注金額=見積金額
金額違い差額あり。どちらがいくら多いかを表示
発注書なし見積書はあるが発注書が届いていない
見積書なし発注書だけ届いた(見積を出したか確認が必要)
読み取り失敗PDFから金額を特定できなかった

きっかけはこれまでと同じで、クラウドワークスで見た設備工事会社の募集です。稼働条件が合わず応募は見送りましたが、書かれていた業務を練習教材として1つずつ作っています。今回は「見積書・請求書作成の効率化」のうち「発注書と見積金額の照合」にあたります。

作り方①:引き算もAIにやらせない

前回決めた「計算はAIにやらせない」を、今回も守りました。

誰が何をするか
ドライブPDFをテキストにする
AIそのテキストから金額を1つ取り出すだけ
GAS見積金額と発注金額を引き算して判定する
人差額の原因を判断する

AIへの指示には「計算はしない。書かれている数字をそのまま返す」「見つからない・判断できない場合は null(値なし)を返す。推測しない」と書きました。

差額が出ても、原因まではAIに判定させません。値引き交渉の結果かもしれないし、単なる書き間違いかもしれない。そこは人が見るところだと考えました。

作り方②:Drive APIを有効にする

GASだけではPDFを読めないので、いったんGoogleドキュメントに変換して文字を取り出します。そのためにDrive APIを有効にしました。

  1. GASのエディタ左側にある「サービス」を開く
  2. 「Drive API」を選ぶ
  3. バージョンを「v2」にして追加する

[スクショ:サービスからDrive API(v2)を追加する画面]

作り方③:罠を仕込んだダミーの発注書で試す

既存の案件フォルダに、架空の発注書PDFを置きました。

案件番号見積金額発注金額仕込み
2026-018198,000198,000一致(正常)
2026-01939,60036,000税抜で発注された
2026-020なし61,600発注書だけ届いた
2026-011、017ありなし発注書が届いていない
2026-004、006、012、013—金額の記載なし第3話で作った中身のない書類

2026-019の備考には「社内決裁の都合により、税抜金額にて発注いたします」と書きました。単なる誤記ではなく、理由のある差額です。

2026-004などは、第3話の不足書類チェックで作ったダミー書類で、書類名と案件番号しか書かれていません。意図していませんでしたが、「金額のない発注書を、AIが何かの数字で埋めないか」のテストになりました。

結果は、9件すべて正しく判定されました。

  • 2026-018:一致(差0)
  • 2026-019:金額違い(見積39,600/発注36,000/差 -3,600)
  • 2026-020:見積書なし(発注61,600)
  • 2026-011、017:発注書なし
  • 2026-004、006、012、013:金額を特定できず

税抜で発注された想定が、そのまま -3,600円という数字に出ました。中身のない4件では、AIはすべて null を返しました。案件番号「2026-006」や日付「2026/09/25」といった数字は書かれているのに、それを金額として拾いませんでした。

つまずきポイント①:OCRを指定したら、7件中1件しか通らない

最初、PDFを変換するときに ocr: true(画像から文字を読み取る処理)を指定していました。

実行すると、ほとんどの変換が失敗しました。

User rate limit exceeded for OCR

OCRの利用回数の制限です。しかも、通る1件が毎回変わります。3秒待つようにしても変わらず、10秒待っても7件中1件しか通りませんでした。時間を空けるだけでは解決しない制限でした。

7件でこれでは、案件が数十件ある会社では使えないと感じました。

ocr: true の指定をやめたところ、7件すべてが一度で通りました。待ち時間も要りませんでした。

予想:OCRを外したなら、スキャンした発注書は読めないはず

ここで、冒頭に書いた予想の話です。

私は「スキャンした発注書は文字が取れない」という話を、この記事の山場にするつもりでした。しかもこのときは、OCRの指定を外した状態です。

検証のため、同じ発注書を画像にしたPDFを作って差し替え、実行しました。

検証の結果:読めた。金額も正確だった

読めました。金額198,000円を、正しく取り出していました。

予想が外れた理由は、こうでした。ocr: true を外していても、画像しかないPDFにはGoogleが自動でOCRをかけていたようです。回数制限の対象になるのは、自分で明示的に指定したときだけらしい、という理解に落ち着きました。

山場にするはずだった「読めない」は、起きませんでした。

ただし、文字の並びは崩れていた

取り出せた文字を見比べると、違いがありました。

文字入りのPDFは、表の形が保たれていました。

作業項目 数量 単位 単価 金額 給湯器交換 1 台 180,000 180,000
小計 180,000 円
消費税 18,000 円
発注金額 198,000 円

スキャンしたPDFは、項目が縦にバラバラになっていました。

作業項目
数量
台
1
円
180,000
...
合計
180,000
小計
'180,000円'
消費税
'18,000円'
'198,000円'

金額に ' が付いたり、順番が入れ替わったりしています。

この崩れた文字列から正しい金額を取り出せたのは、AIに読ませていたからでした。もしGASの文字列処理で「合計の次にある数字」を探す作りにしていたら、拾えなかったはずです。

第3話の不足書類チェックでは、「ファイル名で判定できるからAIは不要」と書きました。今回は逆に、AIでなければ読めませんでした。AIを使うかどうかは、扱うデータの形しだいだと分かりました。

教訓:予想は、やってみるまで予想でしかない。

その他の細かいつまずき

  • 変換の指定で、元ファイルの種類を「PDF」ではなく「Googleドキュメント」と書いていて、OCR is not supported for files of type ...document というエラーが出続けた
  • コードを差し替えるとき、説明文の「← 191行目」まで一緒に貼り付けて構文エラー(書き方の間違いによるエラー)
  • 同じ行を二重に貼り付け、同じ変数を2回宣言してしまい保存できなかった

まとめ:仕組みは「気づかせる」ところまでで十分

今回の手順をまとめます。

  1. Drive API(v2)を有効にし、PDFをテキストに変換する(ocr: true は指定しない)
  2. AIには金額を1つ取り出させるだけ。見つからなければ null、推測はさせない
  3. 引き算はGASにやらせ、差額の原因は人が判断する
  4. 一致・金額違い・発注書なし・見積書なし・読み取り失敗の5つに分けて色分けする

「スキャンは読めない」という予想は外れました。外れたおかげで、GoogleのOCRの動き方と、崩れた文字でもAIなら読めるということが分かりました。

最初の一歩としては、手元にあるPDFを1つ、文字入りのものとスキャンしたものの両方で変換してみて、取り出した文字を並べて見てみることをおすすめします。自分の予想と比べると、何が起きているのかが見えてきます。

同じ型は、請求書と発注書の照合、納品書と発注書の照合にも使えると思います。

だいぶ仕事に使える感じになってきましたね。GASでここまでできるとは思わなかったです。

次に何を作るかは、まだ決めていません。募集に書かれていた業務のうち、残りは「請求対象案件の抽出」「日程調整」「ファイル管理」です。

関連記事

このシリーズの過去の記事です。

コメント

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