倉庫に荷主・仕入先からFAXで届く手書きの入庫予定表を読み取り、品番・数量・入庫日を入庫予定データにそろえて、読み取れない項目を担当に返す
荷主や仕入先からFAXで届く手書きの入庫予定表を読み取り、品番・数量・入庫日を入庫予定データの行にそろえます。読み取れない項目と、品目マスタに無い品番や単位の食い違いは、届いたその日に担当に返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 商社/物流/製造
- 対象部門
- 物流
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- インターネットFAXが入庫予定表を受信し、入荷受付のメールにPDFで転送する
- 受付の担当がPDFを開き、荷主と入庫予定日を確かめる
- 品番を品目マスタで探し、仕入先の品番なら手元の対応表で荷主の品番に直す
- 数量の単位を確かめ、ケースとバラが混ざっていれば入数で直す
- 倉庫管理システムに入庫予定を1行ずつ打ち込む
- 読めない数字、見つからない品番、日付のおかしいものはメモし、仕入先か荷主の窓口に電話で確かめる
- 入庫予定日の前日に、入庫予定の一覧を現場の検品の担当へ渡す
- 自動インターネットFAXが入庫予定表を受信し、入荷受付専用のメールアドレスにPDFで転送する
- 自動Google Apps Script が5分おきにメールを確かめ、新しいPDFをドライブに保存する
- 自動Google Document AI の Form Parser が、予定表の欄のキーと値、品目の表、それぞれの信頼度を返す
- 自動OpenAI API が、読み取り結果を入庫予定データの行(見出しと品目ごとの明細)に、書かれたとおりに写す
- 自動Apps Script が、品番を品目マスタと対応表で引き当て、単位を入数でバラにそろえ、日付と曜日の食い違いを確かめる
- 自動「受付待ち」のシートに行を書き込み、印の付いた行は荷主の窓口の担当の「差し戻し」の一覧に、予定表の写しのリンクとともに載せる
- 人受付の担当が、印の無い予定表を流し見て、倉庫管理システムに取り込むCSVを出す
- 人荷主の窓口の担当が、差し戻しの一覧を見て、仕入先か荷主に確かめ、確かめた値を受付待ちのシートに書く
各工程の詳しい説明を読む
- インターネットFAXが入庫予定表を受信し、入荷受付のメールにPDFで転送する
- 受付の担当がPDFを開き、荷主と入庫予定日を確かめる
- 品番を品目マスタで探し、仕入先の品番なら手元の対応表で荷主の品番に直す
- 数量の単位を確かめ、ケースとバラが混ざっていれば入数で直す
- 倉庫管理システムに入庫予定を1行ずつ打ち込む
- 読めない数字、見つからない品番、日付のおかしいものはメモし、仕入先か荷主の窓口に電話で確かめる
- 入庫予定日の前日に、入庫予定の一覧を現場の検品の担当へ渡す
(a)打ち込みが多い。 600枚のFAXに、品目の行が合わせて数千行あります。受付の2名は、電話の応対と打ち込みを行き来しながら、1日に30枚前後を処理しています。 打ち込みが追いつかない日は、翌日の入庫予定が前日の夕方まで入りません。
(b)品番と単位の食い違いに気づくのが検品のとき。 仕入先の品番を対応表で直し忘れたり、ケースとバラを取り違えたりした行は、倉庫管理システムの上では正しい入庫予定に見えます。 検品の担当がハンディで商品を読んだとき、予定に無い品番や12倍の数量で初めて分かります。
(c)読めない数字を推測で打ち込む。 FAXの画像は元の紙より細かい文字がつぶれます。「1」と「7」、「6」と「8」を、前回の入庫の数に近いほうで打ち込んでしまうことがあります。外れれば検品で数が合わず、仕入先と荷主の両方に確かめることになります。
(d)日付の書き方がそろっていない。 「10/15(水)」「15日AM」「来週火曜」と書き方がまちまちで、曜日と日付が合っていない予定表もあります。 どちらが正しいかを確かめずに日付だけを打ち込むと、トラックが予定と違う日に着きます。
- 【自動】 インターネットFAXが入庫予定表を受信し、入荷受付専用のメールアドレスにPDFで転送する
- 【自動】 Google Apps Script が5分おきにメールを確かめ、新しいPDFをドライブに保存する
- 【自動】 Google Document AI の Form Parser が、予定表の欄のキーと値、品目の表、それぞれの信頼度を返す
- 【自動】 OpenAI API が、読み取り結果を入庫予定データの行(見出しと品目ごとの明細)に、書かれたとおりに写す
- 【自動】 Apps Script が、品番を品目マスタと対応表で引き当て、単位を入数でバラにそろえ、日付と曜日の食い違いを確かめる
- 【自動】 「受付待ち」のシートに行を書き込み、印の付いた行は荷主の窓口の担当の「差し戻し」の一覧に、予定表の写しのリンクとともに載せる
- 【人】 受付の担当が、印の無い予定表を流し見て、倉庫管理システムに取り込むCSVを出す
- 【人】 荷主の窓口の担当が、差し戻しの一覧を見て、仕入先か荷主に確かめ、確かめた値を受付待ちのシートに書く
6番目が、この設計の分かれ目です。 読めない項目と食い違いのある行は、受付の担当の手元に残さず、荷主の窓口の担当に返します。 仕入先や荷主とのやり取りを持っているのは窓口の担当で、受付の担当が電話と打ち込みを行き来する状態をなくします。
倉庫管理システムへの取り込みは、人が行います。 取り込むCSVを出すのは、印の無い行と、確かめが済んだ行だけです。読み取った値がそのまま入庫予定になる経路は作りません。
02今回想定するシステム構成
入庫予定表(手書き、FAX) │ インターネットFAXがPDFでメールに転送 ▼【トリガー】Apps Script の時間主導型トリガー(5分おき) 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つです。 表はセルが行や列にまたがらない単純なものだけが対象とされていること、値が空のキーと値のペアは確実には読み取れないとされていることです。納品書の控えを流用した予定表は、品名の欄が2行にまたがることが多く、表として崩れて返ることがあります(第7章)。
処理する場所は、リージョンの一覧から選びます。 マルチリージョンの us と eu、シンガポール(asia-southeast1)などがあり、日本のリージョンはありません。 予定表には荷主と仕入先の取引の中身が書かれるので、荷主との契約や自社の決まりに照らして、国外で処理してよいかを導入前に確かめます(第13章)。
03どうやって実装するのか
処理の起点を決める
Apps Script の時間主導型トリガーで、5分おきに入荷受付専用のメールアドレスを確かめます。 公式のページでは、時間主導型のトリガーは毎分から月1回までの間隔で設定でき、実行の時刻はわずかにずれることがあるとされています。インストール型トリガーの一覧にメールの受信を起点とするものは無いので、一定の間隔で新しいメールを探す形にします。
5分おきにするのは、翌日の入庫予定が夕方に集中して届くためです。 差し戻しが窓口の担当に届くのが遅れると、仕入先の担当者が退社した後に問い合わせることになり、確かめが翌朝、つまり入庫の当日になります。
メールの探し方は GmailApp.search で、転送元のアドレスと「処理済み」のラベルが無いことを条件にします。 ラベルは受付待ちのシートへの書き込みが終わったときだけ付けます。途中で止まったメールは次の実行で拾い直され、「処理済み」の付いていないメールの数が、そのまま未処理の数になります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 入庫予定表のPDF | FAXの画像。受信日時、送信元のFAX番号 | インターネットFAXの転送メール |
| 読み取り結果 | 欄のキーと値、品目の表のセル、各要素の信頼度と位置 | Google Document AI |
| 品目マスタ | 荷主コード、荷主の品番、品名、JANコード、入数 | 倉庫管理システムから出したCSV |
| 品番の対応表 | 仕入先コード、仕入先の品番、荷主の品番 | 新しくまとめるシート |
| 送り主の一覧 | 送信元のFAX番号、仕入先コード、荷主コード、問い合わせ先 | 新しくまとめるシート |
| 受付の決まり | 入庫を受ける曜日と時間帯、休業日、前日の締切の時刻 | 自社で用意する表 |
質を決めるのは、送り主の一覧です。 予定表の送り主の欄は、手書きの社名か、ゴム印か、空欄のこともあります。送信元のFAX番号から仕入先と荷主が決まれば、品番の対応表のどの行を使うかが決まります。 番号が一覧に無い送り主は、品番の引き当てができないので、最初に差し戻します。
受付の決まりの表は、日付の確かめに使います。 休業日の入庫や、前日の締切を過ぎて届いた翌日の入庫を拾います。
データの取得方法を決める
Apps Script は、メールに付いたPDFをドライブの「受付」フォルダに保存し、Form Parser のプロセッサに送ります。オンラインの処理は1回の要求で最大15ページなので、ふつうの予定表は1回で足ります。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 見出しの欄 | 各ページの formFields(fieldName/fieldValue) | 送り主、荷主名、入庫予定日、時間帯、車両 |
| 品目の表 | 各ページの tables(headerRows/bodyRows のセル) | 品番、品名、数量、単位、ロット、賞味期限 |
| 全文 | 応答の text | 欄や表として取れなかった値を本文から拾う |
| 信頼度 | 各要素の layout の confidence | 読めた数字と、つぶれた数字の区別 |
| 位置 | layout の boundingPoly | 差し戻しのとき、写しの該当箇所を示す |
公式のページでは、Form Parser の表のセルの rowSpan と colSpan は常に1とされています。品名が2行にまたがって書かれた予定表は、2行目が品番と数量の空いた行として返ります。 これを前の行の続きとしてつなげるのが、次の生成AIの仕事の1つです。
品目マスタ・品番の対応表・送り主の一覧は、Apps Script がシートを読むだけです。品番は文字列のまま読み、先頭の0が落ちないようにします。
AIへ渡す前に整形する
- 形式の確認 … 公式の対応形式は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などです。転送はPDFにそろえます
- 解像度の確認 … 公式のページでは、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよいとされています。読めない項目の多い送り主には、高画質での送信か、PDFのメール添付をお願いします
- 送り主の決定 … 送信元のFAX番号を送り主の一覧で引き、仕入先と荷主を決めます
- 送り状の除外 … 1枚目の送り状は、読み取りの対象から外します
- 重複の確認 … 同じ送り主から同じ入庫予定日の予定表が短い間隔で2通届いたら、再送か訂正かを確かめる印を付けます
- 訂正の確認 … 「訂正」「変更」と書かれた予定表は、前の予定表と並べて担当に回します
3番目を先に行うのは、予定表の送り主の欄がいちばん読みにくい欄だからです。 ゴム印はFAXでつぶれ、社名が略称で書かれることもあります。FAX番号は送信の記録として確実に残るので、そちらで決めます。
AIに処理させる
させるのは、読み取り結果を入庫予定データの項目に書かれたとおりに写すことと、表が崩れたときに行をつなぎ直すことです。 品番の引き当ても、単位の換算も、日付の確かめも、Apps Script の規則で行います。
| させること | 中身 | 判断できないときの扱い |
|---|---|---|
| 見出しの写し | 荷主名、入庫予定日(書かれたとおり)、曜日、時間帯、車両 | 読めなければ unreadable、空欄なら blank |
| 品番の写し | 書かれたとおりの品番と、それが何の品番らしいか(仕入先・荷主・JAN) | 種類が分からなければ unknown_type |
| 数量と単位の写し | 数量の数字と、書かれた単位(cs・ケース・個・バラなど) | 単位が書かれていなければ unit_blank |
| 行のつなぎ直し | 2行にまたがって分かれた品名を、1つの品目の行に戻す | 戻せなければ table_broken |
| ロットと賞味期限の写し | 書かれたとおり | 空欄なら blank |
| 訂正の印 | 「訂正」「変更」の文字、二重線で消された数量 | 両方の値を写す |
4行目が、AIを使う理由です。 納品書の控えを流用した予定表では、品名が2行になり、表の行の数と品目の数が合いません。 位置と全文からどの行がどの品目の続きかを決めるのは、決まった規則では書きにくい作業です。
| させないこと | 理由 |
|---|---|
| 読めない数字をそれらしく決める | 検品で初めて合わないことが分かる |
| 品番を似た品番に直す | 引き当ては対応表で行う。似た品番は別の商品 |
| 単位を補う | 書かれていない単位を「ケース」と決めると12倍の誤りになる |
| 日付と曜日の食い違いを片方に寄せる | どちらが正しいかは送り主に確かめる |
| 入庫を受けるかどうかの判断 | 受付の決まりと窓口の担当が決める |
3行目が、この題材でいちばん起きやすい失敗です。 「10」とだけ書かれた行を、他の行に合わせてケースと読むか、バラと読むかで、数量が入数の倍だけ変わります。 書かれていなければ unit_blank にして、Apps Script が品目マスタの入数と前回の入庫の単位を並べ、窓口の担当が確かめます。
指示内容を固定する
あなたは物流センターの入荷受付の担当で、FAXで届いた入庫予定表の
読み取り結果を、入庫予定データの項目に写す立場です。
OCRが返した結果だけを見て、書かれていることを写してください。
【写す項目】
見出し:shipper_text(荷主名)、arrival_date_text(入庫予定日。書かれたとおり)、
weekday_text(曜日)、time_slot(時間帯)、vehicle(車両)
明細:item_code_text(品番。書かれたとおり)、code_type(supplier/shipper/jan/unknown)、
item_name、qty_text(数量)、unit_text(単位。書かれたとおり)、lot、best_before
【厳守事項】
- 数字は書かれたとおりの文字列で写してください。
読みにくい数字を、ありそうな数字に直さないでください。
読めない桁があれば status を unreadable にしてください。
- 品番は書かれたとおりに写してください。ハイフンや桁を補わないでください。
- 単位が書かれていない行は unit_text を空にし、status を unit_blank に
してください。他の行の単位に合わせないでください。
- 日付は書かれたとおりに写し、曜日が書かれていれば weekday_text に写して
ください。日付と曜日が合わなくても、どちらも直さないでください。
- 「来週火曜」のように日付が書かれていない場合も、書かれたとおり写してください。
- 品名が2行に分かれ、2行目の品番と数量が空のときは、前の行の続きとして
つなげてください。つなげられなければ table_broken を true にしてください。
- 二重線で消された数量と書き直された数量があるときは、両方を写し、
corrected を true にしてください。
- 入庫予定表でない書類と判断した場合は、document_type に種類を書いてください。
【読み取り結果】{ocr_result}
品目マスタをAIに渡していないことが、このプロンプトのいちばんの工夫です。 マスタを見せると、読みにくい品番をマスタにある品番に寄せて写します。似た品番は、色違いやサイズ違いの別の商品であることが多いので、寄せた瞬間に別の商品の入庫予定になります。
日付と曜日を別々に写させているのも同じ理由です。 片方だけを写させると、AIは合わないほうを黙って捨てます。両方を残しておけば、Apps Script が暦で照らして食い違いを拾えます。
出力形式を固定する
次の形のJSONで受け取ります。 OpenAI API の構造化出力(Responses API の text.format に type: "json_schema" と strict: true を指定する方式)を使い、形を固定します。
{
"document_type": "inbound_schedule",
"revision": false,
"table_broken": false,
"header": [
{ "item": "shipper_text | arrival_date_text | weekday_text | time_slot | vehicle",
"value": "", "status": "read | blank | unreadable" }
],
"lines": [
{
"item_code_text": "", "code_type": "supplier | shipper | jan | unknown",
"item_name": "", "qty_text": "", "unit_text": "",
"status": "read | unreadable | unit_blank",
"lot": "", "best_before": "", "corrected": false, "previous_qty": ""
}
]
}
1つ目の理由は、倉庫管理システムに取り込むCSVの列と1対1にできることです。 Apps Script は lines を品目マスタで引き当て、荷主の品番とバラの数量に直した列を足すだけで、取り込みのCSVの形になります。
2つ目は、差し戻しの理由を規則で持てることです。
| 条件 | 印 |
|---|---|
| 送信元のFAX番号が送り主の一覧に無い | sender_unknown |
| 品番が品目マスタにも対応表にも無い | item_unknown |
数量の桁が unreadable | qty_unreadable |
単位が unit_blank、またはマスタの入数と合わない書き方 | unit_check |
| 日付と曜日が暦で合わない、または日付が特定できない | date_conflict |
| 入庫予定日が休業日、または前日の締切を過ぎて届いた | slot_check |
表が崩れている、または document_type が予定表でない | check_image |
date_conflict と slot_check は、他の印より先に窓口の担当に出します。 日付が決まらない予定表は、バースと人員の段取りに入れられず、トラックが予定外の日に着く原因になります。
公式のページでは、拒否の応答はスキーマに従うとは限らず、そのときは output_text ではなく refusal の要素が返るとされています。応答の要素の種類を見て、refusal なら受付待ちに書かずに check_image で人に回します。 status が incomplete(出力の上限で切れた)のときも、シートに書かずに呼び直します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受信用のメール | Apps Script の GmailApp.search | 未処理の転送メールを探し、PDFを取り出す |
| Google ドライブ | Apps Script | 予定表のPDFと読み取り結果のJSONを保存する |
| Google Document AI | REST API の呼び出し | 欄、品目の表、信頼度を返す |
| OpenAI API | REST API の呼び出し | 予定表の欄を入庫予定データの行に写す |
| 品目マスタ・対応表・送り主の一覧 | スプレッドシートの読み取り | 品番の引き当てと入数、送り主の決定 |
| 受付待ち・差し戻しのシート | 書き込み | 見出しと明細、印、予定表の写しのリンク |
倉庫管理システムには、この構成から書き込みません。 取り込むCSVを出すのは受付の担当で、取り込むのも受付の担当の操作です。 読み取りの誤りが、そのまま検品の予定になることはありません。
仕入先への問い合わせも、この構成からは送りません。 窓口の担当が文面を使いたいときは、GmailApp.createDraft で下書きを作るところまでにします。
人が確認する
受付の担当が見るのは、印の無い予定表の流し見だけです。 件数・品目数・合計数量を見て、取り込みのCSVを出します。印の付いた行は、窓口の担当の差し戻しの一覧に移っています。
date_conflictとslot_checkを先に見る … 送り主に日付と時間帯を確かめます。曜日と日付のどちらが正しいかは、推測で決めませんqty_unreadableを見る … 写しの該当箇所を開き、読めない数字は仕入先に聞き直しますunit_checkを見る … 品目マスタの入数と前回の入庫の単位を見比べ、ケースかバラかを送り主に確かめますitem_unknownとsender_unknownを見る … 新しい品目か新しい送り主かを荷主に確かめ、対応表と送り主の一覧に足します- 確かめた値を受付待ちのシートに書く … 書いた行は、受付の担当の次のCSVに入ります
目標は、600件をならして1件1.5分です。 印の無い予定表は流し見で数十秒、印の付いた予定表は仕入先に確かめるので数分かかります。
例外に対処する
| 起きること | 対応 |
|---|---|
| FAXの画質が低く、読めない数字が多い | qty_unreadable。高画質の送信かPDFの添付を頼む |
| 品目の表が崩れて返る | AIが行をつなぎ直す。戻せなければ table_broken で担当へ |
| 送り状や別の書類が混ざる | document_type を見て、予定表でないページを外す |
| 同じ予定表が2回届く | 重複の印を付け、再送か訂正かを担当が確かめる |
| 「訂正」の予定表が届く | 前の予定表と並べて担当へ。前の予定を自動で消さない |
| 品目マスタの更新が遅れている | 新しい品目が item_unknown になる。荷主に登録を頼む |
| AIが拒否の応答を返す | check_image で人に回す。受付待ちには書かない |
| OCR・AIが応答しない | メールに「処理済み」のラベルを付けずに残す。次の実行で拾い直す |
上の2行が大半を占めます。 どちらもAIの問題ではなく、FAXの画質と、仕入先ごとの書式の問題です。
記録を残す
- 元の予定表のPDFと、受信日時・送信元のFAX番号
- OCRが返したJSONの全文と、OpenAI API の応答の全文
- 引き当てに使った品目マスタと対応表の版
- 付いた印と、窓口の担当が確かめた結果・送り主とのやり取り・確かめた日時
- 対応表と送り主の一覧に足した行と、足した日
- 送り主ごとの
qty_unreadableとunit_checkの件数
3つ目で品目マスタの版を残すのは、マスタが荷主の新商品のたびに変わるためです。 どの版で「見つからない」と判断したかが残っていないと、検品で予定に無い品番が出たとき、マスタの遅れか読み取りの誤りかを区別できません。
最後の行は、仕入先との相談の材料になります。 特定の仕入先だけ読めない数字が多いなら、FAXの画質か書式に理由があります。
04実装レベルの3段階
半自動化で、1件5分が3分程度になります。 打ち込みは無くなりますが、品番を対応表で直す作業と、単位と日付の確かめは、目で行う作業として残ります。 本格構成で1.5分になり、この段階が本記事の想定です。 差が大きいのは、引き当てと確かめが規則に移り、受付の担当が見るのが印の無い予定表の流し見だけになるためです。 段階を飛ばさないでください。 半自動化のシートを1か月見ると、対応表に無い品番と、単位を書かない仕入先が分かります。
05工数削減シミュレーション
導入後 600件 × 1.5分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 複数の荷主の商品を預かる営業倉庫や、卸・メーカーの物流センターで、荷主やその仕入先から手書きの入庫予定表がFAXで届き、入荷受付の担当が倉庫管理システムに打ち込んでいる場合。仕入先ごとに書式がばらばらで、品番の書き方や数量の単位(ケース・バラ)がそろっていない場合。読めない数字や合わない品番に気づくのが、トラックが着いて検品を始めたときになることがある場合。
- 入庫予定をすでに荷主の基幹システムからEDIやCSVで受け取っており、手書きのFAXがほとんど無い場合。入庫予定表が月に数十枚で、受付の担当が目で見て足りる場合。荷主の取引の情報を国外のリージョンで処理することを、荷主との契約や自社の決まりで認められない場合。なお、入庫を受けるかどうか、数量の違いを誰の責任とするかの判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の予定表から30枚を選ぶ(検品で数が合わなかったもの、行の多いもの、読みにくいFAXを必ず入れる)
- その30枚について、当時の倉庫管理システムの入庫予定と、検品の結果を用意する
- 予定表のPDFを手元のAIサービスの画面に1枚ずつ貼り付ける
- 「この入庫予定表の荷主、入庫予定日、曜日、品番、品名、数量、単位を、書かれたとおりに写してください。数字や品番を補ったり直したりしないでください。単位が書かれていない行は空にしてください。読めない数字は『読めない』としてください」と指示する
- 写された値を、当時の入庫予定と検品の結果と比べる
| 出てきた内容 | 判断 |
|---|---|
当時の入庫予定と同じ値が写せ、検品で合わなかった行が unreadable や unit_blank で出た | OCRと Apps Script の連携に進む |
| 読めない数字をそれらしく決めた | 指示の書き方で直る。構成は有効 |
| 品名が2行の予定表で行がずれる | 書式ごとの傾向を見る。直らない書式は table_broken として人に回す |
| 読めない数字が多い | FAXの画質が先。 送り主に送り方を相談する |
1行目の後半が、この構成の価値を確かめるところです。 検品で初めて分かった食い違いが、予定表の段階で印になっていれば、その分だけ荷下ろしの待ちが減ります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 読めない数字をAIがそれらしく決める | 書かれたとおりに写させ、読めない桁は unreadable |
| 品番が似た品番に寄せられる | 品目マスタをAIに見せない。 引き当ては対応表で行う |
| 書かれていない単位をケースと決める | 単位が無ければ空にさせ、入数と前回の単位を並べて人が確かめる |
| 日付と曜日の片方が黙って捨てられる | 両方を写させ、暦で照らす |
| 品名が2行の予定表で行がずれる | 単純な表だけが対象。AIに行をつながせ、戻せなければ人へ |
| 送り主の欄が読めない | 送信元のFAX番号で送り主を決める |
| 品番の先頭の0が落ちる | 品番は文字列のまま読み書きする |
| 拒否の応答をそのまま書く | 応答の要素の種類を見て、refusal は人へ回す |
| 国外での処理を確かめていない | 日本のリージョンが無い。荷主との契約を先に確かめる |
上の3行が、この構成の失敗のほとんどです。 どれも、AIがもっともらしい側に寄せて埋めてしまうという同じ型の失敗です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 荷主と仕入先の名前、品番と品名、数量、入庫の日時、ロットと賞味期限です。個人の情報はほとんど含みませんが、荷主の仕入の量と時期は、荷主の取引の情報そのもので、他の荷主に知られてはならない情報です。
- 国外で処理することを確かめる … Document AI のリージョンの一覧に日本はありません。荷主との契約や自社の決まりで、予定表を国外のリージョンで処理してよいかを確かめます。認められない場合は、日本のリージョンで処理できる製品を検討します
- 生成AIに渡す範囲を絞る … 渡すのは予定表の読み取り結果だけです。品目マスタや他の荷主の予定は渡さず、引き当ては Apps Script の側で行います
- 入庫予定を自動で取り込まない … 倉庫管理システムへの取り込みは、受付の担当の操作だけです
- 送り主への連絡を自動で送らない … 問い合わせは下書きまでです。荷主の取引先との関係に直接ひびきます
- シートの共有範囲を荷主ごとに考える … 受付待ちと差し戻しのシートには複数の荷主の予定が並びます。荷主の担当者に見せる場合は、その荷主の分だけを別のシートに出します
- APIキーをスクリプトに書き込まない … スクリプトのプロパティに置き、編集できる人を絞ります
誤りが起きた場合のリスクは、誤った数量や品番で入庫予定が立つことと、日付の誤りでトラックが予定外の日に着くことの2つです。 推測させないことと、日付と曜日を両方残すことで、設計の側から防ぎます。
10まず何から始めるか
1週目:品番の対応表と送り主の一覧をまとめる
受付の担当が手元で持っている対応表を、仕入先コードを付けて1枚のシートにまとめます。あわせて、送信元のFAX番号と仕入先・荷主の対応を一覧にします。予定表の多い上位30の送り主から埋めます。
2週目:30枚で試す
先月の予定表30枚を手元のAIサービスに貼り付けて、欄と品目を写させます。読めない数字を決めていないか、単位を補っていないかを最優先で見ます。
3週目:荷主との確かめ
予定表を外部のサービスで、国外のリージョンで処理してよいかを、荷主との契約と自社の決まりで確かめます。 あわせて、読めない数字の多い送り主を洗い出し、送り方の相談を始めます。
4週目:メールから受付待ちのシートまでをつなぐ
Apps Script で受信用のメールを確かめ、OCRを呼び、写した値を受付待ちのシートに書き出すところまで作ります。この時点では印を出さず、受付の担当がこれまでどおり打ち込みながら、シートの値が合っているかを見ます。
2か月目: 品番の引き当て・単位の換算・日付の確認と差し戻しの一覧を足し、窓口の担当への振り分けを始めます。3か月目以降: 1件5分が何分になったかを実測します。検品で初めて分かる食い違いがほとんど無くなり、対応表が育って item_unknown が新しい品目のときだけになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser がOCRのテキストに加えてキーと値のペア、チェックボックス、表、一般的なエンティティを抽出すること。言語の一覧で日本語(ja)が手書きに対応する言語として示されていること。オンラインの処理が最大15ページであること | Google Cloud: Processor list | 2026-10-13 |
| 値の入っていないキーと値の組を確実には読み取れないこと。表はセルが行や列にまたがらない単純なものが対象であること | Google Cloud: Form Parser | 2026-10-13 |
formFields の fieldName/fieldValue、layout の confidence・boundingPoly、表の headerRows/bodyRows と、Form Parser では rowSpan・colSpan が常に1であること | Google Cloud: Handle the processing response | 2026-10-13 |
| 対応形式が PDF、GIF、TIFF、JPEG、PNG、BMP、WebP であること。スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよいこと | Google Cloud: Supported files | 2026-10-13 |
マルチリージョンが us と eu で、単一リージョンにシンガポール(asia-southeast1)などがあり、日本のリージョンが一覧に無いこと | Google Cloud: Regional and multi-regional support | 2026-10-13 |
Responses API で text.format に type: "json_schema" と strict: true を指定して構造化出力を使えること。拒否の応答はスキーマに従うとは限らず refusal の要素が返ること。出力の上限で incomplete になりうること | OpenAI API: Structured model outputs | 2026-10-13 |
| 時間主導型のトリガーが毎分から月1回までの間隔で設定でき、実行の時刻がわずかにずれることがあること。インストール型トリガーの一覧にメールの受信を起点とするものが無いこと | Apps Script: Installable triggers | 2026-10-13 |
GmailApp.search でメールを検索でき、GmailApp.createDraft で下書きを作れること | Apps Script: Class GmailApp | 2026-10-13 |
入庫を受けるかどうか、数量の違いをどう扱うか、予定表を外部のサービスで処理してよいかは、自社の受付の決まりと荷主との取り決めに沿って決めてください。 本記事は各製品の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1401)についてのご相談はこちらから。
