Media > AI活用ユースケース > 経理 > 飲食店の店舗で手書きされるレジ締めの報告書を読み取り、本部の売上日報に転記して、POSの実績との差と過不足の多い店舗を拾う

飲食店の店舗で手書きされるレジ締めの報告書を読み取り、本部の売上日報に転記して、POSの実績との差と過不足の多い店舗を拾う

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

閉店後に店長が手書きするレジ締めの報告書を読み取り、本部の売上日報に転記します。あわせて、POSの実績との差と、現金の過不足が続いている店舗を拾います。

サマリー
生成AI
ChatGPT/Claude/Gemini
AIサービス
Azure AI/Google Document AI
連携・自動化
Google Apps Script/Python
対象業界
小売/飲食
対象部門
経理
対象業務
データ入力・転記/内容確認・チェック
主な課題
人手が足りない/入力作業が多い/確認ミスが多い
AIで行う処理
読み取り(OCR)
主な効果
入力漏れ削減/対応スピード向上/工数削減
導入難易度
★★☆☆☆
実装レベル
本格構成
費用感
API連携(中)
人間の確認
必須
現在工数
80h/月
AI導入後
20h/月
想定削減
75%
年間削減
720h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 朝、40店舗分のフォルダを開き、前日の報告書の写真が届いているかを確かめる
  2. 届いていない店舗に電話かチャットで催促する
  3. 1枚ずつ写真を開き、総売上・支払方法別の額・過不足を売上日報に打ち込む
  4. POSの日次の実績と、総売上と支払方法別の額を見比べる
  5. 合わないものは、店長にチャットで聞く
  6. 過不足が書かれている店舗は、過不足の一覧に写す
  7. 月末に、過不足の一覧から店舗ごとの回数と額を集計する
導入後(After)
  1. 人店長が閉店後に報告書を手書きし、タブレットで撮影して店舗のフォルダに保存する
  2. 自動Apps Script が夜間と早朝に店舗のフォルダを見て、新しい写真を拾う
  3. 自動Document AI が報告書を読み、項目名と値の組・金種の表・チェックボックス・信頼度を返す
  4. 自動Gemini API が、店舗・日付・総売上・支払方法別の額・釣銭準備金・金種ごとの枚数・実在高・過不足を決まった形にそろえる
  5. 自動Apps Script が報告書の中の和と差を検算し、POSの日次の実績と比べる
  6. 自動売上日報の下書きの行と、照合結果のシートに書き込む
  7. 自動朝の決まった時刻に、報告書が届いていない店舗と、過不足が続いている店舗の一覧を作る
  8. 人経理の担当が `match` 以外の行だけを開き、写真で確かめるか、店長に聞くかを決める
  9. 人確かめ終えた行を、売上日報の確定の列に移す
各工程の詳しい説明を読む
  1. 朝、40店舗分のフォルダを開き、前日の報告書の写真が届いているかを確かめる
  2. 届いていない店舗に電話かチャットで催促する
  3. 1枚ずつ写真を開き、総売上・支払方法別の額・過不足を売上日報に打ち込む
  4. POSの日次の実績と、総売上と支払方法別の額を見比べる
  5. 合わないものは、店長にチャットで聞く
  6. 過不足が書かれている店舗は、過不足の一覧に写す
  7. 月末に、過不足の一覧から店舗ごとの回数と額を集計する

(a)毎朝40枚を打ち込んでいる。 3番は1枚あたり数分ですが、40枚を毎朝続けると午前中の大半がこの作業で埋まります。 店舗が増えるたびに、そのまま時間が増えます。

(b)手書きの数字の読み違い。 「1」と「7」、「0」と「6」、桁の区切りの位置。写真が斜めだったり暗かったりすると、打ち込む側が読み違えます。 POSと合わないとき、それが店舗の誤りか本部の打ち込みの誤りかを確かめるのに、さらに時間を使います。

(c)報告書の中の計算を確かめていない。 支払方法別の額の和が総売上と合うか、過不足が正しく計算されているかを、打ち込む側は見ていません。 店長の計算違いで過不足が「0」と書かれていても、そのまま日報に入ります。

