農協・集荷場で生産者が手書きする農産物の出荷伝票を読み取り、品目・等級・数量・生産者を出荷台帳にそろえて、精算の元データを作る
集荷場で生産者が手書きする出荷伝票を読み取り、生産者・品目・等級・階級・ケース数を出荷台帳の行にそろえます。生産者番号の誤り、品目に無い規格、受け入れた数との食い違いは、精算の前に担当へ返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/商社/物流
- 対象部門
- 物流/経理
- 対象業務
- データ入力・転記/台帳・マスタ管理
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 集荷場の担当が、その日の伝票を束ねて営農経済センターに回す(または複合機でスキャンしてメールで送る)
- 販売の担当が伝票を1枚ずつめくり、生産者番号で生産者を開く
- 品目、等級、階級を見て、システムの規格に読み替える
- 受入数を確かめ、出荷数と違えば受入数のほうを打ち込む
- 販売・精算のシステムに出荷の明細を1行ずつ打ち込む
- 読めない字、合わない生産者番号、品目に無い階級は付箋を付け、集荷場か生産者に電話で確かめる
- 精算の締めの前に、精算の担当が生産者ごとの出荷の合計を確かめる
- 人集荷場の担当が、その日の伝票(1枚目の原本)を複合機でスキャンし、集荷場ごとの共有ドライブのフォルダに保存する
- 自動Google Apps Script が10分おきにフォルダを確かめ、新しいPDFを取り出す
- 自動Google Document AI の Form Parser が、伝票の欄のキーと値、品目の表、それぞれの信頼度を返す
- 自動OpenAI API が、読み取り結果を伝票の見出しと品目の行に、書かれたとおりに写す
- 自動Apps Script が、生産者番号を生産者マスタで引き、等級・階級を規格表の読み替えで引き当て、出荷数と受入数を比べる
- 自動「出荷台帳」のシートに行を書き込み、印の付いた行は集荷場ごとの「確認待ち」の一覧に、伝票の画像のリンクとともに載せる
- 人集荷場の担当が、確認待ちを見て、荷を受けた記憶と控えで確かめ、確かめた値をシートに書く
- 人販売の担当が、印の無い行と確かめの済んだ行を流し見て、販売・精算のシステムに取り込むCSVを出す
各工程の詳しい説明を読む
- 集荷場の担当が、その日の伝票を束ねて営農経済センターに回す(または複合機でスキャンしてメールで送る)
- 販売の担当が伝票を1枚ずつめくり、生産者番号で生産者を開く
- 品目、等級、階級を見て、システムの規格に読み替える
- 受入数を確かめ、出荷数と違えば受入数のほうを打ち込む
- 販売・精算のシステムに出荷の明細を1行ずつ打ち込む
- 読めない字、合わない生産者番号、品目に無い階級は付箋を付け、集荷場か生産者に電話で確かめる
- 精算の締めの前に、精算の担当が生産者ごとの出荷の合計を確かめる
(a)打ち込みが多い。 1枚の伝票に品目が数行あり、3,000枚で1万行近くになります。出荷の多い月は、前日の伝票の打ち込みが翌日の昼までかかります。
(b)出荷数と受入数の取り違え。 2つの数が並んで書かれているので、急いでいると生産者が書いた出荷数を打ち込んでしまいます。 取り違えは精算の締めの前の照合まで見えず、見つからなければそのまま生産者に払われます。
(c)書き方の読み替えが担当者の頭の中にある。 「◎」が秀か、「大」がLか2Lかは、品目と部会で違います。読み替えを知っている担当者が休むと、打ち込みが止まるか、誤った規格で入ります。
(d)生産者番号の書き間違い。 番号を1桁違えて書いた伝票は、別の生産者の出荷として入り、その人に代金が払われます。 氏名と番号を見比べるのは、忙しいときほど省かれます。
- 【人】 集荷場の担当が、その日の伝票(1枚目の原本)を複合機でスキャンし、集荷場ごとの共有ドライブのフォルダに保存する
- 【自動】 Google Apps Script が10分おきにフォルダを確かめ、新しいPDFを取り出す
- 【自動】 Google Document AI の Form Parser が、伝票の欄のキーと値、品目の表、それぞれの信頼度を返す
- 【自動】 OpenAI API が、読み取り結果を伝票の見出しと品目の行に、書かれたとおりに写す
- 【自動】 Apps Script が、生産者番号を生産者マスタで引き、等級・階級を規格表の読み替えで引き当て、出荷数と受入数を比べる
- 【自動】 「出荷台帳」のシートに行を書き込み、印の付いた行は集荷場ごとの「確認待ち」の一覧に、伝票の画像のリンクとともに載せる
- 【人】 集荷場の担当が、確認待ちを見て、荷を受けた記憶と控えで確かめ、確かめた値をシートに書く
- 【人】 販売の担当が、印の無い行と確かめの済んだ行を流し見て、販売・精算のシステムに取り込むCSVを出す
7番目が、この設計の分かれ目です。 読めない数字と食い違いは、営農経済センターではなく、荷を受けた集荷場の担当に返します。 荷を数えたのは集荷場の担当で、その日のうちなら、荷の記憶と受付の控えで確かめられます。 数日たってセンターから電話で聞いても、もう分かりません。
販売・精算のシステムへの取り込みは、人が行います。 読み取った値がそのまま精算の数になる経路は作りません。
02今回想定するシステム構成
出荷伝票(生産者の手書き、受入数は集荷場の担当の手書き) │ 集荷場の複合機でスキャン、共有ドライブへ ▼【トリガー】Apps Script の時間主導型トリガー(10分おき) Google Apps Script ── 新しいPDFを取り出す ▼ Google Document AI(Form Parser) │ 見出しの欄、品目の表、信頼度 ▼ OpenAI API ── 見出しと品目の行に、書かれたとおりに写す ▼ Google Apps Script ── 生産者の引き当て/規格の読み替え/出荷数と受入数の比較 ▼ 「出荷台帳」シート ──▶ 印の付いた行は集荷場ごとの「確認待ち」へ(伝票の画像のリンク) ▼ 【集荷場の担当が確かめる/販売の担当が流し見てCSVを出す】 ▼ 販売・精算のシステムへ出荷の明細を取り込む(人の操作)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | OpenAI API(伝票の欄を出荷台帳の行に写す) | Claude API、Gemini API |
| 連携 | Google Apps Script(フォルダの確認、各APIの呼び出し、シートへの書き込み) | Python |
| 差異計算 | Google Apps Script(生産者の引き当て、規格の読み替え、数の比較) | Python |
| 保管 | Google ドライブ(伝票のPDFと読み取り結果) | 組合のファイルサーバー |
新しく足すのは、規格の読み替え表です。 担当者の頭の中にある「品目・部会ごとに、生産者の書き方がどの等級・階級に当たるか」を1枚のシートにまとめます。ここが整っていないと、正しく読めた伝票まで「規格に無い」として返されます。
土台は Document AI の Form Parser です。 公式のページでは、OCRのテキストに加えてキーと値のペア、チェックボックス、表、一般的なエンティティを取り出すとされ、プロセッサの一覧で日本語(ja)は手書きに対応する言語として示されています。伝票の「出荷日」「生産者番号」はキーと値のペアとして、品目の行は表として読めます。
Form Parser の注意書きのうち、この題材で効くのは2つです。 表はセルが行や列にまたがらない単純なものだけが対象とされていること、値が空のキーと値のペアは確実には読み取れないとされていることです。受入数の欄が空の行は、空として返らないことがあります(第7章)。
処理する場所は、リージョンの一覧から選びます。 マルチリージョンの us と eu、シンガポール(asia-southeast1)などがあり、日本のリージョンはありません。 伝票には生産者の氏名と出荷の量が書かれるので、組合の規程で国外で処理してよいかを導入前に確かめます(第13章)。
03どうやって実装するのか
処理の起点を決める
Apps Script の時間主導型トリガーで、10分おきに集荷場ごとのフォルダを確かめます。 公式のページでは、時間主導型のトリガーは毎分から月1回までの間隔で設定でき、実行の時刻はわずかにずれることがあるとされています。
10分おきにするのは、集荷場の担当がその日のうちに確認待ちを片づけられるようにするためです。 集荷は午前と夕方に集中し、夕方の荷の伝票は、担当が帰る前に確認待ちに出ていないと、確かめが翌日になります。 翌日には、荷はもう市場に向けて出ています。
処理が終わったPDFは「処理済み」のフォルダに移します。 移すのは出荷台帳への書き込みが終わったときだけで、フォルダに残っている数が、そのまま未処理の数になります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 出荷伝票のPDF | スキャンした伝票の画像、集荷場、スキャンした日時 | 集荷場ごとの共有ドライブのフォルダ |
| 読み取り結果 | 見出しの欄のキーと値、品目の表のセル、各要素の信頼度と位置 | Google Document AI |
| 生産者マスタ | 生産者番号、氏名、部会、出荷する集荷場 | 販売・精算のシステムから出したCSV |
| 規格表 | 品目ごとの等級と階級の組み合わせ、1ケースの入り数 | 販売・精算のシステムから出したCSV |
| 規格の読み替え表 | 品目・部会ごとの、生産者の書き方と等級・階級の対応 | 新しくまとめるシート |
| 集荷の予定 | 集荷場ごとの集荷日、品目ごとの出荷の時期 | 自社で用意する表 |
| 集荷場の日計 | 集荷場ごと・品目ごとのその日の受入数の合計、伝票の枚数 | 集荷場の担当が日ごとに書くシート |
質を決めるのは、規格の読み替え表です。 「◎」「A」「秀」が同じ等級か、「大」がLか2Lかは、品目と部会で違います。読み替え表が無ければ、規格の確かめはすべて人に戻ります。
集荷の予定は、出荷日の確かめに使います。 集荷の無い日付や、その時期に出荷の無い品目が書かれた伝票を拾います。
データの取得方法を決める
Apps Script は、フォルダの新しいPDFを Form Parser のプロセッサに送ります。オンラインの処理は1回の要求で最大15ページなので、1枚の伝票を1つのPDFにしてスキャンします。 まとめて1つのPDFにすると、15ページを超えて1回で送れないうえ、伝票の区切りを後から探すことになります。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 見出しの欄 | 各ページの formFields(fieldName/fieldValue) | 出荷日、生産者番号、氏名、受付の印の有無 |
| 品目の表 | 各ページの tables(headerRows/bodyRows のセル) | 品目、等級、階級、出荷数、受入数、入り数 |
| 全文 | 応答の text | 欄や表として取れなかった値を本文から拾う |
| 信頼度 | 各要素の layout の confidence | 読めた数字と、かすれた数字の区別 |
| 位置 | layout の boundingPoly | 確認待ちで、伝票の該当箇所を示す |
公式のページでは、Form Parser の表のセルの rowSpan と colSpan は常に1とされています。伝票の様式で「数量」の見出しの下に「出荷数」「受入数」の2列が並ぶ形だと、見出しの行が崩れて、どちらの列が受入数か分からなくなることがあります。 列の順番は様式で決まっているので、位置と見出しの文字の両方で列を決めるのが、次の生成AIの仕事の1つです。
生産者マスタ・規格表・読み替え表は、Apps Script がシートを読むだけです。生産者番号は文字列のまま読み、先頭の0が落ちないようにします。
AIへ渡す前に整形する
- 形式の確認 … 公式の対応形式は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などです。複合機の保存はPDFにそろえます
- 解像度の確認 … 公式のページでは、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよいとされています。複合機の既定の設定を300dpiにします
- 原本の確認 … 複写式の伝票は、1枚目の原本をスキャンします。 2枚目以降の複写は字が薄く、数字の読み取りが落ちます
- 集荷場の決定 … 保存されたフォルダから集荷場を決め、その集荷場の生産者と集荷の予定を引きます
- 重複の確認 … 同じ生産者・出荷日・品目の伝票がすでにあれば、二重のスキャンか、同じ日の2回目の出荷かを確かめる印を付けます
3番目を軽く見ないでください。 複写の控えをスキャンすると、受入数の欄だけが原本にしか書かれていないことがあります。集荷場の担当が受入数を原本だけに書く運用なら、控えでは受入数が空として読まれ、生産者の出荷数がそのまま精算に回ることになります。
AIに処理させる
させるのは、読み取り結果を出荷台帳の項目に書かれたとおりに写すことと、表が崩れたときに列と行を決め直すことです。 生産者の引き当ても、規格の読み替えも、数の比較も、Apps Script の規則で行います。
| させること | 中身 | 判断できないときの扱い |
|---|---|---|
| 見出しの写し | 出荷日(書かれたとおり)、生産者番号、氏名、受付の印の有無 | 読めなければ unreadable、空欄なら blank |
| 品目の写し | 品目名を書かれたとおりに | 読めなければ unreadable |
| 等級・階級の写し | 書かれたとおりの文字や記号 | 空欄なら blank |
| 2つの数の写し | 出荷数と受入数を別々に | 受入数の欄が空なら received_blank |
| 列と行の決め直し | 見出しが崩れた表で、どの列が出荷数・受入数かを位置で決める | 決められなければ table_broken |
| 訂正の写し | 二重線で消された数と書き直された数 | 両方を写す |
5行目が、AIを使う理由です。 2段の見出しが崩れた表は、列の数と見出しの数が合いません。 位置と見出しの文字からどの列が受入数かを決めるのは、決まった規則では書きにくい作業です。
| させないこと | 理由 |
|---|---|
| 読めない数字をそれらしく決める | 精算の金額が変わる |
| 等級・階級を規格表の言葉に読み替える | 読み替えは品目・部会ごとの表で行う |
| 受入数が空のとき出荷数で埋める | 受け入れの確かめが済んでいない |
| 生産者番号と氏名の食い違いを片方に寄せる | どちらが正しいかは集荷場で確かめる |
| 等級・階級が正しいかを判断する | 格付けは検査の担当が決める |
3行目が、この題材でいちばん起きやすい失敗です。 受入数の欄が空の行を、隣の出荷数で埋めると、集荷場で数え直していない数が精算に回ります。 空なら received_blank にして、集荷場の担当が確かめます。
指示内容を固定する
あなたは農協の営農経済センターの担当で、集荷場で書かれた
出荷伝票の読み取り結果を、出荷台帳の項目に写す立場です。
OCRが返した結果だけを見て、書かれていることを写してください。
【写す項目】
見出し:ship_date_text(出荷日。書かれたとおり)、grower_no_text、
grower_name、receipt_stamp(受付の印。present/absent/unclear)
品目の行:item_text、grade_text(等級。書かれたとおり)、
size_text(階級。書かれたとおり)、shipped_qty_text(出荷数)、
received_qty_text(受入数)、pack_text(入り数や重さ)
【厳守事項】
- 数字は書かれたとおりの文字列で写してください。
読みにくい数字を、ありそうな数字に直さないでください。
読めない桁があれば status を unreadable にしてください。
- 出荷数と受入数は別々に写してください。
受入数の欄が空なら received_qty_text を空にし、status を
received_blank にしてください。出荷数で埋めないでください。
- 等級と階級は、「◎」「A」「大」のような記号や書き方のまま
写してください。「秀」「L」などに言い換えないでください。
- 見出しが崩れていてどの列が受入数か分からないときは、
位置で決め、決められなければ table_broken を true にしてください。
- 二重線で消された数と書き直された数があるときは、両方を写し、
corrected を true にしてください。
- 生産者番号と氏名が合わないように見えても、どちらも直さないでください。
- 出荷伝票でない書類と判断した場合は、document_type に種類を書いてください。
【読み取り結果】{ocr_result}
生産者マスタと規格表をAIに渡していないことが、このプロンプトのいちばんの工夫です。 マスタを見せると、読みにくい生産者番号をマスタにある番号に寄せて写します。隣の番号は、同じ部会の別の生産者であることが多いので、寄せた瞬間に別の人の出荷になります。
等級と階級を言い換えさせないのも同じ理由です。 「大」をLと言い換えるか2Lと言い換えるかは品目で違い、AIが一般的な意味で言い換えると、その品目の規格とずれます。
出力形式を固定する
次の形のJSONで受け取ります。 OpenAI API の構造化出力(Responses API の text.format に type: "json_schema" と strict: true を指定する方式)を使い、形を固定します。
{
"document_type": "shipping_slip",
"table_broken": false,
"header": [
{ "item": "ship_date_text | grower_no_text | grower_name | receipt_stamp",
"value": "", "status": "read | blank | unreadable" }
],
"lines": [
{
"item_text": "", "grade_text": "", "size_text": "",
"shipped_qty_text": "", "received_qty_text": "", "pack_text": "",
"status": "read | unreadable | received_blank",
"corrected": false, "previous_qty": ""
}
]
}
公式のページでは、構造化出力ではすべての項目を required にする必要があるとされ、省略してよい項目は null との組み合わせで表すとされています。空欄を空文字で返させ、status で「空」と「読めない」を分けます。
1つ目の理由は、出荷台帳の列と1対1にできることです。 Apps Script は lines を規格の読み替え表で引き当て、システムの規格コードと受入数の列を足すだけで、取り込みのCSVの形になります。
2つ目は、確認待ちに回す理由を規則で持てることです。
| 条件 | 印 |
|---|---|
| 生産者番号が生産者マスタに無い、または氏名と合わない | grower_check |
| 品目が規格表に無い、または等級・階級が読み替え表で引き当たらない | spec_check |
受入数が received_blank、または出荷数と受入数が違う | qty_check |
数字の桁が unreadable | qty_unreadable |
| 出荷日が集荷の予定に無い日、またはスキャンした日より後 | date_check |
受付の印が absent、表が崩れている、document_type が伝票でない | check_image |
grower_check と qty_check は、他の印より先に集荷場の担当に出します。 どちらも、誰にいくら払うかに直結するからです。出荷数と受入数が違うこと自体は珍しくなく、傷みで受け入れを減らした行もあります。印は「違う」という事実だけを示し、どちらが正しいかは集荷場の担当が決めます。
公式のページでは、拒否の応答は refusal の要素として返り、出力の上限で切れたときは status が incomplete になるとされています。どちらのときも出荷台帳に書かず、check_image で人に回すか呼び直します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 集荷場ごとの共有ドライブのフォルダ | Apps Script | 新しいPDFを取り出し、処理済みに移す |
| Google Document AI | REST API の呼び出し | 見出しの欄、品目の表、信頼度を返す |
| OpenAI API | REST API の呼び出し | 伝票の欄を出荷台帳の行に写す |
| 生産者マスタ・規格表・読み替え表 | スプレッドシートの読み取り | 生産者の引き当てと規格の読み替え |
| 出荷台帳・確認待ちのシート | 書き込み | 見出しと品目の行、印、伝票の画像のリンク |
販売・精算のシステムには、この構成から書き込みません。 取り込むCSVを出すのは販売の担当で、取り込むのも販売の担当の操作です。 読み取りの誤りが、そのまま精算の数になることはありません。
生産者への問い合わせも、この構成からは送りません。 生産者に確かめるのは、顔を知っている集荷場の担当です。数の食い違いを機械の文面で知らせると、受け入れの判断を疑われていると受け取られかねません。
人が確認する
集荷場の担当が見るのは、自分の集荷場の確認待ちだけです。 販売の担当は、印の無い行と確かめの済んだ行を流し見て、取り込みのCSVを出します。
qty_checkを先に見る … 受付の控えと荷の記憶で受入数を確かめます。傷みで受け入れを減らした行は、減らした理由も書きますgrower_checkを見る … 伝票の画像で番号と氏名を見て、生産者に確かめますspec_checkを見る … 新しい書き方なら、読み替え表に足しますqty_unreadableとdate_checkを見る … 画像を開き、読めない数字は生産者か控えで確かめます- 確かめた値をシートに書く … 書いた行は、販売の担当の次のCSVに入ります
販売の担当の流し見では、集荷場ごと・品目ごとの受入数の合計を、集荷場の日計と比べます。 1枚ずつは合っていても、伝票のスキャン漏れがあれば合計が合いません。 合わない日は、集荷場に伝票の枚数を確かめます。
目標は、3,000件をならして1件0.6分です。 印の無い伝票は流し見で十数秒、印の付いた伝票は控えや生産者に確かめるので数分かかります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 複写の控えがスキャンされる | 字が薄く unreadable が増える。原本でスキャンし直す |
| 受入数の欄が空 | received_blank。出荷数で埋めず、集荷場の担当へ |
| 見出しが崩れて列が決まらない | AIが位置で決める。決められなければ table_broken で担当へ |
| 1枚に書ききれず2枚目に続く | 生産者と出荷日が同じ伝票を並べて担当へ。自動でつながない |
| 新しい品目や新しい書き方が出る | spec_check。担当が読み替え表に足す |
| 生産者マスタの更新が遅れている | 新しい生産者が grower_check になる。マスタの登録を頼む |
| AIが拒否の応答を返す | check_image で人に回す。出荷台帳には書かない |
| OCR・AIが応答しない | PDFを処理済みに移さずに残す。次の実行で拾い直す |
上の3行が大半を占めます。 どれもAIの問題ではなく、スキャンのしかたと伝票の様式の問題です。見出しが崩れやすいなら、伝票の様式を1段の見出しに変えることを検討します。
記録を残す
- 元の伝票のPDFと、集荷場・スキャンした日時
- OCRが返したJSONの全文と、OpenAI API の応答の全文
- 引き当てに使った生産者マスタ・規格表・読み替え表の版
- 付いた印と、集荷場の担当が確かめた結果・理由・確かめた日時
- 読み替え表に足した行と、足した日
- 集荷場ごと・生産者ごとの
qty_checkとunreadableの件数
3つ目で表の版を残すのは、読み替え表が新しい書き方のたびに育つためです。 精算の後で生産者から問い合わせがあったとき、どの版の読み替えで規格を決めたかが分からないと、説明ができません。
最後の行は、生産者と集荷場への相談の材料になります。 特定の生産者だけ読めない数字が多いなら、書き方の相談をします。
04実装レベルの3段階
半自動化で、1件2分が1.2分程度になります。 打ち込みは無くなりますが、生産者と規格の確かめと、数の食い違いの確かめは、目で行う作業として残ります。 本格構成で0.6分になり、この段階が本記事の想定です。 差が大きいのは、確かめが規則に移り、販売の担当が見るのが印の無い行の流し見だけになるためです。 段階を飛ばさないでください。 半自動化のシートを1か月見ると、読み替え表に無い書き方と、受入数を書き忘れる集荷場が分かります。
05工数削減シミュレーション
導入後 3,000件 × 0.6分 ÷ 60 = 30 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 農協(JA)や出荷組合の集荷場で、生産者が出荷のたびに手書きの出荷伝票を書き、営農経済センターの担当が販売・精算のシステムに打ち込んでいる場合。施設園芸と露地の品目を組み合わせて、年間を通して毎月出荷がある場合。等級・階級の書き方が生産者ごとにまちまちで、受け入れた数と伝票の数の食い違いに気づくのが精算の直前になる場合。
- 出荷の申告をすでに生産者のスマートフォンや端末で受けていて、手書きの伝票がほとんど無い場合。出荷が特定の季節の数か月に限られ、残りの月は伝票が届かない場合。生産者の出荷の数量や精算の情報を国外のリージョンで処理することを、組合の規程で認めていない場合。なお、等級・階級の格付けそのもの、精算の単価、共同計算の配分の判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の伝票から30枚を選ぶ(出荷数と受入数が違った伝票、品目の多い伝票、読みにくい伝票を必ず入れる)
- その30枚について、当時のシステムの出荷の明細を用意する
- 伝票のPDFを手元のAIサービスの画面に1枚ずつ貼り付ける
- 「この出荷伝票の出荷日、生産者番号、氏名、品目、等級、階級、出荷数、受入数を、書かれたとおりに写してください。数字を補ったり直したりしないでください。等級と階級は記号のまま写してください。受入数が空なら空にしてください」と指示する
- 写された値を、当時の出荷の明細と比べる
| 出てきた内容 | 判断 |
|---|---|
| 当時と同じ値が写せ、出荷数と受入数が別々に出た | OCRと Apps Script の連携に進む |
| 受入数が空の行を出荷数で埋めた | 指示の書き方で直る。構成は有効 |
| 2段の見出しで列がずれる | 様式ごとの傾向を見る。直らない様式は table_broken として人に回す |
| 読めない数字が多い | 原本かどうかと、スキャンの設定が先 |
1行目の後半が、この構成の価値を確かめるところです。 2つの数が別々に写せれば、取り違えという失敗の型そのものが無くなります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 受入数が空の行を出荷数で埋める | 別々に写させ、空なら received_blank |
| 生産者番号がマスタの番号に寄せられる | 生産者マスタをAIに見せない。 引き当ては Apps Script で行う |
| 等級・階級が一般的な意味で言い換えられる | 記号のまま写させ、品目・部会ごとの読み替え表で引き当てる |
| 2段の見出しで列がずれる | 単純な表だけが対象。AIに位置で列を決めさせ、決まらなければ人へ |
| 複写の控えで字が薄い | 1枚目の原本をスキャンする |
| 生産者番号の先頭の0が落ちる | 文字列のまま読み書きする |
| 確認待ちがセンターに集まる | 荷を受けた集荷場の担当に返す |
| 国外での処理を確かめていない | 日本のリージョンが無い。組合の規程を先に確かめる |
上の3行が、この構成の失敗のほとんどです。 どれも、AIがもっともらしい側に寄せて埋めてしまうという同じ型の失敗です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 生産者の氏名と生産者番号、出荷の品目・数量・規格、出荷日です。生産者ごとの出荷の量は、その家の収入に直結する情報で、同じ部会の他の生産者にも知られたくない情報です。
- 国外で処理することを確かめる … Document AI のリージョンの一覧に日本はありません。組合の規程で、伝票を国外のリージョンで処理してよいかを確かめます。認められない場合は、日本のリージョンで処理できる製品を検討します
- 生成AIに渡す範囲を絞る … 渡すのは伝票の読み取り結果だけです。生産者マスタや他の生産者の出荷は渡さず、引き当ては Apps Script の側で行います
- 精算の数を自動で取り込まない … 販売・精算のシステムへの取り込みは、販売の担当の操作だけです
- 確認待ちの共有範囲を集荷場ごとに分ける … 集荷場の担当が見るのは、自分の集荷場の確認待ちだけにします
- 格付けを機械に決めさせない … 等級・階級は写すだけで、正しいかどうかは検査の担当が決めます
- APIキーをスクリプトに書き込まない … スクリプトのプロパティに置き、編集できる人を絞ります
誤りが起きた場合のリスクは、別の生産者に代金が払われることと、受け入れていない数で代金が払われることの2つです。 生産者マスタを見せないことと、受入数を出荷数で埋めさせないことで、設計の側から防ぎます。
10まず何から始めるか
1週目:規格の読み替え表をまとめる
販売の担当の頭の中にある、品目・部会ごとの生産者の書き方と等級・階級の対応を1枚のシートにまとめます。出荷の多い品目から埋めます。
2週目:30枚で試す
先月の伝票30枚を手元のAIサービスに貼り付けて、項目を写させます。受入数を出荷数で埋めていないか、等級を言い換えていないかを最優先で見ます。
3週目:組合の規程の確認と、スキャンの運用を決める
伝票を外部のサービスで、国外のリージョンで処理してよいかを、組合の規程で確かめます。 あわせて、集荷場ごとに原本を1枚1PDFでスキャンする手順を決めます。
4週目:フォルダから出荷台帳までをつなぐ
Apps Script でフォルダを確かめ、OCRを呼び、写した値を出荷台帳のシートに書き出すところまで作ります。この時点では印を出さず、販売の担当がこれまでどおり打ち込みながら、シートの値が合っているかを見ます。
2か月目: 生産者の引き当て・規格の読み替え・数の比較と、集荷場ごとの確認待ちを足します。3か月目以降: 1件2分が何分になったかを実測します。出荷数と受入数の取り違えが精算の前にすべて止まり、読み替え表が育って spec_check が新しい品目のときだけになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser がOCRのテキストに加えてキーと値のペア、チェックボックス、表、一般的なエンティティを抽出すること。言語の一覧で日本語(ja)が手書きに対応する言語として示されていること。オンラインの処理が最大15ページであること | Google Cloud: Processor list | 2026-10-14 |
| 値の入っていないキーと値の組を確実には読み取れないこと。表はセルが行や列にまたがらない単純なものが対象であること | Google Cloud: Form Parser | 2026-10-14 |
formFields の fieldName/fieldValue、layout の confidence・boundingPoly、表の headerRows/bodyRows と、Form Parser では rowSpan・colSpan が常に1であること | Google Cloud: Handle the processing response | 2026-10-14 |
| 対応形式が PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などであること。スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよいこと | Google Cloud: Supported files | 2026-10-14 |
マルチリージョンが us と eu で、単一リージョンにシンガポール(asia-southeast1)などがあり、日本のリージョンが一覧に無いこと | Google Cloud: Regional and multi-regional support | 2026-10-14 |
Responses API で text.format に type: "json_schema" と strict: true を指定して構造化出力を使えること。すべての項目を required にする必要があり、省略は null との組み合わせで表すこと。拒否の応答が refusal として返ること。出力の上限で incomplete になりうること | OpenAI API: Structured model outputs | 2026-10-14 |
| 時間主導型のトリガーが毎分から月1回までの間隔で設定でき、実行の時刻がわずかにずれることがあること | Apps Script: Installable triggers | 2026-10-14 |
等級・階級の格付け、精算の単価、共同計算の配分、伝票を外部のサービスで処理してよいかは、組合の規程と部会の取り決めに沿って決めてください。 本記事は各製品の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1507)についてのご相談はこちらから。
