店舗から物流センターに届く手書きの返品伝票を読み取り、店舗・品番・数量・返品理由を返品データにそろえて、出荷実績との数量の食い違いと理由の書き漏れを拾う
店舗から商品と一緒に物流センターへ届く手書きの返品伝票を読み取り、店舗・品番・数量・返品理由を返品データの形にそろえます。そのうえで、店舗に出荷した数より多い返品と、理由の書かれていない行を拾い、店舗への問い合わせの一覧にします。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 商社/小売/物流
- 対象部門
- 物流
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 返品の担当が箱を開け、実物の数を数えて、伝票の数量の横に数えた数を書き込む
- 事務担当が伝票を受け取り、倉庫管理システムの返品の登録の画面を開く
- 店舗コード、返品日、明細の品番・数量・返品理由を1行ずつ入力する
- 品番が書かれていない行は、品名から商品マスタを検索して品番を探す
- 理由の印が無い行と、品番が見つからない行を、表計算の問い合わせの一覧に書く
- 気になる行について、倉庫管理システムの出荷実績で、その店舗にその品番を出荷したかを確かめる
- 問い合わせの一覧がたまったところで、店舗へ電話かメールで確かめる
- 人返品の担当が実物を数え、伝票の「センター検品数」の欄に数を書き込んでから、複合機でスキャンする
- 自動スキャンのPDFが共有ドライブのフォルダに保存される
- 自動Google Apps Script が10分ごとにフォルダを見て、新しいPDFを Google Document AI の Form Parser に送る
- 自動上の欄の項目と明細の表、返品理由の四角の印の有無、読み取りの信頼度を受け取る
- 自動品番を商品マスタで引き、品番の無い行や引けない行は、Claude が品名からマスタの候補を選ぶ
- 自動返品理由を6つの区分にそろえ、「書かれていない」「読めない」を分けて記録する
- 自動店舗への直近の出荷実績と、センターで数えた数を、伝票の数量と突き合わせる
- 自動返品データの一覧に書き込み、印の付いた行だけを確認の一覧に出す
- 人事務担当が確認の一覧を見て、読めない行は伝票を見て直し、問い合わせる行を決める
- 人確かめた返品データを、倉庫管理システムの返品の取り込みで登録する
各工程の詳しい説明を読む
- 返品の担当が箱を開け、実物の数を数えて、伝票の数量の横に数えた数を書き込む
- 事務担当が伝票を受け取り、倉庫管理システムの返品の登録の画面を開く
- 店舗コード、返品日、明細の品番・数量・返品理由を1行ずつ入力する
- 品番が書かれていない行は、品名から商品マスタを検索して品番を探す
- 理由の印が無い行と、品番が見つからない行を、表計算の問い合わせの一覧に書く
- 気になる行について、倉庫管理システムの出荷実績で、その店舗にその品番を出荷したかを確かめる
- 問い合わせの一覧がたまったところで、店舗へ電話かメールで確かめる
(a)入力そのものに時間がかかる。 1枚の伝票に明細が平均4〜5行あり、手書きの数字と品番を見ながら打ち込む作業です。返品は月末と棚替えの時期に集中し、その週は入力が追いつきません。
(b)出荷していない品番の返品が、入力の後で分かる。 6番目の出荷実績の確認は、気になった行だけです。店舗が品番を書き間違えた行や、別の店舗の商品が混ざった行は、入力された後の在庫の食い違いとして見つかります。 そのときには、どの伝票のどの行だったかをたどるのに時間がかかります。
(c)理由の書き漏れの扱いがばらばら。 理由の印が無い行を、ある担当は「その他」で入力し、ある担当は問い合わせに回します。返品の理由ごとの集計が、商品部の発注の見直しに使われているにもかかわらず、「その他」が実際より多く出ます。
(d)問い合わせが遅れる。 一覧がたまってからまとめて問い合わせるので、店舗の担当者が返品したときのことを覚えていないことがあります。
- 【人】 返品の担当が実物を数え、伝票の「センター検品数」の欄に数を書き込んでから、複合機でスキャンする
- 【自動】 スキャンのPDFが共有ドライブのフォルダに保存される
- 【自動】 Google Apps Script が10分ごとにフォルダを見て、新しいPDFを Google Document AI の Form Parser に送る
- 【自動】 上の欄の項目と明細の表、返品理由の四角の印の有無、読み取りの信頼度を受け取る
- 【自動】 品番を商品マスタで引き、品番の無い行や引けない行は、Claude が品名からマスタの候補を選ぶ
- 【自動】 返品理由を6つの区分にそろえ、「書かれていない」「読めない」を分けて記録する
- 【自動】 店舗への直近の出荷実績と、センターで数えた数を、伝票の数量と突き合わせる
- 【自動】 返品データの一覧に書き込み、印の付いた行だけを確認の一覧に出す
- 【人】 事務担当が確認の一覧を見て、読めない行は伝票を見て直し、問い合わせる行を決める
- 【人】 確かめた返品データを、倉庫管理システムの返品の取り込みで登録する
9番目が、この設計の分かれ目です。 人が見るのは全行ではありません。印の付いていない行は一覧で流し見て終わりにし、印の付いた行だけに時間を使います。 全行を見直す設計にすると、入力が確認に置き換わるだけで、時間はほとんど減りません。
10番目で、倉庫管理システムへの登録を人の手に残しているのも意図してのことです。 返品の登録は在庫を動かします。読み取りの誤りがそのまま在庫に入ると、次の出荷の引き当てまで狂います。
02今回想定するシステム構成
返品伝票(手書き・複写式) │ センター検品数を書き込んでから複合機でスキャン ▼ 共有ドライブの受付フォルダ(PDF) ▼【トリガー】時間主導型のトリガー(10分ごと) Google Apps Script ├──▶ Google Document AI(Form Parser) │ 上の欄の項目(キーと値)/明細の表/返品理由の四角(filled・unfilled)/信頼度 ├──▶ 商品マスタ(品番・JAN・品名) ├──▶ Claude API ── 品番の無い行の候補選び、その他の理由の区分 └──▶ 出荷実績(倉庫管理システムの日次のCSV) ▼ 返品データの一覧(スプレッドシート)── 行ごとの印 │ 理由なし/理由が読めない/出荷実績を超える/検品数と違う/品番が引けない ▼ 【事務担当が印の付いた行だけを確かめる】 ▼ 倉庫管理システムの返品の取り込み(CSV)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(品番の候補選びと、その他の理由の区分) | Gemini API、OpenAI API |
| 連携 | Google Apps Script(フォルダの確認、OCRの呼び出し、マスタと出荷実績の照合、一覧への書き込み) | Python |
| 集計 | Google Apps Script(店舗ごとの問い合わせの一覧と、理由ごとの件数) | Python |
| 保管 | Google ドライブ(共有ドライブ)、Google スプレッドシート | 社内のファイルサーバー |
| 在庫の記録 | 既存の倉庫管理システム | ― |
倉庫管理システムへは、直接書き込みません。 この構成が作るのは、取り込みの形にそろえた返品データと、確認の一覧までです。登録は、事務担当が確かめた後に、倉庫管理システムの既存の取り込みの機能で行います。
読み取りには、Google Document AI の Form Parser を使います。 Form Parser は、キーと値のペア、表、選択の印(四角の印など)、汎用の項目、文字を取り出すもので、学習は不要で、追加の学習もできません。チェックボックスは、近くの文字をキーにしたキーと値のペアとして返り、印が付いているかどうかが valueType に filled_checkbox/unfilled_checkbox として入ります。 返品理由の6つの四角は、この仕組みでそのまま読めます。
プロセッサの一覧では、Form Parser の言語の表で日本語(ja)の手書きに対応していることが示されています。ただし、Form Parser を置ける地域は us・eu の複数地域と、ムンバイ・シンガポール・シドニー・ロンドン・フランクフルト・モントリオールの単一地域で、日本の地域はありません。 伝票を日本の外で処理することになるので、第13章で扱います。
表の読み取りは、行や列をまたぐセルの無い、ふつうの表だけが対象です。返品伝票の明細の表は、1行1品の単純な表なので向いています。本部の様式に「その他」の欄が2行にまたがっているような作りがあれば、様式の側を直します。
03どうやって実装するのか
処理の起点を決める
Google Apps Script の時間主導型のトリガーで、10分ごとに受付フォルダを確かめます。 インストール型のトリガーには、毎分から月1回までの間で動かせる時間主導型のトリガーと、開いたとき・編集したとき・フォームの送信などの出来事で動くトリガーがあります。Google ドライブにファイルが追加されたことで動くトリガーは一覧に無いので、時間で見回る形にします。
実行の時刻には少し揺らぎがあります。 公式のページでも、時刻が少しばらつくことがあると書かれています。返品の受付は即時性を求めない業務なので、10分の間隔で十分です。
インストール型のトリガーは、作った人のアカウントで動きます。 個人のアカウントで作ると、その人が異動や退職でいなくなったときに止まります。 センターの業務用のアカウントで作り、共有ドライブの権限もそのアカウントに付けます。処理が終わったPDFは処理済みのフォルダへ移します。 移すのは成功したときだけにし、受付フォルダに残っている数がそのまま未処理の数になるようにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 返品伝票のPDF | 上の欄(店舗コード、店舗名、返品日、担当者)、明細の表(品番、品名、数量、返品理由の印、その他の欄、センター検品数) | 受付フォルダ |
| 読み取り結果 | キーと値のペア、表のセル、チェックボックスの印、信頼度、全文 | Google Document AI |
| 商品マスタ | 自社品番、JANコード、品名、規格、取扱の有無 | 倉庫管理システムの日次のCSV |
| 出荷実績 | 店舗ごと・品番ごとの直近90日の出荷の数量 | 倉庫管理システムの日次のCSV |
| 店舗の一覧 | 店舗コード、店舗名、問い合わせの連絡先 | センターの共有の表計算 |
質を決めるのは、商品マスタと出荷実績の鮮度です。 前の日の出荷が反映されていないと、昨日届いた商品をすぐ返品した行が「出荷実績を超える」になります。 倉庫管理システムからの書き出しは毎朝の始業前に終わらせ、その時刻をファイル名に入れます。
センター検品数の欄は、様式に足します。 これまでは伝票の数量の横に手で書き込んでいましたが、決まった欄が無いと、OCRはどの数字が検品数かを区別できません。 本部と相談し、明細の右端に「センター検品数」の列を設けます。
データの取得方法を決める
PDFは、Apps Script から Document AI の処理のAPIへ送ります。 応答はJSONで、ページごとに formFields(キーと値のペア)と tables(表)が入っています。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 店舗コード・返品日・担当者 | formFields の fieldName と fieldValue | 伝票の上の欄 |
| 明細の行 | tables の headerRows と bodyRows のセル | 品番・品名・数量・センター検品数 |
| 返品理由の印 | formFields の fieldValue の valueType | filled_checkbox/unfilled_checkbox |
| 信頼度 | 各要素の layout の confidence | 読めたかどうかの判断 |
| 全文 | text と textAnchor | 表から漏れた文字の拾い直し |
キーと値のペアのキーは、伝票に印刷されている文字そのものです。 公式のページでも、ほかの抽出のように名前を設定するものではなく、書類の上のキーの文字がそのまま返るとされています。「店舗コード」「店コード」のように様式の版で印刷の文字が違うときは、Apps Script の側で同じ項目にまとめます。
返品理由の印は、明細の行ごとに結び付け直します。 チェックボックスは、近くの文字をキーにしたペアとして返るので、どの行の印かは、印の位置(boundingPoly)と表の行の位置を比べて決めます。 行の高さの範囲に入る印を、その行の理由とします。
AIへ渡す前に整形する
- 形式の確認 … PDFであることを確かめます。複合機の設定でJPEGの圧縮を使ったTIFFが混ざることがありますが、TIFFの中のJPEGの圧縮の一部には対応していないとされているので、スキャンはPDFにそろえます
- 1ファイル1枚にそろえる … 複合機でまとめてスキャンしたものは、ページで分けます
- 向きの確認 … 逆さまや横向きのページは、向きを直してから送ります
- 重複の確認 … 同じ店舗・同じ返品日・同じ明細の伝票が直近にあれば、二重のスキャンとして印を付けます
- 商品マスタと出荷実績の読み込み … その朝の書き出しのファイルの日付を確かめ、前の日より古ければ処理を止めます
5番目を省くと、すべての照合がずれます。 書き出しが止まっていた日に動かすと、数日分の出荷が反映されないまま、大量の行に「出荷実績を超える」が付きます。 古いファイルで照合するより、止めて知らせるほうが確実です。
AIに処理させる
AIにさせることは2つの段に分かれます。 Document AI に伝票を読ませる段と、Claude に品番の候補を選ばせ、「その他」の理由を区分させる段です。品番の照合、出荷実績との突き合わせ、印の付け方は、Apps Script の決まった規則で行います。
| 見るもの | 判定の仕方 | 判断できないときの扱い |
|---|---|---|
| 店舗コード | 店舗の一覧に存在するか | 信頼度が低ければ unreadable |
| 品番 | 商品マスタで引けるか | 引けなければ Claude が品名から候補を選ぶ。候補が無ければ not_found |
| 数量 | 整数として読めるか | 信頼度が低ければ unreadable |
| 返品理由 | 6つの四角のうち filled_checkbox がいくつあるか | 0個で「その他」の欄も空なら missing、印が検出されなければ unreadable、2個以上なら ambiguous |
| 出荷実績との比べ | 伝票の数量が直近90日の出荷の数量を超えるか | 超えれば over_shipped |
| センター検品数との比べ | 伝票の数量と検品数が同じか | 違えば count_diff |
返品理由の行が、この構成でいちばん大事な区別です。 印が6つとも unfilled_checkbox として検出され、その他の欄にも文字が無ければ、店舗が理由を書いていないということです。一方で、四角そのものが検出されなかったり、信頼度が低かったりするなら、センターで伝票を見れば分かることです。
Form Parser には、空欄の値を確実には取り出せないという制限があります。 公式のページでも、値の入っていないキーと値のペア(白紙の様式など)を確実には解析しないと書かれています。だから、「その他」の欄が空かどうかを、キーと値のペアの値が無いことだけで決めません。その欄の位置の範囲に、全文の文字が1つも無いことをあわせて確かめます。
Claude には、品番の無い行と引けない行の品名だけを渡します。 商品マスタから、品名の文字が近い候補を Apps Script で10件まで絞り、その中から選ばせます。マスタの外の品番を作らせないために、候補の番号から選ぶ形にします。 出力は、Claude API の構造化出力で決まった形のJSONにします。output_config.format に json_schema を指定すると、スキーマに合ったJSONが返ります。
| させないこと | 理由 |
|---|---|
| 返品を受け入れるかの判断 | 商品部と店舗の取り決め |
| 印の無い返品理由を推し量って埋める | 理由の集計が発注の見直しに使われる |
| 品番を候補の外から作る | 在庫が存在しない品番に動く |
| 数量を出荷実績に合わせて直す | 見つけたかった食い違いが消える |
| 店舗への問い合わせを送る | 店舗の作業に関わる。人が決める |
2行目がいちばん起きやすい失敗です。 品名に「割れ」と書かれていれば、理由は破損らしく見えます。生成AIに渡すと、もっともらしく「破損・汚損」を選びます。 理由の集計は商品部が発注と仕入先の評価に使う数字です。推し量った理由が混ざると、集計そのものが信用できなくなります。
指示内容を固定する
あなたは物流センターで、店舗から届いた返品伝票の明細を整える担当です。
渡す情報だけを見て判断してください。推測で埋めないでください。
【あなたがすること】
1. 品番の無い行・商品マスタで引けなかった行について、
渡す候補(最大10件)の中から、品名と規格が一致するものを1つ選ぶ。
2. 返品理由が「その他」で、その他の欄に文字が書かれている行について、
次の区分のどれに当たるかを選ぶ。
破損・汚損/期限間近/誤納品/過剰在庫/不良品/その他
【厳守事項】
- 品番は、渡した候補の candidate_id から選んでください。
候補に一致するものが無ければ candidate_id を null にし、status を not_found にしてください。
候補の外の品番を作らないでください。
- 品名が一致していても、規格(容量・色・サイズ)が違う候補を選ばないでください。
規格が読み取れないときは status を ambiguous にしてください。
- 返品理由は、その他の欄に書かれた文字だけを根拠にしてください。
品名や数量から理由を推し量らないでください。
- その他の欄が空の行、理由の印が無い行は、あなたに渡しません。
渡されていない行の理由を書かないでください。
- 区分に当てはまらない理由は「その他」のままにし、書かれた文字を evidence に写してください。
- 数量を変えないでください。
- evidence には、判断の根拠にした文字をそのまま写してください。
【明細の行】{lines}
【品番の候補】{candidates}
「渡されていない行の理由を書かない」を入れているのは、理由の空欄を守るためです。 理由の印が無い行は、そもそも Claude に渡しません。それでも、同じ伝票の他の行を見て「この伝票は破損の返品」と書き足すことがあります。 渡す範囲と、書いてよい範囲を両方で縛ります。
出力形式を固定する
伝票1枚ごとに、次の形のJSONを作り、明細の行を返品データの一覧に書き込みます。
{
"slip_id": "RS-2026-1008-0153",
"file": "RS_20261008_101530.pdf",
"store": { "code": "", "status": "ok | unreadable | not_found" },
"return_date": "2026-10-06",
"lines": [
{
"line_no": 1,
"item_code": "",
"item_status": "ok | from_candidate | not_found | ambiguous | unreadable",
"item_name": "",
"qty": 0,
"qty_status": "ok | unreadable",
"center_count": 0,
"reason": "破損・汚損 | 期限間近 | 誤納品 | 過剰在庫 | 不良品 | その他 | ",
"reason_status": "ok | missing | unreadable | ambiguous",
"shipped_90d": 0,
"flags": ["over_shipped", "count_diff"],
"confidence": { "item": 0.00, "qty": 0.00 },
"evidence": ""
}
],
"verdict": "pass | needs_check | needs_store_inquiry"
}
1つ目の理由は、reason_status で書き漏れと読めないを分けられることです。 missing は店舗への問い合わせ、unreadable はセンターでの見直しに回ります。返品データの理由の欄は、どちらも空のままにし、空の理由を別の欄で持ちます。
2つ目は、verdict を規則で決められることです。 規則は次のとおりです。
verdict | 条件 |
|---|---|
pass | 全行で status が ok か from_candidate、印が無い |
needs_check | unreadable か ambiguous が1つでもある、または count_diff がある |
needs_store_inquiry | missing か not_found か over_shipped が1つでもある |
3つ目は、from_candidate を ok と分けて持つことです。 品名から候補で選んだ品番は、伝票に書かれていた品番ではありません。pass にはしますが、一覧で色を変えて見せ、店舗ごとの件数を数えます。 毎月多い店舗には、品番を書いてもらうよう本部から伝えます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付フォルダ | Apps Script の時間主導型のトリガー | 新しいPDFを見つけ、処理済みへ移す |
| Google Document AI | 処理のAPIの呼び出し | キーと値のペア・表・チェックボックス・信頼度 |
| 商品マスタ・出荷実績 | 倉庫管理システムの日次のCSVを読む | 品番の照合と出荷の数量 |
| Claude API | API呼び出し | 品番の候補選びと、その他の理由の区分 |
| 返品データの一覧 | スプレッドシートへの書き込み | 明細の行と印、伝票ごとの verdict |
| 倉庫管理システム | 既存の返品の取り込み(CSV) | 確かめた返品データを人が登録する |
倉庫管理システムへの取り込みは、1日2回にまとめます。 確かめ終わった行だけを取り込みの形のCSVに書き出し、事務担当が取り込みます。未確認の行は書き出しの対象にしません。
人が確認する
事務担当が開くのは、needs_check と needs_store_inquiry の伝票だけです。 pass の伝票は一覧で件数と店舗を流し見ます。
needs_checkを先に見る …unreadableの行は伝票の画像を見て直します。多くはセンターだけで解決しますcount_diffは返品の担当に確かめる … 実物の数え直しか、輸送中の抜けかを確かめますneeds_store_inquiryの根拠を確かめる …missingの行は、画像で理由の四角が本当に空かを目で見ます- 店舗へ問い合わせる … 店舗ごとの一覧で、1店舗1回にまとめます
- 直した内容を記録する … どの行の何を、何から何に直したかを残します
3番目を省かないでください。 missing の判定は、店舗の作業を止める問い合わせに直結します。 印が薄くて検出されなかっただけの行を問い合わせると、次から店舗がこの問い合わせを軽く扱うようになります。
目標は、900枚をならして1枚1分です。 pass の伝票は数秒で流し、印の付いた伝票は画像を見て数分かかります。印の付く伝票が2割を超える月は、様式か店舗の書き方に原因があります。
例外に対処する
| 起きること | 対応 |
|---|---|
| PDFでないファイル・JPEGの圧縮を使ったTIFF | 処理せず、スキャンのやり直しを返品の担当へ知らせる |
| 1ファイルに複数の伝票 | ページで分けて再投入。分けられないものは needs_check |
| 店舗コードが店舗の一覧に無い | not_found。店舗名の欄から候補を出し、人が決める |
| 商品マスタと出荷実績の書き出しが古い | 処理を止め、情報システムへ知らせる |
| 品番の候補が規格違いで決められない | ambiguous で人へ |
| 理由の四角が2つ以上に印 | ambiguous で人へ |
| 伝票の数量が出荷実績を超える | over_shipped。品番の書き間違いを先に疑う |
| Document AI か Claude API が応答しない | 受付フォルダに残す。処理済みへ移すのは成功時だけ |
| 同じ伝票を二度スキャンした | 店舗・返品日・明細で照合し、二重に一覧へ書かない |
7行目の over_shipped は、店舗の不正を疑う材料にしません。 多くは品番の1桁違いか、別の店舗から移ってきた商品です。確かめる順番は、品番の書き間違い、店舗間の移動の記録、そのあとで店舗への問い合わせです。
記録を残す
- 元の伝票のPDFと、スキャンの日時
- Document AI が返したJSONの全文
- 明細の行ごとの判定(
status・flags・verdict)と、そのとき使った商品マスタと出荷実績の書き出しの日付 - Claude に渡した候補と、選んだ候補・根拠
- 人が直した記録 … どの行の何を、何から何に直したか
- 店舗への問い合わせの日時と、店舗の回答
- 店舗ごとの
missing・from_candidate・unreadableの件数
3つ目で書き出しの日付を残すのは、照合のやり直しの範囲を決めるためです。 出荷実績の書き出しが遅れていた日が後から分かったとき、その日付で照合した伝票だけを照合し直せます。
04実装レベルの3段階
半自動化で、1枚5分が2分程度になります。 入力は無くなりますが、品番の無い行を探す作業と、出荷実績を確かめる作業が残ります。本格構成で1分になり、この段階が本記事の想定です。 差が大きいのは、全行の出荷実績の照合が、手では一部しかできなかった作業だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、unreadable の多い欄と、品番を書かない店舗が先に分かります。様式と店舗の書き方を直してから照合を足すほうが、問い合わせの空振りが減ります。
05工数削減シミュレーション
導入後 900件 × 1分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- ドラッグストア・ホームセンター・アパレルなどのチェーンの物流センターや、その運営を受託している物流会社で、店舗からの返品が手書きの複写式の伝票で届いている場合。月に数百枚から千枚ほどの返品伝票を、センターの事務担当が倉庫管理システムへ手で入力している場合。返品の理由が書かれていない伝票や、店舗に出荷していない品番の返品が混ざり、店舗への問い合わせが後手に回っている場合。店舗へ商品を卸している卸売業の返品の受付。
- 店舗の端末やハンディから返品をデータで登録できており、紙の伝票が無い場合。返品が月に数十枚で、目視の入力で足りる場合。伝票の様式が店舗ごとにばらばらで、決まった欄が無い場合(まず様式をそろえる)。なお、返品を受け入れるか、どの店舗の負担にするか、仕入先へ返すかの判断は、この構成では代替できません。
07最小構成で試す方法
- 先月届いた返品伝票から50枚を選ぶ(理由の書き漏れや、品番の無い行があると分かっているものを入れる)
- その50枚を、事務担当が倉庫管理システムに入力したときの記録と並べられるようにする
- Google Cloud のコンソールで Form Parser のプロセッサを作り、50枚を1枚ずつ試しに読ませる
- 明細の表と理由の四角の印が、行ごとに正しく取れているかを、入力の記録と突き合わせる
- 理由の四角が空の行で、
unfilled_checkboxが6つとも検出されているかを数える
ここまではプログラムを書かずに、コンソールの画面でできます。 「手書きの明細と四角の印が読めるか」を先に確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 明細も印もほぼ読めた | Apps Script の連携に進む |
| 明細は読めるが、印が検出されない四角が多い | 四角の大きさと線の太さを様式で直す |
| 明細の表がくずれて読まれる | 様式の表にまたがるセルが無いかを見直す |
2行目と3行目は、様式で直る問題です。 Form Parser は追加の学習ができないので、読み取りを良くするには、読みやすい様式にするのが近道です。 本部と相談して、次の版の伝票で直します。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
理由の空欄が missing と unreadable で混ざる | 四角が検出されたかと信頼度で分ける。混ぜると店舗に空振りの問い合わせをする |
| 「その他」の欄が空かどうかを取り違える | 空の値は確実に取れない。欄の位置に文字が無いことも確かめる |
| 品名から理由を推し量って埋める | 理由の無い行を生成AIに渡さない。指示でも禁じる |
| 規格違いの品番を選ぶ | 候補から選ばせ、規格が違えば ambiguous |
出荷実績の書き出しが古く、over_shipped が大量に付く | 書き出しの日付を確かめ、古ければ止める |
| チェックボックスがどの行のものか分からない | 印の位置と表の行の位置で結び付ける |
| 表がくずれて読まれる | 様式から行や列をまたぐセルをなくす |
| トリガーを作った人がいなくなって止まる | 業務用のアカウントで作る |
| まとめてスキャンされた伝票 | ページで分ける。1枚ずつのスキャンを返品の担当に頼む |
| 店舗コードを読み違える | 店舗の一覧で照合し、無ければ店舗名から候補を出す |
上の3行が、この構成の失敗のほとんどです。 どれも「理由の欄が空に見える」という同じ見た目から始まっています。空の理由を店舗の書き漏れと読めないに分け、生成AIに埋めさせないことが守れているかで、理由の集計が使えるかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 店舗の返品の品番と数量、返品理由、店舗の担当者の名前、出荷実績です。個人の顧客の情報は含みませんが、店舗の担当者の名前と、店舗ごとの在庫の動きが分かるデータです。
- 処理する地域を決める … Form Parser を置ける地域に日本はありません。us・eu の複数地域か、シンガポールなどの単一地域から選び、伝票が日本の外で処理されることを、委託元の小売チェーンと取り決めておきます
- 生成AIに渡す範囲を絞る … Claude に渡すのは、品番の無い行の品名と規格、その他の欄の文字、マスタの候補だけです。店舗の担当者の名前と、伝票の画像は渡しません
- 倉庫管理システムへの登録は人が行う … 読み取りの誤りが在庫に直接入らないよう、取り込みは確かめた後に人が行います
- 店舗への問い合わせを自動で送らない … 出すのは店舗ごとの一覧までです。店舗の作業を止める連絡なので、送るかどうかは事務担当が決めます
- 店舗ごとの件数を、店舗の評価に流用しない … 理由の書き漏れの件数は、様式と書き方を直すための数字です。評価に使うなら、本部と基準を決めてからにします
- 共有ドライブの権限を絞る … 受付フォルダと一覧は、返品の受付の担当と、本部の店舗運営の担当だけが見られるようにします
誤りが起きた場合のリスクは、読み取りの誤りが在庫に入ることと、書いた店舗に空振りの問い合わせをすることの2つです。 前者は登録を人に残すことで、後者は missing と unreadable を分けることで防ぎます。
10まず何から始めるか
1週目:50枚で読めるかを試す
先月の返品伝票から50枚を選び、Google Cloud のコンソールで Form Parser に読ませます。明細の表と理由の四角の印が、行ごとに取れているかを入力の記録と突き合わせます。
2週目:様式の直しを本部に相談する
読み取りで分かった様式の問題(またがるセル、小さすぎる四角)と、センター検品数の列を足すことを、本部の店舗運営の担当に相談します。新しい伝票が行き渡るまでの数か月は、今の様式のまま進めます。
3週目:倉庫管理システムの書き出しを用意する
商品マスタと直近90日の出荷実績を、毎朝の始業前にCSVで共有ドライブへ書き出す設定を、情報システムの担当と作ります。書き出しのファイル名に日付と時刻を入れます。
4週目:受付フォルダから一覧までをつなぐ
Apps Script で受付フォルダを見回り、Form Parser の結果を返品データの一覧に書き出すところまで作ります。この時点では照合を入れず、読み取りの結果だけを1か月見ます。
2か月目: 商品マスタと出荷実績の照合、Claude による品番の候補選び、verdict の規則を足します。needs_store_inquiry の件数を毎週数えます。3か月目以降: 1枚5分が何分になったかを実測し、店舗ごとの書き漏れの件数を本部に渡します。新しい様式の伝票が行き渡り、unreadable の件数が落ち着いた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Form Parser の言語の表で日本語(ja)の手書きに対応していること | Google Cloud: Processor list | 2026-10-08 |
| Form Parser がキーと値のペア・表・選択の印・汎用の項目・文字を取り出し、追加の学習ができないこと。表は行や列をまたぐセルの無いものが対象であること。チェックボックスが近くの文字をキーにしたペアとして返ること。空欄の値のペアを確実には解析しないこと。TIFFの中のJPEGの圧縮の一部に対応しないこと | Google Cloud: Form Parser | 2026-10-08 |
応答の formFields(fieldName・fieldValue)と tables(headerRows・bodyRows)の形。キーが書類の上の文字そのものであること。チェックボックスの valueType が filled_checkbox/unfilled_checkbox であること | Google Cloud: Handle processing response | 2026-10-08 |
| Form Parser を置ける地域が us・eu と、asia-south1・asia-southeast1・australia-southeast1・europe-west2・europe-west3・northamerica-northeast1 であること | Google Cloud: Regional and multi-regional support | 2026-10-08 |
output_config.format に json_schema を指定すると、スキーマに合ったJSONが返ること | Claude: Structured outputs | 2026-10-08 |
| インストール型のトリガーに、毎分から月1回まで動かせる時間主導型と、出来事で動く型があること。実行の時刻が少しばらつくことがあること。作った人のアカウントで動くこと | Google: Installable Triggers | 2026-10-08 |
返品を受け入れるか、どの店舗の負担にするかは、委託元の小売チェーンと物流センターで決めてください。 本記事は公開されている仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1027)についてのご相談はこちらから。