(d)過不足の傾向が月末まで分からない。 7番の集計は月に一度で、同じ店舗で同じ曜日に不足が続いていても、気づくのは翌月です。

  1. 【人】 店長が閉店後に報告書を手書きし、タブレットで撮影して店舗のフォルダに保存する
  2. 【自動】 Apps Script が夜間と早朝に店舗のフォルダを見て、新しい写真を拾う
  3. 【自動】 Document AI が報告書を読み、項目名と値の組・金種の表・チェックボックス・信頼度を返す
  4. 【自動】 Gemini API が、店舗・日付・総売上・支払方法別の額・釣銭準備金・金種ごとの枚数・実在高・過不足を決まった形にそろえる
  5. 【自動】 Apps Script が報告書の中の和と差を検算し、POSの日次の実績と比べる
  6. 【自動】 売上日報の下書きの行と、照合結果のシートに書き込む
  7. 【自動】 朝の決まった時刻に、報告書が届いていない店舗と、過不足が続いている店舗の一覧を作る
  8. 【人】 経理の担当が match 以外の行だけを開き、写真で確かめるか、店長に聞くかを決める
  9. 【人】 確かめ終えた行を、売上日報の確定の列に移す

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 以外だけ確認】──▶ 売上日報の確定・店舗への問い合わせ
役割想定する製品代替候補
OCRGoogle Document AI(Form Parser)Azure AI Document Intelligence
生成AIGemini 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どうやって実装するのか

Step1

処理の起点を決める

Google Apps Script の時間主導型トリガーで、夜間と早朝に店舗のフォルダを見ます。 時間主導型のトリガーは、毎分から月1回までの間隔で動かせるとされています。閉店の時刻は店舗で違うため、深夜から朝まで30分おきに見て、届いたものから処理します。

朝の決まった時刻に、別のトリガーで未着の一覧を作ります。 POSの日次の CSV が置かれた後、前日の報告書が届いていない店舗を拾います。経理の担当が出社したときには、催促の対象がそろっています。

1回の実行で処理する件数に上限を置きます。 Apps Script の1回の実行は6分までとされています。1回に8件までとし、残りは次の実行に回します。 処理済みの印は、照合結果のシートへの書き込みまで成功したときだけに付けます。

Step2

入力データを集める

データ中身取得元
報告書の写真JPEG または PDF。店舗のフォルダ、撮影の日時共有ドライブの店舗のフォルダ
読み取り結果項目名と値の組、金種の表、チェックボックス、全文のテキスト、項目ごとの信頼度Document AI(Form Parser)
POSの日次の実績店舗、営業日、総売上、支払方法別の額、返品・取消の額POSから毎朝出力する CSV
店舗マスタ店舗コード、店舗名、フォルダの場所、釣銭準備金の決まった額、営業日の区切りの時刻自社で用意する一覧
用紙の版のメモ版ごとの欄の名前と並び自社で用意する一覧
過不足の許容の範囲何円までを端数として流すか経理の取り決め

質を決めるのは、店舗マスタの釣銭準備金の額です。 報告書に書かれた釣銭準備金が決まった額と違えば、それだけで過不足の計算がずれます。読み取りの誤りか、店舗が準備金を崩したのかを分けるために、決まった額を持っておきます。

営業日の区切りの時刻も要ります。 深夜まで営業する店舗では、POSの営業日と報告書の日付が1日ずれることがあります。

Step3

データの取得方法を決める

読み取りは、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 は読むだけで足ります。 店舗コードと営業日で行を引きます。店舗のフォルダから店舗を決めるので、報告書に書かれた店舗名は確かめに使うだけです。

Step4

AIへ渡す前に整形する

  1. 形式の確認 … Form Parser の対象は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP です。タブレットの写真が HEIC などで保存される設定なら、JPEG で保存する設定に変えます
  2. 圧縮の確認 … JPEG のような非可逆の形式は、ファイルを小さくすると精度が落ちることがあるとされています。写真を共有するときに縮小しない設定にします
  3. 解像度の確認 … 公式には、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよい結果になるとされています。写真では、用紙が画面いっぱいに入るように撮るよう店舗に伝えます
  4. 向きと傾きの確認 … 横向きや逆さの写真は、画像の縦横から向きを直してから渡します
  5. 日付の確認 … 撮影の日時と、店舗の営業日の区切りの時刻から、どの営業日の報告書かの候補を決めます
  6. 重複の検知 … 同じ店舗・同じ営業日の写真が2枚あれば、後のものを採り、前のものに「撮り直し」の印を付けます

2番目を軽く見ないでください。 チャットや共有の機能によっては、写真を送るときに自動で縮小します。縮小された手書きの数字は、「1」と「7」の区別からつぶれます。

Step5

AIに処理させる

させるのは、報告書に書かれた数字を、決まった項目に写すことだけです。 計算はさせません。

