仕入先から紙・PDFで戻ってくる注文請書を読み取り、品番・数量・単価・納期を発注データと照らして、食い違いと請書が戻っていない発注を購買担当へ返す
仕入先から紙・PDFで戻ってくる注文請書を読み取り、品番・数量・単価・納期を発注データと突き合わせます。食い違いのある行と、期日を過ぎても請書が戻っていない発注を、購買担当ごとの一覧にして返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 商社/建設/製造
- 対象部門
- 購買
- 対象業務
- 内容確認・チェック/比較検討
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- FAX と郵送で戻った請書を仕入先の担当者ごとに仕分け、PDF のものは印刷する
- 1枚ずつ開き、注文番号から生産管理システムの発注を画面で呼び出す
- 品番・数量・単価・納期を、発注の画面と見比べる
- 違いがあれば請書に付箋を付け、生産管理の担当と仕入先に確かめる
- 生産管理システムの「請書受領」の欄に印を付け、請書をファイルに綴じる
- 月に一度、請書受領の印が無い発注を一覧で出し、仕入先に催促する
- 人郵送の紙はスキャンし、FAX の受信と PDF のものとあわせて取込フォルダに保存する
- 自動Apps Script が数分おきに取込フォルダを見て、新しいファイルを拾う
- 自動Document AI が請書を読み、項目名と値の組・明細の表・チェックボックス・信頼度を返す
- 自動Gemini API が、注文番号・品番・数量・単価・納期・引き受けの区分を決まった形にそろえる
- 自動Apps Script が注文番号と行の番号で発注残の一覧を引き、品番・数量・単価・納期を比べる
- 自動行ごとに状態を付け、照合結果のシートに書き込む
- 自動毎朝、発注から決めた日数を過ぎても請書の無い発注を拾い、未返送の一覧にする
- 人購買担当が自分の仕入先の `match` 以外の行と未返送の一覧だけを見て、仕入先に確かめるか、生産管理へ知らせるかを決める
- 人生産管理システムの請書受領の印は、照合結果を見たうえで担当者が付ける
各工程の詳しい説明を読む
- FAX と郵送で戻った請書を仕入先の担当者ごとに仕分け、PDF のものは印刷する
- 1枚ずつ開き、注文番号から生産管理システムの発注を画面で呼び出す
- 品番・数量・単価・納期を、発注の画面と見比べる
- 違いがあれば請書に付箋を付け、生産管理の担当と仕入先に確かめる
- 生産管理システムの「請書受領」の欄に印を付け、請書をファイルに綴じる
- 月に一度、請書受領の印が無い発注を一覧で出し、仕入先に催促する
(a)見比べないまま綴じている。 3番は1枚あたり数分ですが、月600枚になると手が回らず、忙しい週は5番の受領の印だけを付けて綴じます。 請書に書かれた納期が発注と違っていても、その週のうちに気づく人はいません。
(b)書き直された納期に気づかない。 印字の納期を二重線で消し、横に手書きで別の日付を書いてくる仕入先があります。FAX で戻ると線は細くかすれ、印字の日付のほうが目に入ります。 仕入先は「請書で伝えた」と考えており、遅れても連絡は来ません。
(c)戻っていない請書が追えない。 6番の催促は月に一度で、発注から1か月近くたってから、引き受けてもらえていなかったことが分かることもあります。
(d)単価の違いが請求のときに分かる。 改定前の単価で請書を返してくる仕入先があり、見比べていないと、食い違いは請求書が届いて経理が照合するときまで残ります。
- 【人】 郵送の紙はスキャンし、FAX の受信と PDF のものとあわせて取込フォルダに保存する
- 【自動】 Apps Script が数分おきに取込フォルダを見て、新しいファイルを拾う
- 【自動】 Document AI が請書を読み、項目名と値の組・明細の表・チェックボックス・信頼度を返す
- 【自動】 Gemini API が、注文番号・品番・数量・単価・納期・引き受けの区分を決まった形にそろえる
- 【自動】 Apps Script が注文番号と行の番号で発注残の一覧を引き、品番・数量・単価・納期を比べる
- 【自動】 行ごとに状態を付け、照合結果のシートに書き込む
- 【自動】 毎朝、発注から決めた日数を過ぎても請書の無い発注を拾い、未返送の一覧にする
- 【人】 購買担当が自分の仕入先の
match以外の行と未返送の一覧だけを見て、仕入先に確かめるか、生産管理へ知らせるかを決める - 【人】 生産管理システムの請書受領の印は、照合結果を見たうえで担当者が付ける
8番目が、この設計の分かれ目です。人が見るのは全件ではありません。 発注どおりのものは件数を流し見て終わりにし、食い違いと出たもの、読み取りに自信のないもの、戻っていないものだけに時間を使います。
9番目で受領の印を自動で付けないのも、意図してのことです。 読み違えた請書に受領の印が付くと、その発注は以後だれの一覧にも出てきません。
02今回想定するシステム構成
注文請書(FAX・紙・PDF) │ 紙はスキャン、FAX は複合機が PDF にして取込フォルダへ ▼【トリガー】Google Apps Script の時間主導型トリガー(数分おき) Google Apps Script ── 形式・ページ数の確認、仕入先の推定 ▼ Google Document AI(Form Parser) │ 項目名と値の組・明細の表・チェックボックス・信頼度を返す ▼ Gemini API ── 注文番号と明細の行を決まった形にそろえる │ 注文番号/品番/数量/単価/納期/引き受けの区分 ▼ Google Apps Script ── 発注残の一覧と行ごとに照合 │ match/qty_diff/price_diff/date_diff/not_found/needs_review ├──▶ 照合結果のシート(担当者別) └──▶ 毎朝の未返送の一覧と、担当者への通知 ▼ 【人が match 以外と未返送だけ確認】──▶ 仕入先への確認・生産管理への連絡
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Gemini API(注文番号と明細の行の対応付け) | Claude API、OpenAI API |
| 差異計算 | Google Apps Script(発注残との照合、未返送の洗い出し) | Python |
| 連携 | Google Apps Script(取込フォルダの監視、発注残の読み取り、結果の書き込みと通知) | Python |
| 保管 | Google ドライブ、Google スプレッドシート | 既存の文書管理システム |
新しく作るのは、毎朝の発注残の一覧の置き場所だけです。 生産管理システムから出している発注残の CSV を、取込フォルダとは別のフォルダに毎朝置きます。照合の相手はこの一覧で、生産管理システムには触りません。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCRのテキストに加えて、キーと値のペア(エンティティとチェックボックス)、表、一般的なエンティティを抽出するとされ、200を超える言語に対応します。言語の一覧には日本語(ja)があり、手書きにも対応する言語として示されています。 ページの上限は同期処理で15ページ、バッチ処理で100ページです。
チェックボックスを読めることが、請書では効きます。 公式には、Form Parser がチェックボックスを読み取り、塗られているかどうかをキーと値の組として返すとされています。「お引き受けします」「条件付きでお引き受けします」のような欄に印が付いているかを、文字ではなく印として拾えます。ただし、ラジオボタンの読み取りには対応しないとされています。
表の読み取りには限りがあります。 Form Parser の表の抽出は、行や列をまたぐセルのない単純な表が対象とされています。仕入先の書式で明細の欄がつながっているものは、全文のテキストから行を拾い直します(第7章)。
03どうやって実装するのか
処理の起点を決める
Google Apps Script の時間主導型トリガーで、数分おきに取込フォルダを見ます。 時間主導型のトリガーは、毎分から月1回までの間隔で動かせるとされています。請書は届いた日のうちに照合します。 納期の書き直しは、早く見つけるほど生産の計画を直す余地が残ります。
未返送の洗い出しは、別のトリガーで毎朝1回動かします。 発注残の CSV が置かれた後の時刻に合わせ、発注日から決めた営業日数を過ぎても照合結果に請書の無い発注を拾います。
1回の実行で処理する件数に上限を置きます。 Apps Script の1回の実行は6分までとされています。1回に8件までとし、残りは次の実行に回します。 処理済みフォルダへ移すのは、照合結果のシートへの書き込みまで成功したときだけにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 注文請書 | PDFまたは画像。受け取った日時と経路(FAX/PDF/郵送) | 取込フォルダ |
| 読み取り結果 | 項目名と値の組、明細の表、チェックボックス、全文のテキスト、項目ごとの信頼度 | Document AI(Form Parser) |
| 発注残の一覧 | 注文番号、行の番号、仕入先、品番、数量、単価、指定納期、発注日、購買担当 | 生産管理システムから毎朝出力する CSV |
| 仕入先の書式メモ | 注文番号の欄の名前、自社の注文書の控えで返すか独自の書式か、納期の書き方 | 自社で用意する一覧 |
| 返送の期日の決まり | 発注から何営業日で請書が戻るべきか(仕入先の区分ごと) | 購買部の取り決め |
| 営業日カレンダー | 土日・祝日・長期休暇 | 自社で用意する一覧 |
質を決めるのは、発注残の一覧に行の番号と購買担当が入っていることです。 行の番号が無いと、同じ注文番号に同じ品番が2行あるときに比べる相手が決まりません。購買担当が無いと、食い違いを誰に返すかが決まりません。
返送の期日は、仕入先の区分で変えます。 材料の商社は翌日に戻り、小さな加工外注は1週間かかります。一律の日数にすると、未返送の一覧が毎朝同じ仕入先で埋まります。
データの取得方法を決める
読み取りは、Apps Script から Document AI の処理のAPIを呼ぶだけです。ファイルを渡すと、Document という形の応答が返ります。
| 取るもの | 応答のどこから | 何に使うか |
|---|---|---|
| 項目名と値の組 | pages[].formFields[] の fieldName と fieldValue | 注文番号、仕入先名、請書の日付 |
| チェックボックス | formFields の fieldValue の valueType(filled_checkbox/unfilled_checkbox) | 引き受けの区分 |
| 明細の表 | pages[].tables[] の headerRows と bodyRows | 行ごとの品番・数量・単価・納期 |
| 全文のテキスト | text と、各要素の textAnchor | 表として取れなかった行、手書きの書き込みの拾い直し |
| 信頼度 | 各要素の layout の confidence | 数量・単価・日付の読み取りが確かかの判定 |
納期と数量は、信頼度とあわせて取ります。 FAX で戻った「10/28」と「10/23」の違いは、生産の計画を5日動かします。信頼度の低い日付や数量は、その行を needs_review にして人に回します。
発注残の一覧は CSV を読むだけで足ります。 引く順は注文番号と行の番号が先で、行の番号が無い請書は注文番号と品番で引きます。候補が2つ以上あれば選ばず、needs_review にします。
AIへ渡す前に整形する
- 形式の確認 … Form Parser の対象は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP です。それ以外は PDF にします
- ページ数の確認 … 同期処理は15ページまでです。超えるものはバッチ処理に回します
- 解像度の確認 … 公式には、OCRの精度のためにスキャンは最低200dpiが望ましく、300dpi以上が一般に最もよい結果になるとされています。FAX の受信の解像度を、複合機の設定でいちばん細かいものにします
- 圧縮の確認 … JPEG のような非可逆の形式は、ファイルを小さくすると精度が落ちることがあるとされています。保存形式は PDF にします
- 仕入先の推定 … FAX の送信元の番号、メールの差出人、1ページ目の会社名から仕入先を推定し、書式メモを引きます
- 複数の請書の分割 … 1回の FAX で数社分が続けて届いたものは、ページで分けます
- 重複の検知 … 同じ注文番号の請書が FAX と PDF の両方で届いたものは、後のほうに既処理の印を付けます
3番目を軽く見ないでください。 二重線と手書きの日付は、粗い FAX ではいちばん先につぶれます。書き直しが読めないと、印字の納期だけが拾われ、照合は「一致」になります。
AIに処理させる
させるのは、請書に書かれた値を、決まった項目と明細の行に写すことだけです。 比べることはさせません。
| 写す項目 | 当たるものの例 | 判断できないときの扱い |
|---|---|---|
| 注文番号 | 「注文番号」「貴社注番」「発注No.」 | 読めなければ空にして needs_review |
| 引き受けの区分 | 「お引き受けします」「条件付き」の欄の印 | 印がどちらにも無ければ unknown |
| 品番・品名 | 「品番」「図番」「品名」 | 品番が無く品名だけなら品番は空 |
| 数量・単位 | 「数量」「個」「kg」 | 単位が書かれていなければ単位は空 |
| 単価・金額 | 「単価」「金額」 | 金額だけなら単価は空。割って埋めない |
| 納期 | 「納期」「納入日」「出荷予定日」 | 「10月下旬」のような幅のある書き方は日付にせず原文のまま |
| 書き直し | 印字の値と、手書きの別の値 | 両方を写し、revised を付ける |
| 条件・備考 | 「分納」「材料支給待ち」「単価は別途」 | 原文のまま写す |
右端の列が、この構成でいちばん大事な区別です。 書かれていない項目を、発注の値や計算で埋めさせません。特に納期の書き直しは、どちらか一方に決めさせず、両方を残します。
| させないこと | 理由 |
|---|---|
| 発注データとの比較 | 比べるのは Apps Script。AIに発注の値を見せない |
| 読みにくい数字を発注の値に寄せること | 寄せた瞬間に食い違いが消える |
| 金額を数量で割った単価の補完 | 書かれていない単価を作ると、改定前の単価の差が隠れる |
| 書き直しの前後のどちらかを選ぶこと | 有効な日付を決めるのは購買担当と仕入先 |
| 幅のある納期の日付への読み替え | 「下旬」を月末にすると、遅れを見逃す |
1行目と2行目は、同じ理由でつながっています。 AIに発注の値を渡すと、かすれた「23」を「28」と読むかどうかに発注の値が影響します。 発注の値は Apps Script だけが持ち、AIには請書の読み取り結果だけを渡します。
指示内容を固定する
あなたは購買部門で、仕入先から戻ってきた注文請書を読み、
発注データと照合するための下書きを作る立場です。
OCRが返した読み取り結果だけを見てください。推測で埋めないでください。
【やること】
1. 書類が注文請書(自社の注文書の請書欄を返したものを含む)かを判断してください。
見積書、納品書、請求書など別の書類なら、写さずに document_type を other にしてください。
2. 注文番号、請書の日付、仕入先名、引き受けの区分を写してください。
引き受けの区分は、チェックボックスの印で決めてください。
3. 明細を1行ずつ lines に入れてください。
品番、品名、数量、単位、単価、金額、納期、条件・備考を写します。
【厳守事項】
- 値は書類に書かれたものをそのまま入れてください。値を変えないでください。
- 計算をしないでください。単価が書かれていないときに、金額を数量で割って埋めないでください。
- 同じ欄に印字の値と、二重線で消した跡や手書きの別の値があるときは、
printed と handwritten の両方に写し、revised を true にしてください。
どちらが正しいかを決めないでください。
- 「下旬」「中旬」「○日頃」のような幅のある納期は、日付に直さず
date_text に原文のまま写し、date は空にしてください。
- 品番は読み取った文字列をそのまま入れてください。
桁を補う、似た品番に直すことをしないでください。読めなければ空にします。
- 引き受けの印がどの欄にも付いていなければ、acceptance を unknown にしてください。
- 発注の内容と合っているかどうかについて書かないでください。
- evidence には、各値の根拠にした文字列をそのまま写してください。
【読み取り結果(キーと値の組、表、チェックボックス、全文)】{ocr_result}
【この仕入先の書式メモ】{supplier_note}
「どちらが正しいかを決めない」を明記しないと、AIは手書きの値を採ります。 多くの場合はそれで正しいのですが、書き直しがあったという事実が消えます。 購買担当が知りたいのは、新しい日付そのものより、仕入先が日付を変えてきたことです。
出力形式を固定する
Gemini API の構造化出力で、次の形のJSONに固定して受け取ります。 公式には、Interactions の response_format に JSON スキーマを渡すと、そのスキーマに従う応答を生成させられるとされ、enum で値の候補を限り、required で必須の項目を決められます。
{
"document_type": "acknowledgment | other",
"po_number": "",
"ack_date": "",
"supplier_name": "",
"acceptance": "accepted | conditional | unknown",
"lines": [
{ "line_no": "", "part_no": "", "description": "", "quantity": null, "unit": "",
"unit_price": null, "amount": null,
"delivery": { "printed": "", "handwritten": "", "date": "", "date_text": "", "revised": false },
"remarks": "" }
],
"evidence": [{ "field": "", "text": "", "confidence": 0 }]
}
1つ目の理由は、AIの仕事と照合の仕事を別の層に置けることです。 JSONはAIが埋め、比較と判定は Apps Script が発注残の一覧で行います。
| 状態 | 付ける条件(Apps Script が決める) |
|---|---|
match | 品番・数量・単価・納期が発注と一致し、引き受けの区分が accepted |
date_diff | 納期が発注の指定納期と違う、revised が true、または date_text だけで日付が無い |
qty_diff | 数量が違う、または備考に分納の記載がある |
price_diff | 単価が違う、または単価が書かれず金額だけがある |
not_found | 注文番号で発注残に行が無い(取消済み、番号の読み違い) |
needs_review | 数量・単価・日付の信頼度が基準を下回る、引き受けが unknown か conditional、候補が2つ以上 |
2つ目の理由は、1行に複数の状態を持てることです。 納期も単価も違う行には、date_diff と price_diff の両方を付けます。担当者は状態の組み合わせで、仕入先に何を確かめるかが一目で分かります。 公式にも、構文として正しいJSONでも値はアプリケーションの側で検証するよう書かれています。数量×単価が金額と合わない行は needs_review にします。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 取込フォルダ | Apps Script の時間主導型トリガー | 新しいファイルを拾う |
| Document AI | API呼び出し | 項目名と値の組・明細の表・チェックボックス・信頼度を返す |
| Gemini API | API呼び出し(構造化出力) | 注文番号と明細の行の対応付け |
| 発注残の一覧 | CSV の読み取り | 品番・数量・単価・指定納期・購買担当 |
| 照合結果のシート | スプレッドシートへの書き込み | 行ごとの状態、請書の値、発注の値、根拠の文字列 |
| 購買担当への通知 | 社内のメール(Apps Script) | 毎朝、担当者ごとの match 以外の件数と未返送の件数 |
| 生産管理システム | 書き込まない | 請書受領の印は担当者が付ける |
生産管理システムには書き込みません。 照合の結果を受けて受領の印を付けるのも、納期を直すのも人です。未返送の催促も、仕入先へ自動では送りません。 通知は社内の購買担当にだけ送り、催促の文面と送る相手は担当者が決めます。
人が確認する
人が開くのは match 以外の行と、未返送の一覧だけです。 match のものは件数を流し見ます。全件を開く設計にすると、第10章の10.0時間には収まりません。
date_diffを先に見る …revisedの行は請書の画像で書き直しを確かめ、生産管理の担当へその日のうちに知らせますneeds_reviewを見る … 数量・単価・日付を画像で確かめて直しますprice_diffを見る … 単価の改定を仕入先と合意済みか確かめ、合意前なら仕入先に問い合わせます- 未返送の一覧を見る … 催促するか、仕入先の事情を聞くかを決めます
- 受領の印を付ける … 確かめ終えた発注にだけ、生産管理システムで印を付けます
1番目を省かないでください。 納期の書き直しは、部品が来ない日まで誰も気づかない種類の食い違いです。
目標は、600件をならして1件1分です。 開くのは1割前後という想定で、それより多い月は、書式メモの無い仕入先が増えているか、FAX の解像度が足りていません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 1回の FAX に数社分の請書が続く | ページで分割して再投入。分けられなければ needs_review |
| 明細の欄がつながっていて表として取れない | 単純な表が対象。全文のテキストから行を拾い直し、needs_review を付ける |
| 引き受けの欄が ○ で囲む形 | ラジオボタンは対象外。unknown として人へ。 自社の注文書の請書欄は □ に作り直す |
| 「分納」と書かれ数量が分かれている | qty_diff にし、分納の予定を備考ごと担当者へ |
| 注文番号が発注残に無い | not_found。取消済みの発注か、番号の読み違いかを人が確かめる |
| 同じ請書が FAX と PDF で二重に届く | 後のほうに既処理の印。二重に照合しない |
| 請書でない書類が混ざる | document_type が other。照合せず担当者へ戻す |
| APIが応答しない、6分を超える | 取込フォルダに残す。処理済みへ移すのは書き込み成功時だけ |
3行目は、自社の書式を直すだけで消える例外です。 請書欄を自社で作っているなら、○で囲む形をやめ、□に印を付ける形にします。
記録を残す
- 元の請書のファイルと、受け取った日時・経路(FAX/PDF/郵送)
- Document AI が返した
DocumentのJSONの全文 - Gemini API に渡した書式メモの版と、返ってきたJSON
- Apps Script が付けた状態と、そのとき照合した発注残の行
- 人が状態を覆した記録と、生産管理へ知らせた日時
- 未返送の一覧に載った日と、催促した日、請書が戻った日
4つ目で「そのときの発注残」を残すのは、発注が後から変わるためです。 発注を直した後に照合結果を見直すと、当時の食い違いが無かったことになります。
最後の行は、仕入先との話し合いの材料になります。 請書が毎回遅れる仕入先が分かれば、返送の期日の決まりを変えるか、仕入先に請書の返し方を相談できます。
04実装レベルの3段階
最小構成では枚数がさばけません。 確かめるための段階です。 半自動化で、1件5分が3分程度になります。 読み取りは自動になりますが、発注を呼び出して見比べる作業と、未返送の確認が残ります。本格構成で1分になり、この段階が本記事の想定です。 差が大きいのは、発注の呼び出しと見比べが1枚ずつの画面の操作だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、独自の書式で明細の欄がつながっている仕入先が先に分かります。 書式メモをそこで埋めてから進みます。
05工数削減シミュレーション
導入後 600件 × 1分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 加工外注・部品・材料の仕入先が百社を超え、注文書に対する注文請書が FAX・紙・PDF でばらばらに戻ってくる製造業・商社・建設業。請書の納期や単価が発注と違っていても、ファイルに綴じるだけで見比べる時間が取れていない場合。生産管理や購買のシステムから発注残を CSV で出せ、Google Workspace を使っている場合。
- 仕入先が数社で、請書が月に数十枚しか戻らない場合。仕入先との発注・請書のやり取りを EDI や購買のポータルに移せており、回答がデータで返ってくる場合。発注データから発注残を出力できず、照らす相手が無い場合。なお、仕入先が示した納期や単価を受け入れるかどうか、取引の条件をどう交渉するかの判断はこの構成では代替できません。
07最小構成で試す方法
- 先月戻った請書から、FAX で戻ったものと、手書きの書き込みがあるものを中心に30枚を選ぶ
- その30枚について、当時見比べたか、食い違いに気づいたかを担当者に聞き取る
- 30枚を1枚ずつ手元のAIサービスの画面に貼り付ける
- 「この注文請書から、注文番号・引き受けの区分・明細ごとの品番・数量・単価・納期を表にしてください。印字の値と手書きの値が両方あるときは両方を書き、どちらが正しいかを決めないでください。書かれていない項目は空にし、計算で埋めないでください」と指示する
- 出てきた表を、発注の画面と1行ずつ突き合わせる
| 出てきた内容 | 判断 |
|---|---|
| 書き直しを含め、値が正しく写った | OCRとワークフローの連携に進む |
| 書き直しの片方だけを写した | 指示の書き方で直る。構成は有効 |
| FAX がかすれて読めない枚数が多い | FAX の解像度が先。 AIの問題ではない |
3行目は失敗ではありません。 人の目でも読みにくかった請書が、見比べを省かれていた理由の1つだったということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| かすれた数字を発注の値に寄せて読む | AIに発注の値を渡さない。 比較は Apps Script だけが行う |
| 手書きの書き直しの片方だけが残る | 両方を写させ、revised を付ける |
| 「下旬」を月末の日付にする | 幅のある書き方は date_text に原文のまま |
| FAX がかすれて書き直しが読めない | 複合機の FAX 受信の解像度をいちばん細かくする |
| ○で囲む引き受けの欄が読めない | ラジオボタンは対象外。自社の請書欄を □ に変える |
| 同じ品番の行が2つあり比べる相手が決まらない | 発注残に行の番号を入れる |
| 未返送の一覧が同じ仕入先で埋まる | 返送の期日を仕入先の区分ごとに変える |
| 受領の印を自動で付ける | 印は人が付ける。 読み違いが一覧から消えるのを防ぐ |
| 未返送の催促を自動で送る | 通知は社内まで。 催促は担当者が送る |
上の2行が、この構成の失敗のほとんどです。 どちらも「合ってしまう」方向の誤りで、一覧からは誰も気づきません。
4行目と5行目は、AIではなく紙の側の問題です。 解像度と請書欄の形を直すほうが、指示を工夫するより効きます。
下の2行は、作り始めてから足したくなる機能です。 受領の印も催促も、自動にすれば手間はさらに減ります。ただ、どちらも「人が見た」という事実を消します。 誤って印が付いた発注は二度と一覧に出ず、誤って送った催促は仕入先との関係に残ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 仕入先の名前、品番と数量、単価、納期です。単価は仕入先との取引条件そのもので、社外に知られれば他の仕入先との交渉にも響きます。
- Gemini API は有料の枠で使う … 公式の利用規約では、有料のサービスではプロンプトと応答を製品の改善に使わないとされる一方、無料のサービスでは改善に使われ、人が読むことがあるとされ、機密の情報を送らないよう求めています。請求先のアカウントを付けたプロジェクトから呼びます
- AIに渡すのは請書1枚分だけにする … 発注残の一覧をAIへ渡しません。照合は Apps Script の側で行います
- 仕入先への連絡を自動で送らない … 通知は社内の購買担当まで。催促や問い合わせの言い方は担当者が決めます
- 取込フォルダと照合結果の権限を絞る … 購買部と、納期の連絡を受ける生産管理の担当だけが見られるようにします
- この構成は取引の判断を代替しない … 書き直された納期や単価を受け入れるかどうかは、購買担当と生産管理が決めることです。 この構成が出すのは、請書の値が発注と合ったかどうかという事実だけです
誤りが起きた場合のリスクは、食い違いの見落としと、正しい請書の誤った問い合わせの2つです。 前者は指示と解像度で、後者は書式メモの整備で防ぎます。
10まず何から始めるか
1週目:発注残の CSV を整える
生産管理システムから毎朝出している発注残の一覧に、行の番号と購買担当の列が入っているかを確かめ、無ければ出力の設定に足します。あわせて、複合機の FAX 受信の解像度を確かめます。
2週目:30枚で試す
先月の請書から30枚を選び、手元のAIサービスで明細を表にさせます。手書きの書き直しを両方写せているかを最優先で見ます。
3週目:書式メモと返送の期日を決める
請書の多い上位30社の書式メモと、仕入先の区分ごとの返送の期日を作ります。自社の注文書の請書欄が ○ で囲む形なら、□ に直します。
4週目:取込フォルダから照合結果までをつなぐ
Apps Script で取込フォルダを見張り、Document AI と Gemini API を呼び、結果をシートに書き出すところまで作ります。この時点では照合をせず、写した値の一覧だけを見ます。
2か月目: 発注残との照合を足し、状態を出します。match 以外の件数を毎週数えます。3か月目以降: 未返送の一覧と担当者への通知を足し、1件5分が何分になったかを実測します。書き直された納期が、請書の届いた日のうちに生産管理へ届くようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Form Parser がOCRのテキストに加えてキーと値のペア(エンティティとチェックボックス)、表、一般的なエンティティを抽出し、200を超える言語に対応すること。言語の一覧に日本語があり手書きに対応すること。ページ上限が同期15、バッチ100であること | Google Cloud: Processor list | 2026-10-06 |
| チェックボックスを塗られているかどうかとともにキーと値の組として返すこと。ラジオボタンに対応しないこと。表の抽出が行や列をまたぐセルのない単純な表を対象とすること | Google Cloud: Form Parser | 2026-10-06 |
formFields が fieldName と fieldValue を持ち、チェックボックスが valueType の filled_checkbox/unfilled_checkbox で返ること。表が headerRows と bodyRows で返ること。信頼度が返ること | Google Cloud: Handle the processing response | 2026-10-06 |
| 対応形式が PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などであること。スキャンは最低200dpiが望ましく300dpi以上が一般に最もよいこと。非可逆の圧縮で精度が落ちうること | Google Cloud: Supported files | 2026-10-06 |
Interactions の response_format に JSON スキーマを渡して応答の形を固定でき、enum と required を使えること。値はアプリケーションで検証すべきこと | Gemini API: Structured outputs | 2026-10-06 |
| 有料サービスではプロンプトと応答を製品の改善に使わず、無料サービスでは改善に使われ人が読むことがあり、機密の情報を送らないよう求めていること | Gemini API 追加利用規約 | 2026-10-06 |
| Apps Script の1回の実行が6分までであること | Apps Script: Quotas for Google Services | 2026-10-06 |
| 時間主導型のトリガーが毎分から月1回までの間隔で動かせること | Apps Script: Installable triggers | 2026-10-06 |
書き直された納期や単価を受け入れるかどうかは、購買担当と仕入先で決めてください。 本記事は各製品の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0529)についてのご相談はこちらから。
