洋菓子店が手書きのホールケーキ・贈答品の予約票を読み取り、受け取り日ごとの製造の数と受け渡しの一覧を作る
店頭と電話で受けた手書きのホールケーキ・贈答品の予約票を読み取り、受け取り日ごとの製造の数の表を作ります。あわせて、店舗ごと・時刻順の受け渡しの一覧と、プレートの文字・アレルギーの申し出の注意の一覧を作ります。
- 生成AI
- Azure OpenAI Service/ChatGPT/Claude
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 小売/製造/飲食
- 対象部門
- 営業/生産
- 対象業務
- データ入力・転記/集計・分析
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 店頭の担当が、店頭または電話で予約を受け、予約票に書く
- 2枚目の予約票を、受け取り日ごとの仕切りのある箱に入れる
- 閉店後、店長が予約票を予約の台帳に打ち込む
- 翌日と翌々日の受け取りの予約票を束から抜き出し、商品と号数ごとに数える
- 数えた結果を工房の段取りの表に書き込み、プレートの文字とろうそくの本数を別の紙に写す
- アレルギーの申し出がある予約票を工房の責任者に渡し、対応できるかを確かめてもらう
- 受け取りの当日、店頭の担当が時刻順に予約票を並べ、受け渡しの準備をする
- 人店頭の担当が予約票を書き、2枚目を店舗の複合機でスキャンして共有のフォルダに入れる(1時間に1回、まとめて)
- 自動30分ごとにスクリプトが新しいファイルを拾い、形式・大きさ・ページ数を確かめる
- 自動Google Document AI の Form Parser が、記入欄(キーと値の組)、チェック欄(埋まっているか空か)、表、位置と信頼度を返す
- 自動スクリプトが、受け取りの日時を規則で確定し、決めきれないものに印を付ける
- 自動生成AIが、商品の書き方を商品の一覧の名前と号数に当て、プレートの文字を原文のまま取り出す
- 自動受け取り日ごとの製造の数の表、受け渡しの一覧、注意の一覧(プレート・ろうそく・アレルギー・包装)を書き出す
- 人店長が印の付いた予約票だけを画像と見比べ、必要ならお客様に電話で確かめる
- 人工房の責任者が注意の一覧のアレルギーの申し出を見て、対応できるかを決め、店長に返す
- 人工房が製造の数の表で段取りを組み、店頭が受け渡しの一覧で当日の準備をする
各工程の詳しい説明を読む
- 店頭の担当が、店頭または電話で予約を受け、予約票に書く
- 2枚目の予約票を、受け取り日ごとの仕切りのある箱に入れる
- 閉店後、店長が予約票を予約の台帳に打ち込む
- 翌日と翌々日の受け取りの予約票を束から抜き出し、商品と号数ごとに数える
- 数えた結果を工房の段取りの表に書き込み、プレートの文字とろうそくの本数を別の紙に写す
- アレルギーの申し出がある予約票を工房の責任者に渡し、対応できるかを確かめてもらう
- 受け取りの当日、店頭の担当が時刻順に予約票を並べ、受け渡しの準備をする
(a)数え直しが毎晩ある。 予約票の束から日付で抜き出し、「イチゴのショート5号が3台、6号が2台」と数えるのは、単純ですが、2店舗分を合わせると毎晩30分を超えます。 1枚入れ違えると、1台足りない、1台余るが起きます。
(b)受け取りの日時の書き方がばらばら。 「12/24」「24日」「土曜」「来週の金」「夕方」「3時」が混ざります。同じ予約票の日付と曜日が食い違うこともあります。 箱の仕切りに入れ違えると、その予約は数えられません。
(c)プレートの文字を写し間違える。 5番目でプレートの文字を別の紙に写すとき、名前の漢字や「ちゃん」「くん」を写し違えることがあります。 工房は写した紙を見て書くので、予約票の文字とは違うプレートができます。
(d)アレルギーの申し出が埋もれる。 チェック欄は予約票の下のほうにあり、束をめくって数える流れでは見落とされることがあります。 工房に渡す前に、申し出のある予約票だけを確実に抜き出す手立てがありません。
- 【人】 店頭の担当が予約票を書き、2枚目を店舗の複合機でスキャンして共有のフォルダに入れる(1時間に1回、まとめて)
- 【自動】 30分ごとにスクリプトが新しいファイルを拾い、形式・大きさ・ページ数を確かめる
- 【自動】 Google Document AI の Form Parser が、記入欄(キーと値の組)、チェック欄(埋まっているか空か)、表、位置と信頼度を返す
- 【自動】 スクリプトが、受け取りの日時を規則で確定し、決めきれないものに印を付ける
- 【自動】 生成AIが、商品の書き方を商品の一覧の名前と号数に当て、プレートの文字を原文のまま取り出す
- 【自動】 受け取り日ごとの製造の数の表、受け渡しの一覧、注意の一覧(プレート・ろうそく・アレルギー・包装)を書き出す
- 【人】 店長が印の付いた予約票だけを画像と見比べ、必要ならお客様に電話で確かめる
- 【人】 工房の責任者が注意の一覧のアレルギーの申し出を見て、対応できるかを決め、店長に返す
- 【人】 工房が製造の数の表で段取りを組み、店頭が受け渡しの一覧で当日の準備をする
7番目が、この構成の分かれ目です。人が見るのは印の付いた予約票だけです。 720枚を全部見比べると、60.0時間はあまり減りません。
8番目は、いまと同じく人の判断です。 注意の一覧は「申し出がある」という事実を並べたもので、対応できるかの答えではありません。 工房の原材料と作り方を知っている責任者が決めます。
02今回想定するシステム構成
予約票(2枚複写の2枚目) │ 店舗の複合機でスキャン(1時間に1回) ▼【トリガー】30分ごと、共有のフォルダの新しいファイル Google Apps Script(時間主導型のトリガー) ├──▶ 形式・大きさ・ページ数の確認 ▼ Google Document AI(Form Parser) │ 記入欄(キーと値の組)・チェック欄(filled/unfilled)・位置・信頼度 ▼ Apps Script ── 受け取りの日時の確定(受付日・曜日との照合)、必須の欄の有無 ▼ Claude API ── 商品の書き方を商品の一覧に当てる/プレートの文字を原文のまま取り出す ▼ スプレッドシート ├─ 受け取り日ごとの製造の数(商品×号数) ├─ 受け渡しの一覧(店舗ごと・時刻順・前金の有無) └─ 注意の一覧(プレート・ろうそく・アレルギーの申し出・包装) ▼ 【人】店長が印の付いたものを確かめる → 工房の責任者がアレルギーの申し出を判断
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(商品の書き方の当てはめ、プレートの文字の取り出し) | OpenAI API、Azure OpenAI |
| 連携 | Google Apps Script(ファイルの受け取り、APIの呼び出し、日時の確定、表の書き出し) | Python |
| 保管 | Google ドライブの共有のフォルダ(予約票の画像、読み取りの結果) | 社内のファイルサーバー |
予約の台帳と工房の段取りの表は、新しく足すものではありません。 製造の数の表は工房の段取りの表と同じ並び(商品×号数×受け取り日)で書き出し、工房の責任者が段取りの表に移します。 段取りの表そのものには書き込みません。
土台になるのは、Google Document AI の Form Parser です。 キーと値の組、表、チェック欄などの選択マーク、一般的な項目、文字を取り出す処理装置で、学習は要らず、学習させることもできません。 予約票のように「お名前:__」の形の欄が並ぶ様式に向くとされています。対応言語には日本語(ja)があり、手書きに対応と示されています。
キーと値の組のキーは、予約票に印刷された見出しの文字そのものです。 公式のページは、キーと値の組のキーは文書の上のキーの文字そのままで、名前をあらかじめ決めて取り出す方式とは違う、と説明しています。「お受取日」「受取日時」のように店舗で見出しが違うと、キーも変わります。 2店舗で様式を同じにしておくのが前提です。
チェック欄は、埋まっているか空かが返ります。 値の種類(valueType)が filled_checkbox か unfilled_checkbox になり、アレルギーの申し出、前金の有無、店頭/配達の別を、チェック欄のまま読めます。 ラジオボタンには対応せず、値の入っていないキーと値の組は確実には読めない、という制約があります。
一般的な項目の取り出しも使えます。 Form Parser は、電話番号・日付と時刻・人の名前・数量・価格などの11種類の項目を取り出します。電話番号と日付の候補を、キーと値の組とは別の経路でも拾えるので、見出しが読めなかった予約票の救いになります。
03どうやって実装するのか
処理の起点を決める
30分ごとに、共有のフォルダに入った新しいファイルを処理します。 店頭の担当は、1時間に1回、たまった予約票の2枚目をまとめてスキャンします。30分ごとに読めば、閉店の時点で当日の予約がすべて表に入っています。
起点は Apps Script の時間主導型のトリガーです。 公式のページによると、時間主導型のトリガーは毎分から月1回までの間隔で動かせ、動く時刻は少しずれることがあります。30分ごとなら、ずれても閉店後の確認には間に合います。
1回の実行は6分までで、トリガーの合計の実行時間には1日あたりの上限があります(個人のアカウントで90分、Google Workspace のアカウントで6時間)。外部の API を呼ぶ回数(URL Fetch)にも1日あたりの上限があり、個人のアカウントで20,000回、Workspace のアカウントで100,000回です。月720枚なら回数の上限には遠く及びませんが、実行時間を考えて業務用のアカウントで動かします。 1回で処理する枚数を決め、残りは次の回に回します。
閉店後の17時と20時には、別のトリガーで翌日分の表を確定させます。 17時の表で工房が翌日の仕込みの量を見積もり、20時の表で最終の段取りを組みます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 予約票の画像・PDF | 2枚目。スキャンの日時と店舗 | 共有のフォルダ |
| 読み取りの結果 | キーと値の組、チェック欄、一般的な項目(電話番号・日付と時刻・数量など)、位置と信頼度 | Google Document AI |
| 商品の一覧 | 商品の名前、号数の選択肢、受け取りの何日前までに受けるか、作る日(前日/当日) | 店で用意する表 |
| 店の営業日 | 店舗ごとの定休日・臨時休業 | 店で用意する表 |
| 予約の台帳 | 予約番号、変更・取り消しの記録 | 予約の台帳 |
質を決めるのは、商品の一覧です。 予約票には「イチゴショート」「苺ショート」「ショート(いちご)」と書き方が混ざり、号数も「5号」「15cm」「5」と書かれます。一覧に正式な名前と号数の選択肢があれば、当てはめの答えが決まります。
作る日の列が、製造の数の表を受け取り日から製造日に変えます。 前日に作る商品と当日の朝に作る商品があり、受け取り日で数えた数を、作る日で数え直すのは規則で行えます。
データの取得方法を決める
読み取りは、Apps Script から Form Parser の処理装置を呼びます。 認証の組み方(サービスアカウントかスクリプトの認可か)は、利用の環境に応じた個別の設定が要ります。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 記入欄 | pages[].formFields[] の fieldName と fieldValue | お名前・電話・受け取りの日時・商品・数量・プレートの文字 |
| チェック欄 | fieldValue.valueType(filled/unfilled) | アレルギーの申し出・前金・店頭/配達 |
| 一般的な項目 | 文書の entities(phone、date_time、quantity など) | 見出しが読めなかったときの補い |
| 位置と信頼度 | layout の boundingPoly・confidence | 低い信頼度の欄に印を付ける |
必須の欄は、「キーが返ってこない」ことも漏れとして扱います。 受け取りの日時、商品、数量、お名前、電話番号の5つは必須で、キーと値の組の中に見出しが見つからないときは、空欄の可能性があるとして印を付けます。 Form Parser は値の入っていない組を確実には読めないので、返ってこないこと自体を手がかりにします。
予約票の商品の欄は、表の形にしておきます。 1枚の予約票で複数の商品を受けることがあるので、商品・号数・数量の3列の表にします。Form Parser の表の読み取りはセルの結合の無い表に限られるので、様式の表は結合を使いません。
AIへ渡す前に整形する
- 形式の確認 … PDF または画像(JPEG、PNG、TIFF など)であることを確かめます
- 大きさとページ数の確認 … オンラインの処理は1回15ページまで、ファイルは40MBまでです。複合機で束ごとスキャンしたPDFは、1枚ずつに分けてから送ります
- 複写の濃さの確認 … 2枚目は複写なので、筆圧の弱い字が薄くなります。スキャンの濃さを1段上げる設定を複合機に保存しておきます
- 重複の検知 … 同じ電話番号・同じ受け取りの日時・同じ商品の予約票が既にあれば、二重のスキャンか、変更の書き直しかを印にします
- 取り消し線の確認 … 線で消して書き直した欄は、信頼度が下がりやすいので、低い欄にまとめて印を付けます
3番目がこの題材の特有の点です。 1枚目をお客様に渡す運用なので、店に残るのは複写の2枚目です。電話を聞きながら急いで書いた字は、2枚目では読めないほど薄いことがあります。 書くときにボールペンを強く押す、を店頭の決まりにしておきます。
AIに処理させる
受け取りの日時の確定には、生成AIを使いません。 Apps Script が規則で決めます。生成AIにさせるのは、商品の書き方を商品の一覧に当てることと、プレートの文字を原文のまま取り出すことだけです。
日時の確定の規則は次のとおりです。
| 書き方 | 規則 | 決めきれないとき |
|---|---|---|
| 「12/24」のように月日がある | 受付日より後で最も近いその月日 | 受付日から90日より先なら印 |
| 「24日」のように日だけ | 受付日より後で最も近いその日 | 印を付けて受付に確かめる |
| 月日と曜日の両方がある | 月日で決め、曜日が合わなければ印 | 両方を見せて受付に確かめる |
| 「土曜」「来週の金」だけ | 決めない | 印を付けて受付に確かめる |
| 「3時」「夕方」 | 「3時」は15時とし、営業時間の外なら印。「夕方」は時刻なしとして印 | 受付に確かめる |
| 定休日に当たる | 決めない | 印を付けて受付に確かめる |
曜日との照合が、いちばん効く規則です。 電話で「24日の土曜」と聞いて「23(土)」と書く、といった誤りは、月日と曜日の食い違いとして機械的に見つかります。 どちらが正しいかは決めず、受付がお客様に確かめます。
生成AIにさせることは2つです。
| させること | 中身 | 判断できないときの扱い |
|---|---|---|
| 商品の当てはめ | 書かれた商品の名前と号数を、商品の一覧の名前と号数の選択肢に当てる | 一覧に無い、または2つ以上に当たれば no_match・multiple |
| プレートの文字の取り出し | 書かれた文字を一字も変えずに写す | 読めない文字があれば unreadable |
| させないこと | 理由 |
|---|---|
| 受け取りの日時の推定 | 規則で確定する。年や曜日を推させない |
| プレートの文字の直し(漢字への変換、誤字の修正) | お客様の文字のまま作る |
| アレルギーの申し出への対応の可否 | 工房の責任者が原材料と作り方を見て決める |
| 数量の補い(「1」が書かれていないときに1とする) | 数量が無ければ空欄として印 |
| のしの表書き・名入れの直し | 書かれたまま写す |
いちばん起きやすいのは2行目です。 「ゆい」を「結衣」に、「おめでと」を「おめでとう」に直すのは、生成AIにとって自然な手直しです。直したプレートは、お客様にとっては間違ったプレートです。
指示内容を固定する
あなたは洋菓子店で、予約票の商品の欄とプレートの欄を整理する係です。
渡すのは、OCR が読み取った予約票1枚分の商品の欄・プレートの欄の文字と、商品の一覧です。
書かれていることだけを使ってください。推測で埋めないでください。
【やること】
1. 商品の欄の各行について、書かれた商品の名前と号数を、商品の一覧の名前と号数の選択肢に当ててください。
- 1つに当たれば match_status を matched にし、一覧の名前と号数を入れてください。
- 当たるものが無ければ no_match、2つ以上に当たりうれば multiple にしてください。
- 「15cm」のように号数以外の書き方なら、一覧の換算表にあるときだけ号数に当ててください。
2. プレートの欄の文字を、plate_text_as_written に写してください。
【厳守事項】
- プレートの文字は一字も変えないでください。平仮名を漢字にしない、漢字を平仮名にしない、
誤字に見えても直さない、句読点や記号を足したり消したりしないでください。
- 読めない文字があれば、その文字の位置に〓を入れ、plate_status を unreadable にしてください。
- 数量が書かれていなければ quantity を空にしてください。1と仮定しないでください。
- 受け取りの日時について何も判断しないでください(別の処理で確定します)。
- アレルギーの申し出について、対応できるか、どの商品なら大丈夫かを書かないでください。
- original には、商品の欄の各行の文字をそのまま写してください。
【商品の一覧(名前・号数の選択肢・号数の換算表)】{product_master}
【商品の欄】{product_rows}
【プレートの欄】{plate_text}
「一字も変えない」を細かく分けて書かないと、どこかで変えます。 漢字への変換を禁じても、句読点の追加や「!」の削除は残ります。変えてよい部分が無いことを、型ごとに並べて伝えます。
「数量を1と仮定しない」も同じです。 予約票では数量の欄を空けたまま「1台」のつもりで書く担当がいますが、空欄を1と読むと、2台の予約の書き忘れも1台になります。 空欄は空欄として受付に戻します。
出力形式を固定する
次の形の JSON で受け取ります。 Claude API の構造化出力で、output_config.format に type: "json_schema" と schema を渡し、object には additionalProperties: false を付けます。
{
"items": [
{ "original": "イチゴショート 5号 2", "match_status": "matched | no_match | multiple",
"product": "苺のショートケーキ", "size": "5号", "quantity": "2" }
],
"plate_text_as_written": "ゆいちゃん 5さい おめでとう",
"plate_status": "ok | unreadable | blank"
}
1つ目の理由は、数量を文字のまま受け取れることです。 公式のページによると、Claude の構造化出力では数値の minimum・maximum はスキーマとして送れず(SDK の変換で説明文に移されます)、配列の minItems は 0 と 1 だけです。数量は文字で受け取り、範囲の確かめは Apps Script で行います。 「2」以外に「二」「2台」と書かれていても、Apps Script の側で数にそろえます。
2つ目は、original を残すことで、当てはめの誤りを後から直せることです。 商品の一覧に新しい商品を足したとき、過去の予約票の original を当て直すだけで、製造の数を数え直せます。
Apps Script が書き出す表は3つです。
| 表 | 列 | 使う人 |
|---|---|---|
| 製造の数 | 作る日・商品・号数・数量の合計・予約の件数 | 工房 |
| 受け渡しの一覧 | 店舗・受け取りの時刻・お名前・商品・前金の有無・印 | 店頭 |
| 注意の一覧 | 受け取り日・お名前・プレートの文字・ろうそく・アレルギーの申し出・包装とのし | 工房と店頭 |
製造の数の表には、印の付いた予約を別の列で数えます。 確定した予約の合計と、印が付いて確認待ちの予約の合計を分けておくと、工房は確認待ちの分を見込みで仕込むか、待つかを選べます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有のフォルダ | Apps Script が読む | 新しい予約票を拾う |
| Google Document AI | API の呼び出し | 記入欄・チェック欄・一般的な項目・位置と信頼度を返す |
| Claude API | API の呼び出し | 商品の当てはめとプレートの文字の取り出し |
| 商品の一覧・営業日 | スプレッドシートの読み取り | 当てはめと日時の確定に使う |
| 予約の台帳 | 行の追加(確認待ちの列付き) | 店長が確かめてから確定にする |
| 製造の数・受け渡し・注意の一覧 | スプレッドシートの書き出し | 工房と店頭が見る |
予約の台帳には、確認待ちの状態で行を足します。 店長が印の付いた予約を確かめたら、確定の列に印を入れます。工房の段取りの表へは書き込まず、 工房の責任者が製造の数の表を見て移します。
お客様への連絡は自動で行いません。 日時の食い違いや数量の空欄をお客様に確かめるのは店長で、電話をかけるかどうかも、予約の状況を見て店長が決めます。
人が確認する
店長が見るのは、印の付いた予約票だけです。
- 日時の印を先に見る … 曜日の食い違い、日だけの書き方、定休日に当たるもの。多くは受付の担当に聞けば分かり、分からなければお客様に電話します
- 必須の欄の印を見る … 数量・商品・電話番号の空欄か、読めなかったものか。画像で確かめます
- 商品の
no_matchとmultipleを見る … 一覧に無い商品なら、法人の特注か新しい商品かを確かめます - プレートの
unreadableを見る … 〓の入った文字を画像で読み、読めなければお客様に確かめます
工房の責任者が見るのは、注意の一覧のアレルギーの申し出です。 チェック欄と記入欄の内容を見て、その商品で対応できるかを、原材料と作り方を知っている責任者が決めます。 対応できないときにお客様に伝えるのは店長です。
プレートの文字は、作る人が予約票の画像と見比べます。 注意の一覧の文字は写しなので、チョコレートに書く前に、画像の文字を1回見てから書くことを工房の決まりにします。
目標は、720枚をならして1枚2分です。 印の付く予約票が2〜3割という想定です。それより多い月は、複写が薄いか、商品の一覧が古くなっています。
例外に対処する
| 起きること | 対応 |
|---|---|
| 束ごとスキャンしたPDF | 1枚ずつに分けてから送る。オンラインの処理は15ページまで |
| 複写が薄く読めない | 印を付けて、店頭の担当に1枚目の内容を聞く。スキャンの濃さを見直す |
| 予約の変更で書き直した予約票 | 重複として印を付け、古い予約を台帳で取り消しにしてから新しいものを確定する |
| 取り消しの予約 | 予約票に「取消」と書いて再スキャン。取消の文字を見つけたら台帳で取り消しの案を出す |
| 定休日に受け取りの予約 | 決めずに印。受付の書き間違いか、特別の対応かを店長が確かめる |
| 商品の一覧に無い商品 | no_match。法人の特注は一覧に「特注」の行を作って当てる |
| 生成AIが応答しない | 商品の欄の原文のまま確認待ちにし、店長が当てはめる |
| 読み取りが応答しない | ファイルを元のフォルダに残し、次の回に再処理。20時の確定までに読めなければ束で数える |
3行目と4行目が、製造の数を狂わせる例外です。 変更の予約票と元の予約票が両方生きていると、同じ予約を2回数えます。 変更は「元の予約を取り消してから新しい予約を確定する」順で台帳に入れることを、店頭の決まりにします。
最後の行は、紙に戻れる道を残しておくためのものです。 読み取りが止まっても、予約票の束は箱に残っています。 20時の時点で表がそろっていなければ、いままでどおり束で数えます。
記録を残す
- 予約票の画像と、スキャンの日時・店舗
- Document AI が返した文書のデータの全文
- 日時の確定の結果と、適用した規則(月日・曜日・受付日のどれで決めたか)
- 生成AIの当てはめの結果、
original、そのとき使った商品の一覧の版 - 店長が確かめて直した記録 … どの欄を、何から何へ、お客様に確かめたかどうか
- 製造の数の表の版(17時・20時)と、工房が段取りの表に移した記録
日時の確定で適用した規則を残すのは、受け取りの日の行き違いが起きたときのためです。 お客様が「24日と言った」とおっしゃったとき、予約票に何と書かれていて、どの規則で23日と決めたのかをたどれます。
製造の数の表を17時と20時の2つの版で残すのは、 工房がどちらの数で仕込んだかを後で確かめられるようにするためです。
04実装レベルの3段階
本記事の想定は半自動化です。 1枚5分が2分になる見込みは、この段階で置いています。打ち込みと数え上げが無くなり、残るのは印の付いた予約票の確認です。 本格構成は、半自動化の表が工房の段取りと合うことを確かめてからにします。 発注の見込みまで下書きすると、商品の一覧の誤りが、そのまま原材料の過不足になります。
05工数削減シミュレーション
導入後 720件 × 2分 ÷ 60 = 24 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 2〜3店舗と工房を持つ洋菓子店で、誕生日・記念日のホールケーキや贈答の焼き菓子の予約を、店頭と電話で手書きの予約票に受けている場合。閉店後に予約票の束から翌日以降の製造の数を数え直していて、数え間違いやプレートの文字の写し間違いが起きる場合。予約票の様式が店舗間で同じで、商品と号数の一覧が決まっている場合。
- 予約をすでに Web の予約の仕組みで受けていて、店頭の予約もその画面で入力している場合(読み取りは要らず、仕組みの集計を使うだけで足ります)。予約が月に数十件で、工房が予約票の束を直接見て足りる場合。なお、アレルギーの申し出に店として対応できるかの判断と、原材料の表示の確認は、この構成では行いません。
07最小構成で試す方法
- 先月の予約票から30枚を選ぶ(うち数枚は、曜日の食い違い、複写の薄いもの、プレートの文字が長いものを入れる)
- その30枚について、店長が数えた製造の数と、工房に渡したプレートの文字を取り出しておく
- Google Cloud のコンソールで Form Parser の処理装置を作り、30枚を1枚ずつ読ませる
- 返ってきたキーと値の組とチェック欄を見て、見出しの文字がキーとしてどう返るかを確かめる
- 商品の欄とプレートの欄の文字を手元の生成AIの画面に貼り、「商品の一覧に当ててください。プレートの文字は一字も変えずに写してください」と指示し、結果を当時の数とプレートの文字と突き合わせる
4番目で、店舗の様式の違いが見えます。 見出しの文字が店舗で違えばキーも変わるので、様式をそろえる必要があるかどうかが、ここで分かります。
| 出てきた内容 | 判断 |
|---|---|
| 当時の数とプレートの文字が一致した | Apps Script でつなぐ段階に進む |
| プレートの文字を直した | 指示の書き方で直る。型ごとに禁止を足す |
| 複写の薄い予約票が読めない | スキャンの濃さと書き方が先。 AI の問題ではない |
| 当時の数え間違いが見つかった | 構成の効果そのもの。 入れ違いの型を記録する |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 生成AIがプレートの文字を直す | 一字も変えない、を型ごとに書く。 作る人が画像を見てから書く |
| 生成AIが受け取りの日付の年や曜日を推す | 日時は規則で確定する。 生成AIに日時を渡さない |
| 数量の空欄が1台になる | 1と仮定させない。空欄は印にして受付に戻す |
| 必須の欄の空が読み取りの結果に出ない | 値の無い組は確実に読めない。キーが返らないことも印にする |
| 店舗で見出しが違いキーが変わる | 2店舗の様式をそろえる |
| 複写の2枚目が薄い | 強く押して書く。スキャンの濃さを上げる |
| 束ごとスキャンして15ページを超える | 1枚ずつに分けてから送る |
| 変更の予約を2回数える | 元の予約を取り消してから新しい予約を確定する |
| 注意の一覧を対応の可否と読む | 表の題に「申し出の一覧」と書く。決めるのは工房の責任者 |
| 製造の数の表をそのまま段取りの表に入れる | 工房の責任者が移す |
上の3行が、この構成の失敗のほとんどです。 どれも「それらしい値で埋める」動きで、埋まった値は正しく見えるので、誰も疑いません。 プレートの文字、日時、数量は、書かれたまま受け取り、決めきれないものを人に戻してください。
8行目は、運用の決まりで防ぐ失敗です。 変更の予約票が増える年末や記念日の多い月ほど起きやすく、数が1台ずつずれるので、工房は気づきにくい失敗です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: お客様の名前・電話番号、受け取りの日時と店舗、プレートの文字(子どもの名前と年齢が入ることが多い)、アレルギーの申し出、贈答の宛先の名前です。
- 生成AIに渡すのは商品の欄とプレートの欄の文字だけ … 名前・電話番号・アレルギーの申し出は渡しません。プレートの文字には子どもの名前と年齢が入るので、 渡すのはプレートの文字の取り出しに要る範囲に限ります
- 処理の地域を確かめる … Form Parser の対応地域に日本はありません(asia-southeast1、us、eu など)。予約票の画像が国外の地域で処理されることを、店として確かめておきます
- この構成はアレルギーの申し出への対応を判断しません … 注意の一覧は申し出の事実を並べるだけです。対応できるかは、工房の責任者が原材料と作り方を見て決めます
- 原材料の表示の確認は別の手順で行う … 予約の商品の表示が正しいかは、この構成の外です
- 閲覧の範囲を分ける … 受け渡しの一覧は店舗ごとに分け、ほかの店舗のお客様の電話番号は見えないようにします
- 予約票の原本を残す … 2枚目の予約票を、受け取りの日から決めた期間保管します。読み取りの結果は写しです
誤りが起きた場合のリスクは、製造の数がずれることと、プレートの文字やアレルギーの申し出を取り違えることの2つです。 前者は日時の規則と変更の手順で、後者は一字も変えない指示と工房の責任者の確認で防ぎます。特にアレルギーの申し出は、お客様の体に関わるので、必ず人が判断します。
10まず何から始めるか
1週目:商品の一覧と営業日の表を作る
商品ごとに、正式な名前、号数の選択肢(「15cm」などの換算も)、作る日(前日/当日)を書き出します。店の定休日と臨時休業も表にします。 2店舗の予約票の見出しが違えば、ここでそろえます。
2週目:30枚で試す
曜日の食い違いや複写の薄いものを含む30枚を Form Parser で読み、見出しがキーとしてどう返るかを確かめます。商品の当てはめとプレートの文字の取り出しを生成AIの画面で試し、当時の数とプレートの文字と突き合わせます。
3週目:日時の確定の規則を決める
第7章の表をもとに、受付日・月日・曜日・営業日から日時を確定する規則を、店長と決めます。「3時」を15時とする、のような店の慣習も規則に入れます。
4週目:Apps Script でつなぐ
30分ごとのトリガーで読み取り、日時の確定、商品の当てはめ、3つの表の書き出しまで作ります。最初の2週間は、店長が束で数えた数と表の数を並べて比べます。
2か月目: 表の数が束の数と合うことを確かめてから束の数え上げをやめ、17時と20時の確定を始めます。3か月目以降: 印の付く予約票の割合と、受け取りの日の行き違いの件数を数えます。工房が17時の表で仕込みを決め、店頭が受け渡しの一覧だけで当日の準備ができるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Form Parser がキーと値の組・表・チェック欄などの選択マーク・11種類の一般的な項目(電話番号・日付と時刻・人の名前・数量・価格など)・文字を取り出すこと。学習が不要で、学習させられないこと。「名前:__」の形の様式に向くこと。チェック欄が filled/unfilled を示す値の種類付きで出ること。表の読み取りが結合の無い表に限ること。ラジオボタンに非対応で、値の入っていないキーと値の組を確実には読めないこと | Google Cloud: Form Parser | 2026-10-29 |
Form Parser の対応言語に日本語(ja)があり手書きに対応と示されていること。オンラインの処理が15ページまでであること。対応地域に日本が無いこと(asia-south1、asia-southeast1、australia-southeast1、eu、europe-west2、europe-west3、northamerica-northeast1、us) | Google Cloud: Processor list | 2026-10-29 |
| キーと値の組のキーが文書の上のキーの文字そのままであること。formFields の fieldName と fieldValue、チェック欄の値の種類が filled_checkbox/unfilled_checkbox であること。位置が boundingPoly で返ること | Google Cloud: Handle the processing response | 2026-10-29 |
| オンラインの処理のファイルが40MBまで、画像の解像度が40メガピクセルまでであること | Google Cloud: Document AI limits | 2026-10-29 |
| 時間主導型のトリガーが毎分から月1回までの間隔で動かせ、動く時刻が少しずれることがあること | Google Apps Script: Installable triggers | 2026-10-29 |
| 1回の実行が6分まで、トリガーの合計の実行時間が1日90分(個人)/6時間(Google Workspace)、URL Fetch が1日20,000回(個人)/100,000回(Google Workspace)、トリガーが1スクリプトにつき1人20個までであること | Google Apps Script: Quotas for Google Services | 2026-10-29 |
構造化出力が output_config.format に json_schema を渡して使えること。object に additionalProperties: false を付けること。minimum・maximum がスキーマとして送れず SDK が説明文へ移すこと。minItems が 0 と 1 だけであること | Claude Docs: Structured outputs | 2026-10-29 |
アレルギーの申し出に対応できるかは、工房の責任者が原材料と作り方を見て決めてください。 本記事は公開されている製品の仕様と資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2241)についてのご相談はこちらから。