写す項目当たるものの例判断できないときの扱い
店舗名・営業日「店舗名」「日付」読めなければ空。店舗はフォルダから決める
総売上「総売上」「本日売上」読めなければ空にして needs_review
支払方法別の額「現金」「クレジット」「電子マネー」「QR」「商品券」空欄なら空。0と書かれていれば0
釣銭準備金「釣銭準備金」「つり銭」書かれていなければ空。店舗マスタの額で埋めない
金種ごとの枚数「10,000円 ×3枚」枚数だけで金額が無ければ金額は空
現金の実在高「現金在高」「実在高」書かれていなければ空。金種の和で埋めない
過不足「過不足」「+300」「△500」符号を原文のまま写す。△や▲は原文を残す
過不足の理由・メモ余白の書き込み原文のまま写す

右端の列が、この構成でいちばん大事な区別です。 書かれていない項目を、ほかの欄やマスタの値で埋めさせません。特に実在高と過不足は、書かれていなければ空のままにします。

させないこと理由
和と差の計算・検算Apps Script が行う
合計が合うように数字を読み替えること読み替えた瞬間に過不足が消える
書かれていない欄の補完金種の和で実在高を埋めると、店長の計算違いが見えなくなる
過不足の符号の解釈△・▲・マイナスの使い方は店舗で違う。規則で決める
過不足の原因の推測原因は店長と経理が確かめる

2行目がいちばん起きやすい失敗です。 現金の実在高の一桁がかすれた報告書を渡すと、AIは過不足が「0」になる数字を選びがちです。その瞬間、本当にあった不足が「一致」にすり替わります。 プロンプトで、ほかの欄から推し量ることを禁じます。

Step6

指示内容を固定する

あなたは飲食チェーンの本部の経理で、店舗から届いたレジ締めの報告書を読み、
売上日報に写すための下書きを作る立場です。
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 を立てさせ、決めるのは人にします。

Step7

出力形式を固定する

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_reviewunclear が1つでもある、金額の信頼度が基準を下回る、釣銭準備金が店舗マスタの額と違う

2つ目の理由は、internal_ng と pos_diff を分けられることです。 前者は店長の計算か記入の誤り、後者はレジの操作か POS の締めの誤りで、確かめる相手が違います。公式にも、構文として正しいJSONでも値はアプリケーションの側で検証するよう書かれています。

過不足の傾向は、別のシートで集計します。 Apps Script が店舗ごとに直近30日の over_short の回数と額、曜日の偏りを毎朝出し、回数の多い順に並べます。

Step8

システムへ連携する

つなぎ先方式内容
店舗のフォルダApps Script の時間主導型トリガー新しい写真を拾う
Document AIAPI呼び出し項目名と値の組・金種の表・チェックボックス・信頼度を返す
Gemini APIAPI呼び出し(構造化出力)報告書の欄の対応付け
POSの日次の実績CSV の読み取り店舗・営業日ごとの総売上と支払方法別の額
売上日報スプレッドシートへの書き込み下書きの列にだけ書く。確定の列は人が移す
照合結果・過不足の集計スプレッドシートへの書き込み状態、差の額、店舗ごとの回数と額
会計システム書き込まない売上の計上は確定した日報から既存の手順で行う

売上日報の確定の列と、会計システムには書き込みません。 書き込むのは下書きの列と照合結果だけです。店長への問い合わせも、自動では送りません。 未着の催促も含め、店舗への連絡は経理の担当が行います。

Step9

人が確認する

人が開くのは match 以外の行と、未着の一覧だけです。 match のものは件数を流し見て、まとめて確定の列に移します。全件を開く設計にすると、第10章の20.0時間には収まりません。

  1. needs_review を先に見る … unclear の欄を写真で確かめて直します。読めなければ店長に聞きます
  2. pos_diff を見る … 返品・取消がPOSに入っているか、レジの締めの時刻がずれていないかを確かめます
  3. internal_ng を見る … 店長の計算違いなら、正しい値に直して店舗へ知らせます
  4. over_short と過不足の集計を見る … 回数の多い店舗を、エリアの責任者へ知らせます
  5. 未着の店舗に催促する

4番目で店舗の誰かを責める材料にしないでください。 この構成が出すのは回数と額の偏りだけで、原因ではありません。

目標は、1,200件をならして1件1分です。 開くのは1割前後という想定で、それより多い月は、写真の撮り方か用紙の版に問題があります。

Step10

例外に対処する

