小売店で手書きされる客注(取り寄せ)伝票を読み取り、客注台帳にそろえて、入荷したのに連絡していないものと長く引き取られていないものを拾う
店頭で手書きされる客注伝票の店控えを毎日読み取り、客注台帳に登録します。仕入先の入荷データと照らして、入荷したのに連絡していない注文と、連絡したのに長く引き取られていない注文を毎朝の一覧に出します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 小売
- 対象部門
- 営業
- 対象業務
- データ入力・転記/台帳・マスタ管理
- 主な課題
- 入力作業が多い/営業フォローが追いつかない/期限・対応漏れが起きる
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 対応スピード向上/工数削減/機会損失防止
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 店員がカウンターで客注伝票を手書きし、1枚目を客に渡し、店控えを客注の箱に入れる
- 客注担当が、店控えを見て客注台帳(店ごとのスプレッドシート)に打ち直す
- 入荷データの客注品を見て、客注の箱から該当の伝票を探す
- 伝票に入荷日を書き、客に電話して連絡日を書く
- 引き取られたら、伝票に引取日を書いて引取済みの束に移し、台帳も更新する
- 月末に客注の箱の伝票を全部めくり、入荷済みで未連絡のもの、連絡済みで未引取のものを探す
- 人店員がカウンターで客注伝票を手書きする(今と同じ)
- 人閉店後、その日の店控えを店のスマートフォンで撮り、店の取込フォルダに保存する
- 自動Apps Script が夜に取込フォルダを見て、Document AI の Form Parser に渡す
- 自動伝票番号、受付日、客の名前と電話番号、商品の欄、数量、前受金の有無を取り出す
- 自動Claude API が、商品の欄の書き方を、商品マスタを引ける検索語と品番にそろえる
- 自動Apps Script が商品マスタで商品コードの候補を引き、客注台帳に登録する
- 自動入荷データが届いたら、商品コードと店で客注台帳と照合し、入荷日を入れる
- 自動毎朝、店ごとに「入荷済み・未連絡」「連絡済み・未引取」「商品コード未確定」の一覧を出す
- 人客注担当が一覧を見て、客に連絡し、台帳の連絡日と引取日を店の端末で入れる
- 人長く引き取られていないものは、店長が再連絡か返品かを決める
各工程の詳しい説明を読む
- 店員がカウンターで客注伝票を手書きし、1枚目を客に渡し、店控えを客注の箱に入れる
- 客注担当が、店控えを見て客注台帳(店ごとのスプレッドシート)に打ち直す
- 入荷データの客注品を見て、客注の箱から該当の伝票を探す
- 伝票に入荷日を書き、客に電話して連絡日を書く
- 引き取られたら、伝票に引取日を書いて引取済みの束に移し、台帳も更新する
- 月末に客注の箱の伝票を全部めくり、入荷済みで未連絡のもの、連絡済みで未引取のものを探す
(a)同じことを2回書いている。 伝票に手書きし、台帳に打ち直します。忙しい日は打ち直しが後回しになり、台帳と箱の中身が合わなくなります。
(b)入荷のたびに探し物をしている。 入荷データの商品名と、伝票の手書きの商品名は書き方が違います。「110巻」と「ONE PIECE 110」が同じだと分かるのは、伝票を読んだ人だけです。
(c)連絡漏れは、気づかれないまま日がたつ。 入荷した商品を棚の裏の客注置き場に置いたまま、連絡を忘れることがあります。客から「まだですか」と問い合わせが来て、初めて入荷していたことが分かります。
(d)引き取られない商品が積み上がる。 連絡したのに引き取られない商品は、客注置き場の場所を取り、返品の期限を過ぎると店の在庫になります。月末の点検で見つかったときには、再連絡も返品も間に合わないことがあります。
- 【人】 店員がカウンターで客注伝票を手書きする(今と同じ)
- 【人】 閉店後、その日の店控えを店のスマートフォンで撮り、店の取込フォルダに保存する
- 【自動】 Apps Script が夜に取込フォルダを見て、Document AI の Form Parser に渡す
- 【自動】 伝票番号、受付日、客の名前と電話番号、商品の欄、数量、前受金の有無を取り出す
- 【自動】 Claude API が、商品の欄の書き方を、商品マスタを引ける検索語と品番にそろえる
- 【自動】 Apps Script が商品マスタで商品コードの候補を引き、客注台帳に登録する
- 【自動】 入荷データが届いたら、商品コードと店で客注台帳と照合し、入荷日を入れる
- 【自動】 毎朝、店ごとに「入荷済み・未連絡」「連絡済み・未引取」「商品コード未確定」の一覧を出す
- 【人】 客注担当が一覧を見て、客に連絡し、台帳の連絡日と引取日を店の端末で入れる
- 【人】 長く引き取られていないものは、店長が再連絡か返品かを決める
6番目で商品コードが1つに決まらないものは、台帳に「未確定」として登録します。 候補を並べて客注担当が選びます。ここで人が選ぶのは、印の付いた伝票だけです。
9番目以降、伝票には書き込みません。 連絡日と引取日は台帳にだけ入れます。伝票と台帳の二重の記録をやめ、台帳を正とします。 伝票の店控えは、受付の証拠として今までどおり保管します。
02今回想定するシステム構成
客注伝票の店控え(2枚複写、手書き) │ 閉店後に店のスマートフォンで撮影 ▼【トリガー】Apps Script の時間主導型トリガー(毎日夜) Google Apps Script ── 形式・画質・伝票番号の確認 ▼ Google Document AI(Form Parser) │ 欄の文字、項目名と値の組、チェックボックス、信頼度 ▼ Claude API ── 構造化出力で商品の欄をそろえる │ 検索語/品番・巻数/メーカー・出版社(客の情報は渡さない) ▼ Google Apps Script ── 商品マスタで候補を引き、客注台帳に登録 ▼ 入荷データ(日ごと)──▶ Apps Script が商品コードと店で照合 ▼ 【毎朝】店ごとの一覧 ├──▶ 入荷済み・未連絡(入荷から1日以上) ├──▶ 連絡済み・未引取(連絡から14日以上) └──▶ 商品コード未確定 ▼ 【客注担当が連絡し、店長が再連絡か返品かを決める】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(商品の欄の書き方のそろえ) | OpenAI API、Gemini API |
| 連携 | Google Apps Script(フォルダの監視、商品マスタの検索、台帳への登録、入荷との照合) | Python |
| 集計 | Google Apps Script(未連絡・未引取の日数の計算と店ごとの一覧) | Python |
| 保管 | Google ドライブ(共有ドライブ)、Google スプレッドシート | 社内のファイルサーバー |
新しく作るのは、全店で1つの客注台帳と、一覧の日数の規則の2つです。 今は店ごとにばらばらの台帳を、列をそろえた1つのスプレッドシートにします。店の列で絞れば、店ごとの台帳として使えます。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCRのテキストに加えて、キーと値のペア、チェックボックス、表を抽出するとされ、言語の一覧で日本語(ja)は手書きに対応する言語として示されています。客注伝票は「お名前」「電話番号」「商品名」「数量」と項目名の付いた欄に書く書式なので、キーと値のペアとして読めます。
Form Parser の注意書きのうち、この題材で効くのは2つです。 1つは、値の入っていないキーと値の組を確実には読み取れないこと。もう1つは、ラジオボタンの読み取りに対応しないことです。後者は伝票の「連絡方法 電話・メール・来店時」に○を付ける欄で当たります。この欄は □ に改めるか、読まない欄にします(第7章)。
処理する場所にも注意が要ります。 Document AI のリージョンの一覧は、マルチリージョンの us と eu と、シンガポール(asia-southeast1)などの単一リージョンで、日本のリージョンはありません。 伝票には客の名前と電話番号が書かれています。国外で処理してよいかを、店の個人情報の取扱いの決まりに照らして先に確かめます。
03どうやって実装するのか
処理の起点を決める
閉店後に、その日の店控えを撮って店の取込フォルダに保存することを起点にします。 店には複合機が無いことが多いので、店のスマートフォンで撮ります。1枚1ファイルで撮り、ファイル名は気にしません。 伝票番号は伝票に印刷されているので、読み取りで決まります。
Apps Script の時間主導型トリガーが、毎日夜に8店舗の取込フォルダを順に見ます。 公式のページでは、時間主導型のトリガーは指定の時刻や間隔で動かせ、実行の時刻は少しずれることがあるとされています。翌朝の開店前に台帳と一覧ができていれば足りるので、夜の1回で十分です。
入荷データの照合は、別のトリガーで朝に動かします。 仕入先の入荷データが共有ドライブに届く時刻に合わせ、届いたら照合し、続けて一覧を作ります。 伝票の読み取りが止まっていても、入荷の照合と一覧は出続けるように分けておきます。
処理が終わった画像は処理済みのフォルダへ移します。移すのは、台帳への登録まで成功したときだけです。 取込フォルダに残っている画像が、未処理の伝票です。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 客注伝票の画像 | 伝票番号、受付日、客の名前・電話番号、商品の欄、数量、前受金の有無、受付者 | 店の取込フォルダ |
| 読み取り結果 | 欄の文字、項目名と値の組、チェックボックス、要素ごとの信頼度 | Document AI(Form Parser) |
| 商品マスタ | 商品コード、商品名、メーカー・出版社、品番、シリーズ名と巻数 | 本部の商品マスタを書き出したスプレッドシート |
| 入荷データ | 入荷日、店、商品コード、商品名、数量、客注の区分 | 仕入先から日ごとに届くファイル |
| 客注台帳 | 伝票番号、店、受付日、商品コード、入荷日、連絡日、引取日、状態 | 全店で1つのスプレッドシート |
質を決めるのは、商品マスタの「シリーズ名と巻数」の列です。 書店の客注でいちばん多いのは、シリーズものの特定の巻です。店員は「〇〇 12巻」と書き、マスタの商品名は「〇〇(12)」や「〇〇 第12巻」になっています。 シリーズ名と巻数を別の列で持っていれば、AIがそろえた検索語で引けます。
伝票番号は、伝票と台帳を結ぶ鍵です。 印刷された通し番号なので、手書きの字より読み取りが確かです。同じ伝票番号の行が台帳にすでにあれば、新しく登録しません。 撮り直した画像が二重に登録されるのを防ぎます。
データの取得方法を決める
読み取りは、Apps Script から Document AI の処理の API を呼ぶだけです。画像を渡すと、Document という形の応答が返ります。
| 取るもの | 応答のどこから | 何に使うか |
|---|---|---|
| 項目名と値の組 | pages[].formFields[] の fieldName と fieldValue | 受付日、名前、電話番号、商品名、数量、受付者 |
| チェックボックス | fieldValue の valueType(filled_checkbox/unfilled_checkbox) | 「前受金あり」「連絡方法」の □ |
| 全文のテキスト | text と各要素の textAnchor | 伝票番号、欄として取れなかった値 |
| 信頼度 | 各要素の layout の confidence | 手書きの字が確かに読めているかの判定 |
客の名前と電話番号は、Apps Script が項目名と値の組から直接台帳に書きます。 AIには渡しません。電話番号は数字とハイフンだけになっているかを Apps Script で確かめ、桁が足りなければ unreadable にします。 連絡ができない電話番号は、受付の翌日に分かるほうがよいからです。
商品の欄は、Claude API に渡してそろえます。 商品マスタの検索は Apps Script が行い、AIには商品マスタを渡しません。 AIが返す検索語と品番で、Apps Script がマスタを引きます。
AIへ渡す前に整形する
- 形式の確認 … Document AI の対象は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などです。スマートフォンの写真の JPEG はそのまま入れられます
- 画質の確認 … 公式には、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよい結果になるとされています。伝票を枠いっぱいに、真上から撮るよう、撮り方を1枚の紙でレジ横に貼ります
- 複写の濃さ … 店控えは複写の2枚目なので、文字が薄いことがあります。受付のときに強めに書くよう、伝票の上に一言印刷します
- 様式の改訂 … 「連絡方法 電話・メール・来店時」の○を付ける欄を、□ にレ点を入れる欄に改めます
- 重複の検知 … 伝票番号が台帳にすでにあれば、登録しません
4番目は、伝票を刷り直すときに行います。 Form Parser のチェックボックスのモデルはラジオボタンに対応しないとされているので、○で囲む欄は読めません。刷り直すまでは、連絡方法は読まずに「電話」を既定にし、客注担当が台帳で直します。
AIに処理させる
させるのは、伝票の商品の欄から、商品マスタを引ける検索語と品番を取り出すことだけです。
| 取り出すもの | 取り出し方 | 判断できないときの扱い |
|---|---|---|
| 商品の種類 | 書籍・雑誌・文具・その他 | 決められなければ unclear |
| 検索語 | シリーズ名・商品名を、略さない形で | 書かれた言葉のまま |
| 巻数・号数 | 「12巻」「12」「⑫」などを数字に | 書かれていなければ空 |
| 品番・型番 | 英数字の並び。書かれたまま | 読めなければ unreadable |
| メーカー・出版社・著者 | 書かれていれば | 書かれていなければ空 |
| 根拠 | 取り出した元の文字列 | ― |
検索語を「略さない形で」にしているのは、店員の略記のためです。 「ワンピ」「ハリポタ」のような略記は、マスタの商品名では引けません。略記をよく知られた正式な名前に直すことまではAIに任せ、直した名前が商品マスタに無ければ、候補なしとして人に回します。
商品コードの候補は、Apps Script が商品マスタで引きます。 検索語と巻数で引いて1件だけ当たれば確定、複数当たれば候補を並べて candidates、当たらなければ not_found にします。
| させないこと | 理由 |
|---|---|
| 商品コードの決定 | 決めるのはマスタの検索と人。AIが番号を作ると、存在しないコードが入る |
| 読めない品番の補完 | 似た型番の別の商品を取り寄せることになる |
| 客の名前・電話番号の処理 | AIに渡さない。台帳には Apps Script が直接書く |
| 連絡の文面の作成と送信 | 連絡は店員が電話で行う |
| 返品するかの判断 | 店長が仕入先の条件を見て決める |
1行目がいちばん起きやすい失敗です。 書籍の客注で商品名を渡すと、AIはISBNやJANらしい番号を返そうとします。それらしい番号は、マスタに無い番号か、別の版の番号であることがあります。 番号を作らせず、検索語だけを返させます。
指示内容を固定する
あなたは書店・文具店の本部で、客注伝票の商品の欄を整える係です。
渡すのは、伝票1枚の商品の欄と数量の読み取り結果です。
客の情報は含まれていません。
書かれている文字だけを使って、商品マスタを引くための語を返してください。
【やること】
1. item_type:book(書籍)/magazine(雑誌)/stationery(文具)/
other/unclear のいずれか
2. search_term:シリーズ名や商品名。店員の略記は、よく知られた
正式な名前に直してください。自信がなければ書かれたままにしてください。
3. volume:巻数・号数を数字で。書かれていなければ空
4. part_no:品番・型番。書かれた英数字をそのまま
5. maker:メーカー・出版社・著者。書かれていれば
6. quantity:数量を数字で
7. evidence:取り出した元の文字列をそのまま写す
8. status:read/unreadable(文字はあるが信頼度が低い・読み方が2つ以上)
【厳守事項】
- ISBN、JAN、商品コードを作らないでください。書かれていなければ空です。
- 品番の桁を補ったり、似た型番に直したりしないでください。
- 略記を正式な名前に直したときは、note に「略記を直した」と書いてください。
- 1枚の伝票に商品が複数書かれていれば、items に分けて返してください。
まとめないでください。
- 在庫があるか、取り寄せられるかは書かないでください。
【読み取り結果】{item_fields}
「コードを作らない」を最初の厳守事項にしているのは、AIが親切に番号を補うからです。 補われた番号は、台帳の上では確定した商品コードと見分けがつきません。入荷データと照合されないまま、連絡漏れの一覧にも出ない伝票になります。
「略記を直したら note に書く」は、人が確かめる場所を残すためです。 直した名前で商品マスタに1件だけ当たっても、略記の読み方が違っていれば別の商品です。 note のある行は、確定でも客注担当が一度見ます。
出力形式を固定する
Claude API の構造化出力を使い、次の形のJSONで受け取ります。 output_config.format に JSON スキーマを渡すと、応答がそのスキーマに沿った形になります。
{
"slip_no": "S03-004512",
"items": [
{
"item_type": "book",
"search_term": "ONE PIECE",
"volume": "110",
"part_no": "",
"maker": "",
"quantity": 1,
"evidence": "ワンピ 110巻",
"status": "read",
"note": "略記を直した"
},
{
"item_type": "stationery",
"search_term": "替刃",
"volume": "",
"part_no": "",
"maker": "",
"quantity": 2,
"evidence": "〇〇の替刃 5本入 ×2 型番?",
"status": "unreadable",
"note": "型番の欄の文字が読めない"
}
]
}
1つ目の理由は、客の情報とAIの入出力を切り離せることです。 AIに渡すのは商品の欄と数量だけで、slip_no で台帳の行に結び付けるのは Apps Script です。AIの入出力のどこにも、客の名前と電話番号が出てきません。
2つ目は、items で1枚の伝票の複数の商品を分けられることです。 文具の客注では、1枚に色違いや別の品番が並ぶことがあります。まとめて1行にすると、片方だけ入荷したときに照合できません。
公式のページでは、列挙の値の大文字・小文字までは保証されないとされているので、item_type と status は Apps Script で小文字にそろえてから使います。stop_reason が max_tokens のときは出力が途中で切れているので、台帳に登録せずに呼び直します。
台帳の状態と一覧は、Apps Script が次の規則で決めます。
| 状態 | 条件 | 一覧 |
|---|---|---|
code_pending | 商品コードが candidates か not_found | 商品コード未確定 |
ordered | 商品コードが確定し、入荷日が空 | ― |
arrived | 入荷日があり、連絡日が空 | 入荷から1日以上で「未連絡」 |
notified | 連絡日があり、引取日が空 | 連絡から14日以上で「未引取」 |
closed | 引取日がある、または取消・返品の印がある | ― |
日数は、店で決めて規則に書きます。 書店と自転車店では、引き取りまでの待ち方が違います。最初は1日と14日で始め、一覧の件数を見て店長と調整します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 店の取込フォルダ | Apps Script の DriveApp | 画像を読み、処理済みへ移す |
| Document AI | Apps Script の UrlFetchApp から処理の API を呼ぶ | 欄の文字、項目名と値の組、チェックボックス、信頼度 |
| Claude API | Apps Script の UrlFetchApp から呼ぶ | 商品の欄のそろえ |
| 商品マスタ | スプレッドシートの読み取り | 検索語と巻数・品番で商品コードを引く |
| 入荷データ | 共有ドライブに届くファイルの読み取り | 店と商品コードで台帳と照合する |
| 客注台帳 | スプレッドシートへの書き込み | 登録、入荷日、状態 |
入荷の照合は、同じ店・同じ商品コードの ordered の行のうち、受付日の古い順に当てます。 同じ商品の客注が2件あるとき、先に注文した客から入荷を割り当てます。今まで店員が伝票の受付日を見て決めていた順を、そのまま規則にしたものです。 入荷の数量が足りなければ、残りは ordered のままにします。
POSには書き込みません。 客注台帳は売上の記録とは別のもので、引き取りの会計は今までどおりレジで行います。
人が確認する
- 毎朝、店ごとの一覧を見る … 「未連絡」は当日中に連絡し、台帳に連絡日を入れます
- 商品コード未確定を選ぶ …
candidatesの候補から選ぶか、not_foundなら商品マスタを検索して入れます。note に「略記を直した」がある行も一度見ます - 電話番号の
unreadableを直す … 伝票の画像を見て直し、読めなければ受付者に確かめます - 未引取を店長に回す … 再連絡するか、返品するかを店長が決めます
全件の確認はしません。 商品コードが1件で当たり、note も印も無い行は、そのまま台帳に入ります。確認するのは、印の付いた行と一覧に出た行だけです。 これが human_check を「条件付き」にしている理由です。
ただし、最初の1か月は全件を見ます。 略記の直し方と商品マスタの当たり方が店ごとに違うので、どの店のどんな書き方で外れるかを、全件で確かめてから条件付きに移ります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 商品マスタに無い商品の客注 | not_found。客注担当が商品名で台帳に入れ、入荷は手で照合する |
| 客が注文を取り消す | 台帳に取消の印を入れて closed にする |
| 入荷の数量が客注より少ない | 受付日の古い順に割り当て、残りは ordered のまま |
| 客注の区分が無い入荷が客注品だった | 商品コードで ordered の行があれば照合する。区分は条件にしない |
| 伝票番号が読めない | 画像のファイル名を仮の番号にして code_pending で回す |
| 同じ伝票を2回撮った | 伝票番号が同じなら登録しない |
| 電話番号の桁が足りない | unreadable。翌日に受付者が確かめる |
| 前受金のある注文が未引取になる | 一覧で前受金の印を付けて上に並べ、店長に早めに回す |
| Document AI か Claude API が応答しない | 画像を取込フォルダに残し、翌日の実行で拾い直す |
4行目が、今まで連絡漏れが起きていた原因の1つです。 入荷データの客注の区分は付かないことがあり、区分だけを見て伝票を探すと、区分の無い客注品を見落とします。 商品コードで照合すれば、区分の有無にかかわらず当たります。
記録を残す
- 伝票の画像と、撮った日時と店
- Document AI が返したJSONの全文
- Claude API に渡した商品の欄と、返ってきたJSON
- 客注台帳の状態の変化(登録、入荷、連絡、引取、取消)と、人が直した記録
- 一覧の日ごとの控えと、そのときの日数の規則の版
状態の変化を残すのは、客から問い合わせが来たときに答えるためです。 いつ入荷して、いつ誰が連絡したかが台帳に残っていれば、伝票の束を探さずに答えられます。
04実装レベルの3段階
最小構成では毎日は回せません。 確かめるための段階です。 半自動化で、1件5分が3分程度になります。 打ち直しはなくなりますが、入荷のたびに台帳を探して入荷日を入れるのはまだ人です。本格構成で1分になり、この段階が本記事の想定です。 差が大きいのは、入荷との照合と月末の点検が、毎朝の一覧に置き換わるからです。 段階を飛ばさないでください。 半自動化の台帳を1か月見ると、どの店のどんな略記がマスタで引けないかが分かります。略記の一覧を直してから入荷の照合を始めるほうが、code_pending の行が残らず、照合から漏れる客注が減ります。
05工数削減シミュレーション
導入後 720件 × 1分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 書店・文具店・ホームセンター・自転車店など、店頭で取り寄せの注文を受けることが多い小売チェーン。客注伝票は店員が手書きする複写式で、店控えを箱やバインダーに入れて管理しており、入荷のたびに伝票の束をめくって該当の注文を探している場合。入荷したのに客へ連絡していない、連絡したのに何週間も引き取られていない、という伝票が月末の棚卸で見つかる場合。Google Workspace を使っている場合。
- 客注をすでにPOSや受注の仕組みに直接入力しており、手書きの伝票が無い場合。客注が1店舗で月に数件で、担当者が伝票の束を見れば足りる場合。仕入先の入荷データに客注の伝票番号や商品コードが載らず、入荷と注文を結び付ける手がかりが無い場合。なお、客への連絡、前受金の扱い、取り寄せ品を返品するかの判断は、この構成では代替できません。
07最小構成で試す方法
- 1店舗の客注の箱から、伝票を30枚選ぶ(書籍・文具を混ぜ、略記の多いものを入れる)
- 客の名前と電話番号の欄を紙で隠して撮る
- 手元のAIサービスの画面に1枚ずつ貼り付ける
- 「この伝票の商品の欄から、商品の種類、シリーズ名や商品名、巻数、品番、数量を書き出してください。略記は正式な名前に直し、直したことを書いてください。ISBNや商品コードは作らないでください」と指示する
- 書き出された名前で商品マスタを検索し、何枚が1件で当たるかを数える
名前と電話番号を隠すのは、試す段階でも客の情報を外に出さないためです。 試すのは商品の欄がマスタで引けるかで、客の情報は要りません。
| 出てきた内容 | 判断 |
|---|---|
| 大半が商品マスタで1件で当たった | Document AI と Apps Script のつなぎに進む |
| ISBNや商品コードを作った | 指示の書き方で直る。構成は有効 |
| 略記の直し方が違う | 店でよく使う略記の一覧を渡せば直ることが多い |
| 手書きが読めない伝票が多い | 撮り方と書き方が先。 AIの問題ではない |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| AIがISBNや商品コードを作る | 指示で禁じ、コードはマスタの検索だけで決める |
| 略記の読み方を間違える | note に残し、確定でも一度人が見る |
| 1枚の複数の商品を1行にまとめる | items に分けて返させる |
| 客注の区分が無い入荷を見落とす | 区分を条件にせず、商品コードで照合する |
| 同じ商品の客注2件の割り当てを間違える | 受付日の古い順に当てる |
| ○を付けた連絡方法が読めない | ラジオボタンに対応しない。□ に改めるまで既定値にする |
| 複写の2枚目が薄い | 強めに書くよう伝票に印刷する |
| 撮り直しで二重に登録される | 伝票番号で重複を止める |
| 伝票と台帳の両方に連絡日を書く | 台帳を正とし、伝票には書かない |
| 条件付き確認に早く移りすぎる | 最初の1か月は全件を見る |
上の2行が、この構成の失敗のほとんどです。 どちらも、台帳の上では確定した商品に見える行を作ります。誤ったコードの行は入荷と照合されず、未連絡の一覧にも出ません。 漏れを拾うための仕組みが、漏れを隠すことになります。
4行目は、今の運用から引き継がれる穴です。 区分を頼りに伝票を探す習慣のまま規則を作ると、同じ漏れが残ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 客の名前と電話番号、注文した商品、受付日と引取日、前受金の有無です。
- 国外で処理されることを確かめる … Document AI のリージョンの一覧に日本はありません。
us、eu、単一リージョンのどこで処理するかを決め、店の個人情報の取扱いの決まりと合っているかを確かめます - AIに客の情報を渡さない … Claude API に渡すのは商品の欄と数量だけです。名前と電話番号は Apps Script が項目名と値の組から台帳に直接書きます
- 台帳の閲覧を絞る … 全店で1つの台帳には全店の客の名前と電話番号が並びます。店の担当者は自分の店の行だけを見られるよう、店ごとの表示用のシートを分けます
- 連絡を自動で送らない … 一覧は連絡すべき客を出すだけで、電話は店員がかけます。取り寄せた商品の名前は、客にとって知られたくない情報であることがあります。 家族が電話に出たときの伝え方は、今までどおり店員が判断します
- 前受金の扱いを規則に任せない … 未引取の一覧に前受金の印が付いていても、返金するか、保管を続けるかは店長と本部が決めます。一覧は判断の順番を示すだけです
- 保存の期間を決める … 引き取られた注文の行と伝票の画像を、いつまで残すかを決めます。伝票の画像にも、客の名前と電話番号がそのまま写っています
誤りが起きた場合のリスクは、連絡すべき客を一覧から漏らすことと、客の情報が他の店や外部に見られることの2つです。 前者は商品コードを作らせないことと区分に頼らない照合で、後者はAIに渡す範囲と台帳の見せ方で防ぎます。
10まず何から始めるか
1週目:店ごとの台帳を数える
各店の客注台帳と客注の箱を見比べ、箱にあって台帳に無い伝票、入荷済みで連絡日の無い伝票の数を数えます。 この数が、構成を入れる前の基準になります。
2週目:30枚で試す
1店舗の伝票30枚で、客の情報を隠して商品の欄を書き出させ、商品マスタで何枚が当たるかを数えます。コードを作っていないかを最優先で見ます。
3週目:全店の台帳と略記の一覧を作る
列をそろえた全店で1つの客注台帳を作り、各店の客注担当から略記を集めます。伝票の連絡方法の欄を □ に改める刷り直しも、このときに手配します。
4週目:取込フォルダから台帳までをつなぐ
Apps Script で取込フォルダを見張り、Document AI と Claude API を呼び、商品マスタで引いて台帳に登録するところまで作ります。この時点では入荷の照合をせず、登録された行を全件見ます。
2か月目: 入荷データとの照合と毎朝の一覧を足し、未連絡・未引取の件数を毎週数えます。3か月目以降: 全件確認から条件付き確認に移り、1件5分が何分になったかを実測します。月末の伝票の点検で、未連絡と未引取の伝票が見つからなくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser がOCRのテキストに加えてキーと値のペア、チェックボックス、表を抽出すること。日本語(ja)が手書きに対応する言語に含まれること | Google Cloud: Processor list | 2026-10-07 |
| チェックボックスのモデルがラジオボタンに対応しないこと。値の入っていないキーと値の組を確実には読み取れないこと | Google Cloud: Form Parser | 2026-10-07 |
項目名と値の組が formFields の fieldName/fieldValue で、チェックボックスが valueType の filled_checkbox/unfilled_checkbox で返ること | Google Cloud: Handle the processing response | 2026-10-07 |
| 対応形式が PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などであること。スキャンは最低200dpiが望ましく300dpi以上が一般に最もよいこと | Google Cloud: Supported files | 2026-10-07 |
マルチリージョンが us と eu で、単一リージョンにシンガポール(asia-southeast1)などがあり、日本のリージョンが一覧に無いこと | Google Cloud: Regional and multi-regional support | 2026-10-07 |
output_config.format に JSON スキーマを渡して応答の形を固定できること。列挙の値の大文字・小文字は保証されないこと。max_tokens で打ち切られたときはスキーマに合わない出力になりうること | Claude API: Structured outputs | 2026-10-07 |
| 時間主導型のトリガーが指定の時刻や間隔で動かせ、実行の時刻が少しずれることがあること | Google Apps Script: Installable triggers | 2026-10-07 |
客への連絡、前受金の扱い、取り寄せ品を返品するかは、店長と本部が判断してください。 本記事は製品の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0797)についてのご相談はこちらから。
