飲食店の店舗で手書きされるレジ締めの報告書を読み取り、本部の売上日報に転記して、POSの実績との差と過不足の多い店舗を拾う
閉店後に店長が手書きするレジ締めの報告書を読み取り、本部の売上日報に転記します。あわせて、POSの実績との差と、現金の過不足が続いている店舗を拾います。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 小売/飲食
- 対象部門
- 経理
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 朝、40店舗分のフォルダを開き、前日の報告書の写真が届いているかを確かめる
- 届いていない店舗に電話かチャットで催促する
- 1枚ずつ写真を開き、総売上・支払方法別の額・過不足を売上日報に打ち込む
- POSの日次の実績と、総売上と支払方法別の額を見比べる
- 合わないものは、店長にチャットで聞く
- 過不足が書かれている店舗は、過不足の一覧に写す
- 月末に、過不足の一覧から店舗ごとの回数と額を集計する
- 人店長が閉店後に報告書を手書きし、タブレットで撮影して店舗のフォルダに保存する
- 自動Apps Script が夜間と早朝に店舗のフォルダを見て、新しい写真を拾う
- 自動Document AI が報告書を読み、項目名と値の組・金種の表・チェックボックス・信頼度を返す
- 自動Gemini API が、店舗・日付・総売上・支払方法別の額・釣銭準備金・金種ごとの枚数・実在高・過不足を決まった形にそろえる
- 自動Apps Script が報告書の中の和と差を検算し、POSの日次の実績と比べる
- 自動売上日報の下書きの行と、照合結果のシートに書き込む
- 自動朝の決まった時刻に、報告書が届いていない店舗と、過不足が続いている店舗の一覧を作る
- 人経理の担当が `match` 以外の行だけを開き、写真で確かめるか、店長に聞くかを決める
- 人確かめ終えた行を、売上日報の確定の列に移す
各工程の詳しい説明を読む
- 朝、40店舗分のフォルダを開き、前日の報告書の写真が届いているかを確かめる
- 届いていない店舗に電話かチャットで催促する
- 1枚ずつ写真を開き、総売上・支払方法別の額・過不足を売上日報に打ち込む
- POSの日次の実績と、総売上と支払方法別の額を見比べる
- 合わないものは、店長にチャットで聞く
- 過不足が書かれている店舗は、過不足の一覧に写す
- 月末に、過不足の一覧から店舗ごとの回数と額を集計する
(a)毎朝40枚を打ち込んでいる。 3番は1枚あたり数分ですが、40枚を毎朝続けると午前中の大半がこの作業で埋まります。 店舗が増えるたびに、そのまま時間が増えます。
(b)手書きの数字の読み違い。 「1」と「7」、「0」と「6」、桁の区切りの位置。写真が斜めだったり暗かったりすると、打ち込む側が読み違えます。 POSと合わないとき、それが店舗の誤りか本部の打ち込みの誤りかを確かめるのに、さらに時間を使います。
(c)報告書の中の計算を確かめていない。 支払方法別の額の和が総売上と合うか、過不足が正しく計算されているかを、打ち込む側は見ていません。 店長の計算違いで過不足が「0」と書かれていても、そのまま日報に入ります。
(d)過不足の傾向が月末まで分からない。 7番の集計は月に一度で、同じ店舗で同じ曜日に不足が続いていても、気づくのは翌月です。
- 【人】 店長が閉店後に報告書を手書きし、タブレットで撮影して店舗のフォルダに保存する
- 【自動】 Apps Script が夜間と早朝に店舗のフォルダを見て、新しい写真を拾う
- 【自動】 Document AI が報告書を読み、項目名と値の組・金種の表・チェックボックス・信頼度を返す
- 【自動】 Gemini API が、店舗・日付・総売上・支払方法別の額・釣銭準備金・金種ごとの枚数・実在高・過不足を決まった形にそろえる
- 【自動】 Apps Script が報告書の中の和と差を検算し、POSの日次の実績と比べる
- 【自動】 売上日報の下書きの行と、照合結果のシートに書き込む
- 【自動】 朝の決まった時刻に、報告書が届いていない店舗と、過不足が続いている店舗の一覧を作る
- 【人】 経理の担当が
match以外の行だけを開き、写真で確かめるか、店長に聞くかを決める - 【人】 確かめ終えた行を、売上日報の確定の列に移す
8番目が、この設計の分かれ目です。人が見るのは全件ではありません。 POSと合い、報告書の中の計算も合っているものは件数を流し見て終わりにし、合わないもの、読み取りに自信のないもの、届いていないものだけに時間を使います。
9番目で売上日報の確定を自動にしないのも、意図してのことです。 読み違えた数字が確定すると、会計への売上の計上と、店舗の過不足の記録の両方がずれます。
02今回想定するシステム構成
レジ締めの報告書(手書き、店舗のタブレットで撮影) │ 店舗のフォルダ(共有ドライブ)へ保存 ▼【トリガー】Google Apps Script の時間主導型トリガー(夜間・早朝) Google Apps Script ── 形式・店舗・日付の確認 ▼ Google Document AI(Form Parser) │ 項目名と値の組・金種の表・チェックボックス・信頼度を返す ▼ Gemini API ── 報告書の欄を決まった形にそろえる │ 総売上/支払方法別の額/釣銭準備金/金種ごとの枚数/実在高/過不足 ▼ Google Apps Script ── 報告書の中の検算と、POSの実績との比較 │ match/internal_ng/pos_diff/over_short/needs_review ├──▶ 売上日報の下書きの行 ├──▶ 照合結果のシート └──▶ 未着の店舗と、過不足が続く店舗の一覧 ▼ 【人が match 以外だけ確認】──▶ 売上日報の確定・店舗への問い合わせ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Gemini API(報告書の欄の対応付け) | Claude API、OpenAI API |
| 差異計算 | Google Apps Script(報告書の中の検算、POSとの比較、過不足の集計) | Python |
| 連携 | Google Apps Script(店舗のフォルダの監視、POSの CSV の読み取り、結果の書き込み) | Python |
| 保管 | Google ドライブ(共有ドライブ)、Google スプレッドシート | 既存の文書管理システム |
新しく作るのは、報告書の用紙の新しい版です。 欄の並びは今の用紙のまま、1つの欄に1つの数字、金種の表は結合のない升目、確認の印は □ に作り直します。読み取りの質を上げるいちばん安い方法です。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCRのテキストに加えて、キーと値のペア(エンティティとチェックボックス)、表、一般的なエンティティを抽出するとされ、200を超える言語に対応します。言語の一覧には日本語(ja)があり、手書きにも対応する言語として示されています。 ページの上限は同期処理で15ページ、バッチ処理で100ページです。
Form Parser は事前学習済みで、追加で学習させることはできないとされています。用紙を読ませて覚えさせるのではなく、どの用紙でも項目名と値の組を返す仕組みです。公式には、ラテン文字以外の言語ではキーと値の読み取りの質が下がることがあるとも書かれています。キーと値の組だけに頼らず、全文のテキストもあわせて Gemini API に渡します。
表の読み取りには限りがあります。 Form Parser の表の抽出は、行や列をまたぐセルのない単純な表が対象とされています。今の用紙の金種の表は「紙幣」「硬貨」の見出しが2行にまたがっているので、新しい版では見出しを1行にします。
03どうやって実装するのか
処理の起点を決める
Google Apps Script の時間主導型トリガーで、夜間と早朝に店舗のフォルダを見ます。 時間主導型のトリガーは、毎分から月1回までの間隔で動かせるとされています。閉店の時刻は店舗で違うため、深夜から朝まで30分おきに見て、届いたものから処理します。
朝の決まった時刻に、別のトリガーで未着の一覧を作ります。 POSの日次の CSV が置かれた後、前日の報告書が届いていない店舗を拾います。経理の担当が出社したときには、催促の対象がそろっています。
1回の実行で処理する件数に上限を置きます。 Apps Script の1回の実行は6分までとされています。1回に8件までとし、残りは次の実行に回します。 処理済みの印は、照合結果のシートへの書き込みまで成功したときだけに付けます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 報告書の写真 | JPEG または PDF。店舗のフォルダ、撮影の日時 | 共有ドライブの店舗のフォルダ |
| 読み取り結果 | 項目名と値の組、金種の表、チェックボックス、全文のテキスト、項目ごとの信頼度 | Document AI(Form Parser) |
| POSの日次の実績 | 店舗、営業日、総売上、支払方法別の額、返品・取消の額 | POSから毎朝出力する CSV |
| 店舗マスタ | 店舗コード、店舗名、フォルダの場所、釣銭準備金の決まった額、営業日の区切りの時刻 | 自社で用意する一覧 |
| 用紙の版のメモ | 版ごとの欄の名前と並び | 自社で用意する一覧 |
| 過不足の許容の範囲 | 何円までを端数として流すか | 経理の取り決め |
質を決めるのは、店舗マスタの釣銭準備金の額です。 報告書に書かれた釣銭準備金が決まった額と違えば、それだけで過不足の計算がずれます。読み取りの誤りか、店舗が準備金を崩したのかを分けるために、決まった額を持っておきます。
営業日の区切りの時刻も要ります。 深夜まで営業する店舗では、POSの営業日と報告書の日付が1日ずれることがあります。
データの取得方法を決める
読み取りは、Apps Script から Document AI の処理のAPIを呼ぶだけです。ファイルを渡すと、Document という形の応答が返ります。
| 取るもの | 応答のどこから | 何に使うか |
|---|---|---|
| 項目名と値の組 | pages[].formFields[] の fieldName と fieldValue | 店舗名、日付、総売上、支払方法別の額、釣銭準備金、過不足 |
| 金種の表 | pages[].tables[] の headerRows と bodyRows | 金種ごとの枚数と金額 |
| チェックボックス | formFields の fieldValue の valueType | 「過不足の理由を記入済み」「責任者の確認済み」の印 |
| 全文のテキスト | text と、各要素の textAnchor | 表として取れなかった行、過不足の理由の記載 |
| 信頼度 | 各要素の layout の confidence | 手書きの数字の読み取りが確かかの判定 |
手書きの数字は、信頼度とあわせて取ります。 「17,400」と「11,400」の違いは、そのまま過不足の額になります。信頼度の低い金額は、その報告書を needs_review にして人に回します。
POSの CSV は読むだけで足ります。 店舗コードと営業日で行を引きます。店舗のフォルダから店舗を決めるので、報告書に書かれた店舗名は確かめに使うだけです。
AIへ渡す前に整形する
- 形式の確認 … Form Parser の対象は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP です。タブレットの写真が HEIC などで保存される設定なら、JPEG で保存する設定に変えます
- 圧縮の確認 … JPEG のような非可逆の形式は、ファイルを小さくすると精度が落ちることがあるとされています。写真を共有するときに縮小しない設定にします
- 解像度の確認 … 公式には、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよい結果になるとされています。写真では、用紙が画面いっぱいに入るように撮るよう店舗に伝えます
- 向きと傾きの確認 … 横向きや逆さの写真は、画像の縦横から向きを直してから渡します
- 日付の確認 … 撮影の日時と、店舗の営業日の区切りの時刻から、どの営業日の報告書かの候補を決めます
- 重複の検知 … 同じ店舗・同じ営業日の写真が2枚あれば、後のものを採り、前のものに「撮り直し」の印を付けます
2番目を軽く見ないでください。 チャットや共有の機能によっては、写真を送るときに自動で縮小します。縮小された手書きの数字は、「1」と「7」の区別からつぶれます。
AIに処理させる
させるのは、報告書に書かれた数字を、決まった項目に写すことだけです。 計算はさせません。
| 写す項目 | 当たるものの例 | 判断できないときの扱い |
|---|---|---|
| 店舗名・営業日 | 「店舗名」「日付」 | 読めなければ空。店舗はフォルダから決める |
| 総売上 | 「総売上」「本日売上」 | 読めなければ空にして needs_review |
| 支払方法別の額 | 「現金」「クレジット」「電子マネー」「QR」「商品券」 | 空欄なら空。0と書かれていれば0 |
| 釣銭準備金 | 「釣銭準備金」「つり銭」 | 書かれていなければ空。店舗マスタの額で埋めない |
| 金種ごとの枚数 | 「10,000円 ×3枚」 | 枚数だけで金額が無ければ金額は空 |
| 現金の実在高 | 「現金在高」「実在高」 | 書かれていなければ空。金種の和で埋めない |
| 過不足 | 「過不足」「+300」「△500」 | 符号を原文のまま写す。△や▲は原文を残す |
| 過不足の理由・メモ | 余白の書き込み | 原文のまま写す |
右端の列が、この構成でいちばん大事な区別です。 書かれていない項目を、ほかの欄やマスタの値で埋めさせません。特に実在高と過不足は、書かれていなければ空のままにします。
| させないこと | 理由 |
|---|---|
| 和と差の計算・検算 | Apps Script が行う |
| 合計が合うように数字を読み替えること | 読み替えた瞬間に過不足が消える |
| 書かれていない欄の補完 | 金種の和で実在高を埋めると、店長の計算違いが見えなくなる |
| 過不足の符号の解釈 | △・▲・マイナスの使い方は店舗で違う。規則で決める |
| 過不足の原因の推測 | 原因は店長と経理が確かめる |
2行目がいちばん起きやすい失敗です。 現金の実在高の一桁がかすれた報告書を渡すと、AIは過不足が「0」になる数字を選びがちです。その瞬間、本当にあった不足が「一致」にすり替わります。 プロンプトで、ほかの欄から推し量ることを禁じます。
指示内容を固定する
あなたは飲食チェーンの本部の経理で、店舗から届いたレジ締めの報告書を読み、
売上日報に写すための下書きを作る立場です。
OCRが返した読み取り結果だけを見てください。推測で埋めないでください。
【やること】
1. 書類がレジ締めの報告書かを判断してください。
POSのレシート、納品書、シフト表など別の書類なら、
写さずに document_type を other にしてください。
2. 店舗名、営業日、総売上、支払方法別の額(現金、クレジット、電子マネー、
QRコード決済、商品券)、釣銭準備金、現金の実在高、過不足、本部への入金額を写してください。
3. 金種の表を1行ずつ denominations に入れてください。
4. チェックボックスの印と、余白の書き込みを写してください。
【厳守事項】
- 数字は書かれたものをそのまま入れてください。値を変えないでください。
- 計算をしないでください。合計や差が合うかどうかを考えないでください。
- 読みにくい数字を、ほかの欄の数字から推し量って決めないでください。
読みにくい数字は、読めた文字のまま value に入れ、unclear を true にしてください。
- 書かれていない欄は空にしてください。0と書かれているときだけ0にします。
- 現金の実在高が書かれていないときに、金種の表の和で埋めないでください。
- 釣銭準備金が書かれていないときに、決まった額で埋めないでください。
- 過不足の符号は原文の記号のまま sign_text に写してください(+、-、△、▲など)。
- 過不足の原因について書かないでください。
- evidence には、各値の根拠にした文字列をそのまま写してください。
【読み取り結果(キーと値の組、表、チェックボックス、全文)】{ocr_result}
【この用紙の版のメモ】{form_note}
「合計や差が合うかどうかを考えない」を書くのは、AIが自分から合わせにいくからです。 計算を禁じるだけでは、「合計に合うのはこちらの読み方」と考えて数字を選びます。読みにくいときは unclear を立てさせ、決めるのは人にします。
出力形式を固定する
Gemini API の構造化出力で、次の形のJSONに固定して受け取ります。 公式には、Interactions の response_format に JSON スキーマを渡すと、そのスキーマに従う応答を生成させられるとされ、enum で値の候補を限り、required で必須の項目を決められます。
{
"document_type": "cash_closing | other",
"store_name": "",
"business_date": "",
"sales_total": { "value": null, "unclear": false },
"payments": {
"cash": null, "credit": null, "e_money": null, "qr": null, "voucher": null
},
"float": { "value": null, "unclear": false },
"denominations": [{ "face": 10000, "count": null, "amount": null }],
"cash_on_hand": { "value": null, "unclear": false },
"over_short": { "value": null, "sign_text": "", "unclear": false },
"deposit": null,
"checks": { "reason_written": false, "manager_checked": false },
"notes": "",
"evidence": [{ "field": "", "text": "", "confidence": 0 }]
}
1つ目の理由は、AIの仕事と計算の仕事を別の層に置けることです。 JSONはAIが埋め、検算と判定は Apps Script が行います。
| 状態 | 付ける条件(Apps Script が決める) |
|---|---|
match | 報告書の中の和と差が合い、総売上と支払方法別の額がPOSと一致し、過不足が許容の範囲 |
internal_ng | 支払方法別の額の和が総売上と合わない、金種の和が実在高と合わない、書かれた過不足が計算と合わない |
pos_diff | 総売上または支払方法別の額がPOSの実績と違う |
over_short | 報告書の中もPOSとも合うが、過不足が許容の範囲を超える |
needs_review | unclear が1つでもある、金額の信頼度が基準を下回る、釣銭準備金が店舗マスタの額と違う |
2つ目の理由は、internal_ng と pos_diff を分けられることです。 前者は店長の計算か記入の誤り、後者はレジの操作か POS の締めの誤りで、確かめる相手が違います。公式にも、構文として正しいJSONでも値はアプリケーションの側で検証するよう書かれています。
過不足の傾向は、別のシートで集計します。 Apps Script が店舗ごとに直近30日の over_short の回数と額、曜日の偏りを毎朝出し、回数の多い順に並べます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 店舗のフォルダ | Apps Script の時間主導型トリガー | 新しい写真を拾う |
| Document AI | API呼び出し | 項目名と値の組・金種の表・チェックボックス・信頼度を返す |
| Gemini API | API呼び出し(構造化出力) | 報告書の欄の対応付け |
| POSの日次の実績 | CSV の読み取り | 店舗・営業日ごとの総売上と支払方法別の額 |
| 売上日報 | スプレッドシートへの書き込み | 下書きの列にだけ書く。確定の列は人が移す |
| 照合結果・過不足の集計 | スプレッドシートへの書き込み | 状態、差の額、店舗ごとの回数と額 |
| 会計システム | 書き込まない | 売上の計上は確定した日報から既存の手順で行う |
売上日報の確定の列と、会計システムには書き込みません。 書き込むのは下書きの列と照合結果だけです。店長への問い合わせも、自動では送りません。 未着の催促も含め、店舗への連絡は経理の担当が行います。
人が確認する
人が開くのは match 以外の行と、未着の一覧だけです。 match のものは件数を流し見て、まとめて確定の列に移します。全件を開く設計にすると、第10章の20.0時間には収まりません。
needs_reviewを先に見る …unclearの欄を写真で確かめて直します。読めなければ店長に聞きますpos_diffを見る … 返品・取消がPOSに入っているか、レジの締めの時刻がずれていないかを確かめますinternal_ngを見る … 店長の計算違いなら、正しい値に直して店舗へ知らせますover_shortと過不足の集計を見る … 回数の多い店舗を、エリアの責任者へ知らせます- 未着の店舗に催促する
4番目で店舗の誰かを責める材料にしないでください。 この構成が出すのは回数と額の偏りだけで、原因ではありません。
目標は、1,200件をならして1件1分です。 開くのは1割前後という想定で、それより多い月は、写真の撮り方か用紙の版に問題があります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 写真が暗い・斜め・用紙が切れている | needs_review。店長に撮り直しを頼み、撮り方の見本を送る |
| 金種の表の見出しが2行で表として取れない | 単純な表が対象。全文のテキストから行を拾い直す。 用紙の版を直す |
| 深夜営業で営業日が1日ずれる | 店舗マスタの区切りの時刻で営業日を決め、POSの営業日と合わせる |
| POSの CSV が届いていない | POSとの比較を飛ばし、報告書の中の検算だけ行う。CSV が届いたら比較をやり直す |
| 同じ営業日の写真が2枚 | 後のものを採り、前のものに「撮り直し」の印 |
| 報告書でない写真が混ざる | document_type が other。照合せず担当者へ |
| APIが応答しない、6分を超える | 処理済みの印を付けずに残す。次の実行で拾い直す |
1行目がいちばん多い例外です。 撮り方の見本を1枚作って店舗のタブレットに入れておくだけで、翌月から目に見えて減ります。
記録を残す
- 元の写真と、撮影の日時・店舗のフォルダ
- Document AI が返した
DocumentのJSONの全文 - Gemini API に渡した用紙の版のメモと、返ってきたJSON
- Apps Script が付けた状態と差の額、そのとき比べたPOSの行
- 人が値を直した記録と、店舗に問い合わせた日時と回答
- 店舗ごとの過不足の回数と額の推移
4つ目で「そのとき比べたPOSの行」を残すのは、POSの実績が後から直るためです。 締めた後の取消や会計を POS 側で直すと、翌日の CSV の数字が変わり、前日の照合の結果を説明できなくなります。
5つ目は、読み取りの弱い欄を見つける材料になります。 直した欄が毎回同じなら、その欄の升目の大きさか位置を、次の用紙の版で直します。
04実装レベルの3段階
最小構成では枚数がさばけません。 確かめるための段階です。 半自動化で、1件4分が2分程度になります。 打ち込みは自動になりますが、POSとの見比べと、未着の確認、過不足の一覧への転記が残ります。本格構成で1分になり、この段階が本記事の想定です。 差が大きいのは、POSとの見比べが1枚ずつの画面の行き来だからです。 段階を飛ばさないでください。 半自動化の下書きを1か月見ると、unclear の多い欄と店舗が先に分かります。 用紙の版と撮り方を直してから進みます。
05工数削減シミュレーション
導入後 1,200件 × 1分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 数十店舗を持つ飲食チェーン・小売チェーンで、閉店後に店長がレジ締めの報告書を手書きし、本部の経理が毎朝その写真やスキャンを見て売上日報へ打ち込んでいる場合。POSの日次の実績を支払方法別に CSV で出せる場合。過不足の多い店舗を数字で追えておらず、店舗の巡回や指導の優先順を決めたい場合。Google Workspace を使っている場合。
- 店舗が数店で、報告書が月に数十枚しか届かない場合。レジ締めを POS の画面で入力しており、手書きの報告書が無い場合。POSの実績を日次で取り出せず、照らす相手が無い場合。なお、過不足の原因の調査や、店舗の担当者への指導・処分の判断はこの構成では代替できません。
07最小構成で試す方法
- 先月の報告書から、手書きの癖の強い店舗と、過不足のあった日を中心に30枚を選ぶ
- その30枚について、本部で打ち込んだ値と、POSとの照合の結果を用意する
- 30枚を1枚ずつ手元のAIサービスの画面に貼り付ける
- 「このレジ締めの報告書から、総売上・支払方法別の額・釣銭準備金・金種ごとの枚数・現金の実在高・過不足を表にしてください。読みにくい数字はほかの欄から推し量らず、読みにくいと書いてください。計算をしないでください」と指示する
- 出てきた表を、本部で打ち込んだ値と1欄ずつ突き合わせる
| 出てきた内容 | 判断 |
|---|---|
| 数字が正しく写り、読みにくい欄に印が付いた | OCRとワークフローの連携に進む |
| 合計が合うように数字を読み替えた | 指示の書き方で直る。構成は有効 |
| 写真が粗くて読めない枚数が多い | 撮り方と用紙の版が先。 AIの問題ではない |
3行目は失敗ではありません。 本部の担当者が毎朝読み違いに悩んでいた理由が、写真の側にあったと分かったということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 合計が合うように数字を読み替える | 「合うかを考えない」と明記し、unclear を立てさせる |
| 実在高を金種の和で埋める | 補完を禁じ、書かれていない欄は空のまま |
| 写真の縮小で数字がつぶれる | 共有のときに縮小しない設定にする |
| 金種の表が2行の見出しで取れない | 用紙の版で見出しを1行にする |
深夜営業の店舗で毎日 pos_diff | 営業日の区切りの時刻を店舗マスタに持つ |
| △と▲とマイナスが混ざる | 符号は原文のまま写させ、解釈は規則で決める |
| 釣銭準備金を崩した日に過不足が合わない | 店舗マスタの額と違えば needs_review で人へ |
| POSの CSV が遅れて比較できない | 報告書の中の検算だけ先に行い、届いたらやり直す |
| 過不足の集計を担当者の評価に使う | 集計は偏りを見るためのもの。 原因は人が確かめる |
上の2行が、この構成の失敗のほとんどです。 どちらも「合ってしまう」方向の誤りで、一覧からは誰も気づきません。
3行目と4行目は、AIではなく写真と用紙の側の問題です。 直すほうが、指示を工夫するより効きます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 店舗ごとの日々の売上、現金の額、過不足、記入者の名前です。過不足は、店舗の従業員の扱いに関わる情報として慎重に扱います。
- Gemini API は有料の枠で使う … 公式の利用規約では、有料のサービスではプロンプトと応答を製品の改善に使わないとされる一方、無料のサービスでは改善に使われ、人が読むことがあるとされ、機密の情報や個人情報を送らないよう求めています。請求先のアカウントを付けたプロジェクトから呼びます
- AIに渡すのは報告書1枚分だけにする … POSの実績と店舗マスタをAIへ渡しません。比較と集計は Apps Script の側で行います
- 店舗への連絡を自動で送らない … 問い合わせと催促は経理の担当が行います
- 店舗のフォルダの権限を店舗ごとに分ける … 店舗のタブレットからは自店のフォルダにだけ保存でき、他店の報告書は見られないようにします
- 過不足の集計の見せ方を決める … 店舗ごとの回数と額は、エリアの責任者と経理だけが見られるようにします。記入者の名前ごとの集計は作りません
- この構成は原因の調査を代替しない … 過不足がなぜ起きたかを確かめるのは、店長とエリアの責任者です。 この構成が出すのは、数字が合ったかどうかと、偏りの事実だけです
誤りが起きた場合のリスクは、過不足の見落としと、合っている店舗への誤った問い合わせの2つです。 前者は指示で、後者は写真と用紙の整備で防ぎます。
10まず何から始めるか
1週目:用紙の版を作り直す
今の用紙の欄の並びはそのままに、1つの欄に1つの数字、金種の表の見出しを1行、確認の印を □ に直した新しい版を作ります。撮り方の見本の写真も1枚用意します。
2週目:30枚で試す
先月の報告書から30枚を選び、手元のAIサービスで数字を表にさせます。合計が合うように数字を読み替えていないかを最優先で見ます。
3週目:POSの CSV と店舗マスタを整える
POSから店舗別・支払方法別の日次の実績を毎朝 CSV で出す設定を確かめ、店舗マスタに釣銭準備金の額と営業日の区切りの時刻を入れます。
4週目:店舗のフォルダから売上日報の下書きまでをつなぐ
Apps Script で店舗のフォルダを見張り、Document AI と Gemini API を呼び、売上日報の下書きの列に書き出すところまで作ります。この時点ではPOSと比べず、写した数字だけを見ます。
2か月目: 報告書の中の検算とPOSとの比較を足し、状態を出します。match 以外の件数を毎週数えます。3か月目以降: 未着の一覧と過不足の集計を足し、1件4分が何分になったかを実測します。過不足の多い店舗の一覧が、月末ではなく毎朝エリアの責任者へ届くようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Form Parser がOCRのテキストに加えてキーと値のペア(エンティティとチェックボックス)、表、一般的なエンティティを抽出し、200を超える言語に対応すること。言語の一覧に日本語があり手書きに対応すること。ページ上限が同期15、バッチ100であること | Google Cloud: Processor list | 2026-10-06 |
| Form Parser が事前学習済みで追加の学習ができないこと。表の抽出が行や列をまたぐセルのない単純な表を対象とすること。ラテン文字以外の言語ではキーと値の読み取りの質が下がることがあること | Google Cloud: Form Parser | 2026-10-06 |
formFields が fieldName と fieldValue を持ち、チェックボックスが valueType で返ること。表が headerRows と bodyRows で返ること。信頼度が返ること | Google Cloud: Handle the processing response | 2026-10-06 |
| 対応形式が PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などであること。スキャンは最低200dpiが望ましく300dpi以上が一般に最もよいこと。非可逆の圧縮で精度が落ちうること | Google Cloud: Supported files | 2026-10-06 |
Interactions の response_format に JSON スキーマを渡して応答の形を固定でき、enum と required を使えること。値はアプリケーションで検証すべきこと | Gemini API: Structured outputs | 2026-10-06 |
| 有料サービスではプロンプトと応答を製品の改善に使わず、無料サービスでは改善に使われ人が読むことがあり、機密の情報や個人情報を送らないよう求めていること | Gemini API 追加利用規約 | 2026-10-06 |
| Apps Script の1回の実行が6分までであること | Apps Script: Quotas for Google Services | 2026-10-06 |
| 時間主導型のトリガーが毎分から月1回までの間隔で動かせること | Apps Script: Installable triggers | 2026-10-06 |
過不足の原因と、店舗への指導の方針は、店舗の運営の責任者と経理で決めてください。 本記事は各製品の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0531)についてのご相談はこちらから。