起きること対応
写真が暗い・斜め・用紙が切れているneeds_review。店長に撮り直しを頼み、撮り方の見本を送る
金種の表の見出しが2行で表として取れない単純な表が対象。全文のテキストから行を拾い直す。 用紙の版を直す
深夜営業で営業日が1日ずれる店舗マスタの区切りの時刻で営業日を決め、POSの営業日と合わせる
POSの CSV が届いていないPOSとの比較を飛ばし、報告書の中の検算だけ行う。CSV が届いたら比較をやり直す
同じ営業日の写真が2枚後のものを採り、前のものに「撮り直し」の印
報告書でない写真が混ざるdocument_type が other。照合せず担当者へ
APIが応答しない、6分を超える処理済みの印を付けずに残す。次の実行で拾い直す

1行目がいちばん多い例外です。 撮り方の見本を1枚作って店舗のタブレットに入れておくだけで、翌月から目に見えて減ります。

Step11

記録を残す

  • 元の写真と、撮影の日時・店舗のフォルダ
  • Document AI が返した Document のJSONの全文
  • Gemini API に渡した用紙の版のメモと、返ってきたJSON
  • Apps Script が付けた状態と差の額、そのとき比べたPOSの行
  • 人が値を直した記録と、店舗に問い合わせた日時と回答
  • 店舗ごとの過不足の回数と額の推移

4つ目で「そのとき比べたPOSの行」を残すのは、POSの実績が後から直るためです。 締めた後の取消や会計を POS 側で直すと、翌日の CSV の数字が変わり、前日の照合の結果を説明できなくなります。

5つ目は、読み取りの弱い欄を見つける材料になります。 直した欄が毎回同じなら、その欄の升目の大きさか位置を、次の用紙の版で直します。

04実装レベルの3段階

最小構成:写真を手でAIの画面に貼り、数字を表にさせる / 1枚ごとの読み取り
半自動化:上記+Document AI のAPIを呼び、結果を売上日報の下書きに書き出す / 読み取りと転記
本格構成:上記+店舗のフォルダを起点に自動で動かし、報告書の中の検算・POSとの比較・未着と過不足の集計まで出す / 転記と照合と集計の全体

最小構成では枚数がさばけません。 確かめるための段階です。 半自動化で、1件4分が2分程度になります。 打ち込みは自動になりますが、POSとの見比べと、未着の確認、過不足の一覧への転記が残ります。本格構成で1分になり、この段階が本記事の想定です。 差が大きいのは、POSとの見比べが1枚ずつの画面の行き来だからです。 段階を飛ばさないでください。 半自動化の下書きを1か月見ると、unclear の多い欄と店舗が先に分かります。 用紙の版と撮り方を直してから進みます。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
3 名
月間件数
1,200 件
1件あたり現在時間
4 分
1件あたり導入後時間
1 分
現在  1,200件 × 4分 ÷ 60 = 80 時間/月
導入後 1,200件 × 1分 ÷ 60 = 20 時間/月
月間削減時間
60h
削減率
75%
年間削減時間
720h
年間金額換算(時間単価3,000円)
216万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 数十店舗を持つ飲食チェーン・小売チェーンで、閉店後に店長がレジ締めの報告書を手書きし、本部の経理が毎朝その写真やスキャンを見て売上日報へ打ち込んでいる場合。POSの日次の実績を支払方法別に CSV で出せる場合。過不足の多い店舗を数字で追えておらず、店舗の巡回や指導の優先順を決めたい場合。Google Workspace を使っている場合。
向いていない
  1. 店舗が数店で、報告書が月に数十枚しか届かない場合。レジ締めを POS の画面で入力しており、手書きの報告書が無い場合。POSの実績を日次で取り出せず、照らす相手が無い場合。なお、過不足の原因の調査や、店舗の担当者への指導・処分の判断はこの構成では代替できません。

07最小構成で試す方法

  1. 先月の報告書から、手書きの癖の強い店舗と、過不足のあった日を中心に30枚を選ぶ
  2. その30枚について、本部で打ち込んだ値と、POSとの照合の結果を用意する
  3. 30枚を1枚ずつ手元のAIサービスの画面に貼り付ける
  4. 「このレジ締めの報告書から、総売上・支払方法別の額・釣銭準備金・金種ごとの枚数・現金の実在高・過不足を表にしてください。読みにくい数字はほかの欄から推し量らず、読みにくいと書いてください。計算をしないでください」と指示する
  5. 出てきた表を、本部で打ち込んだ値と1欄ずつ突き合わせる
出てきた内容判断
数字が正しく写り、読みにくい欄に印が付いたOCRとワークフローの連携に進む
合計が合うように数字を読み替えた指示の書き方で直る。構成は有効
写真が粗くて読めない枚数が多い撮り方と用紙の版が先。 AIの問題ではない

