自動販売機のルート担当が手書きする補充・回収の記録票を読み取り、機械ごとの補充数と売切れを集計表に転記して、売切れの続くコラムを拾う
ルート担当が機械を回るたびに手書きする補充・回収の記録票を撮影して読み取り、コラムごとの補充本数と売切れの印を集計表に転記します。容量を超える数や書き漏れを拾い、売切れの続くコラムを一覧にします。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/小売
- 対象部門
- 物流
- 対象業務
- データ入力・転記/集計・分析
- 主な課題
- 入力作業が多い/判断に時間がかかる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- ルート担当が、機械を開けてコラムごとに残りを見て補充し、記録票に補充本数を書く。空になっていたコラムには売切れの印を付ける
- 期限の近い商品を抜いて回収本数を書き、回収した金額と釣銭の補充を書く
- 営業所に戻ったら、記録票の束を事務の担当に渡す
- 事務の担当が、記録票を1枚ずつ見て、集計表の機械のシートにコラムごとの補充本数と売切れを打ち込む
- 容量より多い数や、読みにくい数字があれば、ルート担当に聞く
- 月末に、売切れの多いコラムと機械を集計し、営業所の責任者に渡す
- 責任者が、商品の割り当てや訪問の間隔を見直す
- 人前日に、事務の担当が翌日のルートの機械ごとに、機械の番号とコラムごとの商品名・容量を印刷した記録票を作る
- 人ルート担当が、いまと同じく記録票に補充本数と売切れの印を書く
- 人機械ごとに、書き終えた記録票をスマートフォンで撮って、共有のフォルダへ保存する
- 自動10分ごとに動く処理が新しい画像を見つけ、OCRが表とチェックボックスと上の欄と信頼度を返す
- 自動生成AIが、表の列を項目に対応づけ、メモの欄を「故障」「汚れ」「設置先の要望」「その他」に分ける
- 自動補充本数が容量を超えていないか、空欄が無いか、売切れの印と補充本数が食い違っていないかを決まりで確かめる
- 自動集計表に、確認の要る欄の無い記録票の値を書き込む。確認の要る記録票は確認待ちの一覧に入れる
- 人事務の担当が、確認待ちの一覧の欄だけを画像と並べて直す。ルート担当がまだ外にいれば、その場で聞く
- 自動毎朝、直近の訪問で売切れが続くコラムの一覧を作る
- 人営業所の責任者が、一覧を見て商品の割り当てや訪問の間隔を見直す
各工程の詳しい説明を読む
- ルート担当が、機械を開けてコラムごとに残りを見て補充し、記録票に補充本数を書く。空になっていたコラムには売切れの印を付ける
- 期限の近い商品を抜いて回収本数を書き、回収した金額と釣銭の補充を書く
- 営業所に戻ったら、記録票の束を事務の担当に渡す
- 事務の担当が、記録票を1枚ずつ見て、集計表の機械のシートにコラムごとの補充本数と売切れを打ち込む
- 容量より多い数や、読みにくい数字があれば、ルート担当に聞く
- 月末に、売切れの多いコラムと機械を集計し、営業所の責任者に渡す
- 責任者が、商品の割り当てや訪問の間隔を見直す
(a)打ち直しが毎日数十枚になる。 3名が1日25台ずつ回るので、毎日75枚です。ルート担当が戻る夕方から打ち始め、終わるのは翌日の昼になることがあります。
(b)数字の書き間違いに気づけない。 「1」と「7」、「4」と「9」は、急いで書くと形が似ます。容量が24本のコラムに「27」と打ち込んでも、集計表は何も言いません。 気づくのは、月末の集計で補充本数が販売の実績より多すぎるときです。
(c)空欄を0として打ってしまう。 補充の要らなかったコラムに「0」を書く人と、何も書かない人がいます。打ち直す側は、空欄を見るたびに0と打ちます。 実際には見ていなかったコラムが、補充の要らなかったコラムとして記録に残ります。
(d)売切れの続くコラムに気づくのが月末になる。 毎回売切れになるコラムは、訪問までの間に売る機会を逃しています。月末の集計まで待つと、その間の売切れはそのまま続きます。
- 【人】 前日に、事務の担当が翌日のルートの機械ごとに、機械の番号とコラムごとの商品名・容量を印刷した記録票を作る
- 【人】 ルート担当が、いまと同じく記録票に補充本数と売切れの印を書く
- 【人】 機械ごとに、書き終えた記録票をスマートフォンで撮って、共有のフォルダへ保存する
- 【自動】 10分ごとに動く処理が新しい画像を見つけ、OCRが表とチェックボックスと上の欄と信頼度を返す
- 【自動】 生成AIが、表の列を項目に対応づけ、メモの欄を「故障」「汚れ」「設置先の要望」「その他」に分ける
- 【自動】 補充本数が容量を超えていないか、空欄が無いか、売切れの印と補充本数が食い違っていないかを決まりで確かめる
- 【自動】 集計表に、確認の要る欄の無い記録票の値を書き込む。確認の要る記録票は確認待ちの一覧に入れる
- 【人】 事務の担当が、確認待ちの一覧の欄だけを画像と並べて直す。ルート担当がまだ外にいれば、その場で聞く
- 【自動】 毎朝、直近の訪問で売切れが続くコラムの一覧を作る
- 【人】 営業所の責任者が、一覧を見て商品の割り当てや訪問の間隔を見直す
3番目で機械ごとに撮るのが、この設計の要点です。 1日分をまとめて撮ると、確認の要る欄に気づくのが夕方になります。機械の前にいるうちに撮れば、次の機械へ移る前後に問い合わせが届きます。
7番目で、確認の要る欄の無い記録票は人を通さずに書き込みます。 本記事の人間の確認が「条件付き」なのは、このためです。
02今回想定するシステム構成
補充・回収の記録票(機械番号・商品名・容量は印刷、数字と印は手書き) │ 機械ごとにスマートフォンで撮影 → 共有フォルダ ▼【トリガー】10分ごとの時間主導のトリガー Google Apps Script ── 新しい画像を探す ▼ Google Document AI(Form Parser) │ 表(コラムごとの行)、チェックボックス、上の欄、信頼度 ▼ Claude API(構造化出力)── 列の対応づけ、メモの分類 ▼ Google Apps Script ── 容量・空欄・売切れの印の照合 ▼ 集計表(機械×コラム×訪問日)、確認待ちの一覧、売切れの続くコラムの一覧 ▼ 【事務の担当が確認待ちだけ直す】→【責任者が割り当てを見直す】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(列の対応づけ、メモの分類) | OpenAI API、Gemini API |
| 連携 | Google Apps Script(フォルダの確認、API の呼び出し、集計表の更新) | Python |
| 差異計算 | Google Apps Script(容量・空欄・売切れの照合) | Python |
| 保管 | Google ドライブ(記録票の画像と読み取りの結果) | 社内のファイルサーバー |
回収金額は読み取りますが、売上との照合はしません。 記録票の金額は、集計表の別の列に写すだけにします。現金の照合は経理の手順で、電子マネーの売上や釣銭の出し入れも絡むため、この構成の外に置きます。
土台は Document AI の Form Parser です。 公式の説明では、Form Parser はキーと値のペア、表、チェックボックス、汎用のエンティティを OCR のテキストに加えて抽出するとされ、プロセッサの一覧の言語表では、日本語(ja)が手書きに対応する言語として示されています。記録票のコラムの行は表として、売切れの印はチェックボックスとして、上の欄はキーと値のペアとして読みます。
処理する場所に日本のリージョンはありません。 プロセッサの一覧では、Form Parser の対応リージョンは us・eu のほか、asia-southeast1(シンガポール)などです。記録票にあるのは機械の番号と設置先の名前と数字で、個人の情報はほとんど含みませんが、設置先の一覧は営業の情報です。 国外で処理されることを社内の決まりに照らして確かめます。
Form Parser は学習済みで追加の学習はできず、表は行や列をまたぐセルの無いものが対象とされています。 記録票の表は、見出しを1段にし、コラムの番号ごとの単純な行にします。
03どうやって実装するのか
処理の起点を決める
Google Apps Script の時間主導のトリガーで、10分ごとに共有フォルダを見に行きます。 公式の説明では、インストール型のトリガーで使えるのは、開いたとき・編集・変更・フォームの送信・カレンダーの予定と、時間主導のトリガーで、Google ドライブにファイルが作られたことをきっかけにするトリガーは挙げられていません。 そこで、時間で起動してフォルダの新しいファイルを探す形にします。
公式の説明では、時間主導のトリガーは毎分から月1回までの間隔で動かせ、時刻は少しずらされることがあるとされています。10分ごとなら、機械の前で撮った記録票の確認待ちが、次の機械の作業中に届きます。
インストール型のトリガーは、作った人のアカウントで動くとされています。担当者の異動で止まらないよう、営業所の共有の業務用アカウントで作ります。処理が終わった画像は処理済みのフォルダへ移し、移すのは成功したときだけにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 記録票の画像 | 機械1台・1回の訪問の1枚、撮影の日時、撮った人 | ルート担当のスマートフォン |
| 読み取りの結果 | テキスト、表(コラムごとの行)、チェックボックス、上の欄、信頼度 | Google Document AI |
| 商品の割り当ての表 | 機械ごと・コラムごとの商品名、容量、割り当てを変えた日 | 事務の担当が持つ表 |
| 機械の台帳 | 機械の番号、型、設置先、ルートと曜日 | 表計算の台帳 |
| 前回までの訪問の記録 | 機械ごと・コラムごとの補充本数と売切れの印 | 集計表 |
質を決めるのは、商品の割り当ての表です。 記録票に印刷する商品名と容量の元であり、照合の基準でもあります。割り当てを変えたのに表を直していないと、新しい商品の容量で読むべき欄を、古い容量で確かめることになります。 割り当てを変えた日を必ず持ち、訪問日と照らします。
データの取得方法を決める
読み取りは、Apps Script から Form Parser のプロセッサの API を呼び、画像を渡すだけです。返ってくる Document から、表とチェックボックスと上の欄と信頼度を取り出します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 全テキスト | text | ほかの欄が startIndex・endIndex で指す原文 |
| 上の欄 | pages[].formFields(fieldName と fieldValue) | 機械の番号、訪問日、時刻、回収金額 |
| コラムの行 | pages[].tables(headerRows と bodyRows) | コラムの番号、補充本数、回収本数 |
| 売切れの印 | fieldValue の valueType(filled_checkbox/unfilled_checkbox) | コラムごとの売切れ |
| 信頼度 | 各要素の layout の信頼度 | 確認の要る欄の印 |
公式の説明では、text が認識されたテキストの唯一の元で、ほかの欄は startIndex と endIndex でその位置を指すとされています。チェックボックスはキーと値のペアとして返り、印の付いたものは filled_checkbox、付いていないものは unfilled_checkbox になるとされています。売切れの印を数字の欄と別の値で受けられるので、「0」と「印」を取り違えません。
チェックボックスとコラムの番号の対応は、位置で決めます。 公式の説明では、検出されたチェックボックスに対応するキーが無いこともあるとされています。記録票では、四角のすぐ左にコラムの番号を印刷しておき、キーが無いときは、四角の位置が表のどの行の高さにあるかで対応づけます。
Apps Script の割り当ての上限にも気を配ります。公式の説明では、1回の実行の時間は6分まで、URL Fetch の呼び出しは Google Workspace のアカウントで1日100,000回までとされています。1回の起動で処理する画像の数を決め、残りは次の起動に回します。
AIへ渡す前に整形する
- 画像の向きと傾き … スマートフォンで斜めに撮った画像を、紙の四隅で補正します
- 解像度 … 公式の説明では、スキャンは最低200dpi、300dpi以上で一般に最良の結果とされています。撮影の大きさはこれに相当するようにします
- ファイルの形式と大きさ … JPEG で保存し、オンラインの処理の要求の上限の40MBと、画像の40メガピクセルの上限に収めます
- 機械の番号の確認 … 上の欄の機械の番号を、その日のルートの機械の一覧と照らします
- 重複の検知 … 同じ機械・同じ訪問日で二度撮ったものは、新しいほうだけを使います
- 割り当ての版の決定 … 訪問日の時点の商品の割り当てと容量を、表から引いておきます
4番目で一致しないときは、それより先に進めません。 隣の機械の記録票を取り違えて書いたまま集計表に入れると、2台分の記録が同時に誤ります。
6番目を前処理に置くのは、照合の段で迷わないためです。 割り当ての表は、季節の商品の入れ替えで月に何度か変わります。変更日の当日に回った機械では、記録票に印刷された商品名と表の最新の商品名が食い違います。 印刷したのは前日なので、記録票のほうが古い版です。訪問日と変更日を比べ、印刷に使った版を記録票ごとに決めてから照合に渡します。版が1つに決まらないときは、記録票ごと確認待ちに入れます。
AIに処理させる
生成AIにさせるのは2つだけです。 表の列を項目に対応づけることと、メモの欄を分類することです。数字の確かめはすべて Apps Script の決まりで行います。
| 見るもの | させること | 判断できないときの扱い |
|---|---|---|
| 表の列 | 各列がコラムの番号・補充本数・回収本数のどれかを決める | 決められない列は unknown |
| 行の値 | セルの文字をそのまま写す | 読めない文字は空にし、unreadable |
| メモの欄 | 「故障」「汚れ」「設置先の要望」「その他」に分け、原文も写す | 分けられなければ other |
記録票の様式が決まっているのに列の対応づけを生成AIにさせるのは、表が途中で切れることがあるからです。 30コラムを2段に分けた様式や、撮影で端が欠けた画像では、Form Parser が表を2つに分けて返すことがあり、どちらがどの列かを見出しの文字から決め直す必要があります。
| させないこと | 理由 |
|---|---|
| 空欄を0にする | 見ていないのか書き忘れかが消える |
| 読めない数字を容量や前回の値で補う | 書き間違いが消える |
| 売切れの印の有無の判断 | チェックボックスの値で決まる |
| 商品の割り当ての提案 | 売れ行き・設置先・仕入れで決まる。責任者が決める |
| 回収金額と補充本数からの売上の計算 | 経理の手順で行う |
1行目がいちばん起きやすい失敗です。 生成AIに表を写させると、空いている欄に0を入れて表を整えようとします。(c)と同じことが、自動で起きます。
指示内容を固定する
あなたは自動販売機の運営会社の営業所で、補充・回収の記録票の読み取り結果を
表の形にそろえる係です。
OCRが返した表と上の欄だけを見てください。推測で埋めないでください。
【項目】
column_no(コラムの番号)、refill(補充本数)、expired(期限の近い商品の回収本数)
【厳守事項】
- 各列がどの項目に当たるかを column_map に書いてください。
決められない列は unknown にしてください。
- 表が2つに分かれている場合は、見出しの文字で対応づけ、
どちらの表の何列目かを source に書いてください。
- 行ごとに、セルの文字をそのまま写してください。
- 空いているセルは空のまま写してください。0を入れないでください。
空いている理由を書かないでください。
- 読めない数字は空にし、unreadable_cells に入れてください。
前回の値、容量、ありそうな値で埋めないでください。
- 売切れの印は判断しないでください(別の仕組みで読みます)。
- メモの欄は原文を memo_text に写し、
breakdown(故障)、dirty(汚れ)、request(設置先の要望)、other のどれかに分けてください。
- 売上や金額の計算をしないでください。
【OCRの表】{tables}
【上の欄】{form_fields}
「0を入れない」と「空いている理由を書かない」を並べているのは、どちらか一方だけでは足りないからです。 0を禁じると、「補充不要のため空欄」と理由を書き添えます。理由はルート担当にしか分からないので、空欄のまま確認待ちに回します。
売切れの印を生成AIに判断させないのは、チェックボックスの値で決まるからです。 二重に判断させると、どちらを信じるかという新しい問題が生まれます。
出力形式を固定する
次の形のJSONで受け取ります。
{
"image_id": "",
"header": {
"machine_no": "",
"visit_date": "",
"visit_time": "",
"staff": "",
"cash_collected_raw": ""
},
"column_map": [
{ "source": "table0", "column_index": 0, "field": "column_no | refill | expired | unknown" }
],
"rows": [
{ "column_no": "", "refill": "", "expired": "" }
],
"memo": { "memo_text": "", "memo_type": "breakdown | dirty | request | other | none" },
"unreadable_cells": [ { "column_no": "", "field": "" } ]
}
数字の欄を文字列で受けるのは、空欄と0を区別するためです。 数値の型で受けると、空欄が0か null のどちらかに丸められ、どちらになったかが後で分かりません。文字のまま受け、Apps Script で「空」「0」「数字」「数字でない」の4つに分けます。
Claude の構造化出力は、output_config.format に type: "json_schema" で JSON スキーマを渡して有効にし、オブジェクトには additionalProperties: false が必要とされています。 数値の minimum・maximum は対応していないとされているので、容量の確認はスキーマではなく Apps Script で行います。
後段の照合は、この出力とチェックボックスの値に対して決まりで行います。
| 照合 | 外れたとき |
|---|---|
| 機械の番号がその日のルートにある | 記録票ごと止め、取り違えを確かめる |
| すべてのコラムの補充本数が空でない | 「空欄」。ルート担当に、見たかを聞く |
| 補充本数が数字で、容量以下 | 「容量超え」。書き間違いを画像で確かめる |
| 売切れの印があるコラムの補充本数が、容量と同じ | 「印と本数の食い違い」。補充しきれなかったかを聞く |
| 売切れの印が無いコラムの補充本数が、容量と同じ | 「売切れの印の付け忘れの候補」 |
| 読み取りの信頼度が基準を下回る欄がない | 欄に印を付ける |
4行目と5行目は、売切れの印と補充本数を互いに確かめる決まりです。 空になったコラムに満杯まで入れれば、補充本数は容量と同じになります。印があって本数が少なければ、トラックの在庫が足りず補充しきれなかったか、どちらかの書き間違いです。 印が無くて本数が容量と同じなら、印の付け忘れの可能性があります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有フォルダ | Apps Script の時間主導のトリガー | 新しい画像を10分ごとに探す |
| Google Document AI | API呼び出し | 表・チェックボックス・上の欄・信頼度を返す |
| Claude API | API呼び出し | 列の対応づけ、メモの分類 |
| 商品の割り当ての表・機械の台帳 | スプレッドシートの読み取り | 容量、ルート、割り当ての版 |
| 集計表 | スプレッドシートへの書き込み | 照合を通った記録票の値 |
| 確認待ちの一覧 | スプレッドシートの別のシート | 印の付いた欄と画像へのリンク |
集計表へ自動で書き込むのは、照合で印が1つも付かなかった記録票だけです。 印の付いた記録票は、確認待ちの一覧で人が直してから書き込みます。商品の割り当ての表には書き込みません。 割り当てを変えるのは責任者で、表を直すのも人です。
メモの欄で「故障」に分けられたものは、確認待ちとは別に保守の担当へ回す一覧に入れます。 補充の数字とは急ぎ方が違うからです。
人が確認する
人が見るのは、確認待ちの一覧に入った記録票の、印の付いた欄だけです。
- 取り違えを先に見る … 機械の番号がルートに無い記録票は、ほかの照合の前に止めます
- 空欄を確かめる … ルート担当に、そのコラムを見たかを聞きます。見て補充が要らなかったなら0、見ていなければ「未確認」と記録します
- 容量超えを確かめる … 画像と並べて書き間違いを直します
- 印と本数の食い違いを確かめる … 補充しきれなかったのか、書き間違いかを聞き、補充しきれなかったなら次の訪問の申し送りに書きます
- 売切れの続くコラムを責任者が見る … 毎朝の一覧で、割り当てや訪問の間隔を見直すかを決めます
2番目で「未確認」と0を分けて記録するのが、(c)への答えです。 0として集計すると、そのコラムは売れていないように見え、割り当ての見直しの判断を誤らせます。
目標は、1,500件をならして1件0.6分です。 印の無い記録票は一覧で件数を見るだけ、印の付いた記録票は画像を開いて直すので1〜2分かかります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 雨や手の汚れで数字がにじむ | unreadable。ルート担当に聞く |
| 撮影で表の端が切れる | 足りないコラムを「空欄」として印。撮り直しを頼む |
| 印刷済みの記録票を使わず白紙に書いた | 商品名と容量が無い。割り当ての表で補えるかを人が見る |
| 機械が故障で補充できなかった | メモの「故障」で分け、補充本数の空欄の確認から外す |
| 設置先が休みで訪問できなかった | 記録票が来ない。ルートの一覧で未訪問として印 |
| 割り当ての変更の当日 | 訪問日の時点の版で照らす。版が決まらなければ人へ |
| Document AI が応答しない | フォルダに残し、次の起動で再び処理する |
| 1回の起動で処理しきれない | 残りを次の起動に回す |
4行目を先に作っておくと、確認待ちが減ります。 故障の機械の記録票は全コラムが空欄になり、それがすべて「空欄」の印として並ぶと、本当の書き忘れが埋もれます。
記録を残す
- 記録票の画像と、撮影の日時・撮った人
- OCR が返した
Documentの全文(text、formFields、tables、チェックボックス、信頼度) - 生成AIの出力(列の対応づけ、写した値、メモの分類)
- 照合の結果と、そのとき使った商品の割り当ての版
- 人が直した記録 … どの機械の、どのコラムの、どの欄を、何から何に直したか
- 「未確認」と記録したコラム … 担当者と機械ごとの件数
割り当ての版を残すのは、割り当てが後から変わるためです。 容量の違う商品に入れ替えたあとで過去の「容量超え」を見直すと、当時の容量が分からなければ、誤りだったかどうかが決まりません。
「未確認」の件数は、ルートの組み方を見直す材料になります。 特定の機械や時間帯で多いなら、作業時間が足りていない可能性があります。
売切れの一覧に使った訪問の範囲も残します。 「直近の何回の訪問のうち何回売切れたか」で一覧に載せるので、回数の決まりを変えたときに、過去の一覧と比べられるようにしておきます。
04実装レベルの3段階
半自動化で、1件2分が1.2分程度になります。 読み取りは自動になりますが、一覧を1枚ずつ見て集計表に移し、容量と見比べるのは人です。 本格構成で0.6分になり、この段階が本記事の想定です。 差が大きいのは、印の付かない記録票を人が開かなくなるからです。 段階を飛ばさないでください。 半自動化の1か月で、どの数字が読み違えやすいか、どの担当者の空欄が多いかが見えます。印刷済みの記録票の様式を、その結果で直してから本格構成に進みます。
05工数削減シミュレーション
導入後 1,500件 × 0.6分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 数百台の自動販売機を数名のルート担当で回し、訪問のたびに紙の記録票に補充本数や売切れを手書きして、営業所の事務の担当が夕方に表計算へ打ち直している運営会社。売切れの続くコラムや、訪問の間隔が合っていない機械に気づくのが月末の集計まで遅れている場合。Google Workspace を使っている場合。
- 機械の販売の記録を通信で集める仕組みが入っていて、補充の数も端末で入力している会社。台数が数十台で、打ち直しが短時間で終わる場合。なお、商品の割り当ての変更、訪問の間隔の決定、回収金額と売上の照合と経理の処理は、この構成では代替できません。
07最小構成で試す方法
- 先月の記録票から30枚を選ぶ(空欄のあるもの、数字のにじんだもの、売切れの印の多いものを入れる)
- その30枚について、集計表に打ち込まれた値を書き出しておく
- 記録票の画像を、手元の生成AIの画面に1枚ずつ貼る
- 「この記録票の表を、コラムの番号・補充本数・売切れの印・回収本数の表にしてください。空いている欄は空のままにし、0を入れないでください。読めない数字は空にしてください。推測で埋めないでください」と指示する
- 出てきた表を、打ち込まれた値と1欄ずつ比べる
30枚で、およそ900のコラムになります。 Form Parser と Apps Script を組む前に、手書きの数字と印がどこまで読めるのかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 打ち込まれた値とほぼ同じ表が出た | OCR の API と照合の処理に進む |
| 空欄に0を入れた | 指示と、後段の照合で止められる。構成は有効 |
| 売切れの印を読み落とした | 印の四角の大きさと位置を見直す |
| 読めない数字が多い | 記録票の欄の大きさと筆記具が先。 AIの問題ではない |
2行目が出たら、打ち込まれた値のほうも見てください。 空欄が0として打ち込まれているなら、それが(c)の実例です。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 空欄を0として扱う | 文字列で受け、空と0を分ける。 生成AIにも0を入れさせない |
| 「1」と「7」、「4」と「9」を読み違える | 容量との照合で拾う。欄を大きくとる |
| 売切れの印とコラムの対応がずれる | 四角の左にコラムの番号を印刷し、位置で対応づける |
| 表が2つに分かれて返る | 見出しの文字で列を対応づけ直す |
| 割り当ての変更の前の容量で照らす | 割り当ての表に変更日を持たせ、訪問日の版で照らす |
| 故障の機械で空欄の印が大量に出る | メモの「故障」で空欄の確認から外す |
| ドライブのファイル作成で起動しようとする | その種類のトリガーは無い。 時間主導で探す |
| トリガーを作った人の異動で止まる | 共有の業務用アカウントで作る |
| 1回の実行の6分で終わらない | 1回の件数を決め、残りを次に回す |
| 国外で処理されることを確かめていない | 日本のリージョンは無い。 社内の決まりに照らす |
上の2行が、この構成でいちばん重い失敗です。 どちらも、書かれていない値や書き間違えた値が、正しい値として集計表に入る経路です。
7行目から9行目は、Apps Script で組むときに固有の失敗です。 どれも動き始めてから気づくので、最初に決めておきます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 機械の番号と設置先、コラムごとの補充本数・売切れ・回収本数、回収金額、記入した担当者の名前です。個人の情報は担当者の名前程度ですが、設置先の一覧と売れ行きは営業の情報です。
- 処理の場所を確かめる … Form Parser の対応リージョンに日本はありません。
us・euかシンガポールなどから選びます。設置先と売れ行きが国外で処理されることを、社内の決まりに照らします - 生成AIに渡す範囲を絞る … 生成AIには表とメモだけを渡し、機械の台帳や設置先の一覧は渡しません。照合は Apps Script の側で行います
- 判断を代替しない … 商品の割り当て、訪問の間隔は責任者が決めます。構成が出すのは、売切れが続いたという事実までです
- 現金の扱いを自動にしない … 回収金額は写すだけで、売上との照合や経理の処理は人と経理の仕組みで行います
- 担当者の評価に使わない … 「未確認」や書き間違いの件数は、ルートの組み方や様式を直す材料です。担当者ごとの件数を、そのまま評価に使わないでください
誤りが起きた場合のリスクは、空欄や書き間違いが正しい値として集計表に入ることと、売切れの続くコラムを見落とすことの2つです。前者は文字列で受けた照合で、後者は毎朝の一覧で防ぎます。
10まず何から始めるか
1週目:商品の割り当ての表を整える
機械ごと・コラムごとの商品名、容量、割り当てを変えた日の列をそろえます。ここが照合の基準になるので、最初に整えます。
2週目:30枚で試す
先月の記録票から30枚を選び、最小構成で表にさせて、打ち込まれた値と比べます。空欄に0を入れていないか、売切れの印を読み落としていないかを最優先で見ます。
3週目:記録票の様式を決める
機械の番号・商品名・容量を印刷し、数字の欄と印の四角を大きくとった様式を作ります。空欄にせず「0」と書く決まりを、ルート担当と決めます。
4週目:Apps Script から一覧までをつなぐ
共有フォルダを10分ごとに見て Form Parser を呼び、コラムごとの値を一覧に書き出すところまで作ります。この時点では集計表に書き込まず、読み取りの結果だけを見ます。
2か月目: 容量・空欄・売切れの照合と、確認待ちの一覧を足し、印の無い記録票を集計表に書き込む運用にします。3か月目以降: 売切れの続くコラムの一覧を毎朝出し、1件2分が何分になったかを実測します。夕方の打ち直しがなくなり、責任者が毎朝売切れの続くコラムを見て割り当てを直せるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser がキーと値のペア、表、チェックボックス、汎用のエンティティを抽出すること。言語の一覧で日本語(ja)が手書きに対応する言語として示されていること(原文の HTML で確認)。対応リージョンが us・eu・asia-southeast1 などで日本のリージョンが無いこと | Google Cloud: Processor list | 2026-10-15 |
| Form Parser が学習済みで追加の学習ができないこと。行や列をまたぐセルの無い表を抽出すること。チェックボックスがキーと値のペアとして抽出され、検出されたチェックボックスに対応するキーが無いこともあること | Google Cloud: Form Parser | 2026-10-15 |
text が認識されたテキストの唯一の元で、ほかの欄が startIndex・endIndex で指すこと。formFields が fieldName と fieldValue を持つこと。チェックボックスの valueType が filled_checkbox/unfilled_checkbox になること。表が headerRows と bodyRows に分かれること | Google Cloud: Handle the processing response | 2026-10-15 |
| 対応するファイルの形式(JPEG、PNG など)。スキャンは最低200dpi、300dpi以上で一般に最良の結果とされること | Google Cloud: Supported files | 2026-10-15 |
| オンラインの処理の要求のファイルの大きさの上限が40MB、画像の解像度の上限が40メガピクセルであること | Google Cloud: Document AI limits | 2026-10-15 |
構造化出力が output_config.format に type: "json_schema" で JSON スキーマを渡して有効になること。オブジェクトに additionalProperties: false が必要なこと。数値の minimum・maximum が非対応であること | Claude Docs: Structured outputs | 2026-10-15 |
| インストール型のトリガーの種類(開いたとき・編集・変更・フォームの送信・カレンダーの予定・時間主導)。時間主導のトリガーが毎分から月1回まで動かせ、時刻が少しずらされることがあること。インストール型のトリガーが作った人のアカウントで動くこと | Apps Script: Installable triggers | 2026-10-15 |
| 1回の実行の時間が6分まで、URL Fetch の呼び出しが Google Workspace で1日100,000回までであること(予告なく変わりうるとされていること) | Apps Script: Quotas for Google Services | 2026-10-15 |
商品の割り当て、訪問の間隔、現金の照合と経理の処理は、営業所の責任者と経理の担当者が判断してください。 本記事は、上記の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1707)についてのご相談はこちらから。