3行目は失敗ではありません。 本部の担当者が毎朝読み違いに悩んでいた理由が、写真の側にあったと分かったということです。

08実装時につまずきやすいポイント

問題対策
合計が合うように数字を読み替える「合うかを考えない」と明記し、unclear を立てさせる
実在高を金種の和で埋める補完を禁じ、書かれていない欄は空のまま
写真の縮小で数字がつぶれる共有のときに縮小しない設定にする
金種の表が2行の見出しで取れない用紙の版で見出しを1行にする
深夜営業の店舗で毎日 pos_diff営業日の区切りの時刻を店舗マスタに持つ
△と▲とマイナスが混ざる符号は原文のまま写させ、解釈は規則で決める
釣銭準備金を崩した日に過不足が合わない店舗マスタの額と違えば needs_review で人へ
POSの CSV が遅れて比較できない報告書の中の検算だけ先に行い、届いたらやり直す
過不足の集計を担当者の評価に使う集計は偏りを見るためのもの。 原因は人が確かめる

上の2行が、この構成の失敗のほとんどです。 どちらも「合ってしまう」方向の誤りで、一覧からは誰も気づきません。

3行目と4行目は、AIではなく写真と用紙の側の問題です。 直すほうが、指示を工夫するより効きます。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 店舗ごとの日々の売上、現金の額、過不足、記入者の名前です。過不足は、店舗の従業員の扱いに関わる情報として慎重に扱います。

  1. Gemini API は有料の枠で使う … 公式の利用規約では、有料のサービスではプロンプトと応答を製品の改善に使わないとされる一方、無料のサービスでは改善に使われ、人が読むことがあるとされ、機密の情報や個人情報を送らないよう求めています。請求先のアカウントを付けたプロジェクトから呼びます
  2. AIに渡すのは報告書1枚分だけにする … POSの実績と店舗マスタをAIへ渡しません。比較と集計は Apps Script の側で行います
  3. 店舗への連絡を自動で送らない … 問い合わせと催促は経理の担当が行います
  4. 店舗のフォルダの権限を店舗ごとに分ける … 店舗のタブレットからは自店のフォルダにだけ保存でき、他店の報告書は見られないようにします
  5. 過不足の集計の見せ方を決める … 店舗ごとの回数と額は、エリアの責任者と経理だけが見られるようにします。記入者の名前ごとの集計は作りません
  6. この構成は原因の調査を代替しない … 過不足がなぜ起きたかを確かめるのは、店長とエリアの責任者です。 この構成が出すのは、数字が合ったかどうかと、偏りの事実だけです

誤りが起きた場合のリスクは、過不足の見落としと、合っている店舗への誤った問い合わせの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技術仕様の確認日・参考情報

技術仕様確認日:2026-10-06/最終更新:2026-10-06
確認した内容情報源確認日
Form Parser がOCRのテキストに加えてキーと値のペア(エンティティとチェックボックス)、表、一般的なエンティティを抽出し、200を超える言語に対応すること。言語の一覧に日本語があり手書きに対応すること。ページ上限が同期15、バッチ100であることGoogle Cloud: Processor list2026-10-06
Form Parser が事前学習済みで追加の学習ができないこと。表の抽出が行や列をまたぐセルのない単純な表を対象とすること。ラテン文字以外の言語ではキーと値の読み取りの質が下がることがあることGoogle Cloud: Form Parser2026-10-06
formFields が fieldName と fieldValue を持ち、チェックボックスが valueType で返ること。表が headerRows と bodyRows で返ること。信頼度が返ることGoogle Cloud: Handle the processing response2026-10-06
対応形式が PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などであること。スキャンは最低200dpiが望ましく300dpi以上が一般に最もよいこと。非可逆の圧縮で精度が落ちうることGoogle Cloud: Supported files2026-10-06
Interactions の response_format に JSON スキーマを渡して応答の形を固定でき、enum と required を使えること。値はアプリケーションで検証すべきことGemini API: Structured outputs2026-10-06
有料サービスではプロンプトと応答を製品の改善に使わず、無料サービスでは改善に使われ人が読むことがあり、機密の情報や個人情報を送らないよう求めていることGemini API 追加利用規約2026-10-06
Apps Script の1回の実行が6分までであることApps Script: Quotas for Google Services2026-10-06
時間主導型のトリガーが毎分から月1回までの間隔で動かせることApps Script: Installable triggers2026-10-06

過不足の原因と、店舗への指導の方針は、店舗の運営の責任者と経理で決めてください。 本記事は各製品の公式ページで確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-0531)についてのご相談はこちらから。

AI活用について相談する
目次