飲食店の店舗から届く小口現金の出金報告とレシートの写真を読み、小口現金の台帳にそろえて、領収書の欠けと食い違いを拾う
店舗の店長が Google フォームで送る小口現金の出金報告とレシートの写真を、Google Apps Script が受け取って Claude API に読ませ、日付・支払先・金額・品目と勘定科目の候補を小口現金の台帳にそろえます。写真の無いもの、金額の合わないものは店舗へ返します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate
- 対象業界
- 介護/宿泊/小売/飲食
- 対象部門
- 経理
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 抽出
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 経理担当がフォームの回答のシートを開き、前日までの新しい回答を確かめる
- 1件ずつレシートの写真を開き、日付・支払先・金額がフォームの入力と合っているかを見る
- 用途の欄とレシートの品目から、勘定科目を決める
- 店舗・日付・支払先・金額・科目・税率の区分を、小口現金の台帳に写す
- 写真が付いていない、写真がぼやけて読めない、金額が合わないものは、メモを残して店長にメールで問い合わせる
- 月末に、店舗ごとの出金の合計と、店長が報告した月末の現金の残高を照らす
- 台帳から会計ソフトへ仕訳を起こす
- 人店長がフォームで出金を報告し、レシートの写真を付ける(今と同じ)
- 自動回答がシートに入ると、Apps Script のフォーム送信のトリガーが動く
- 自動写真の形式・大きさを確かめ、Claude API に写真とフォームの入力を渡す
- 自動AIが写真から日付・支払先・合計金額・品目・税率の区分を抜き出し、勘定科目の候補を一覧から選ぶ
- 自動スクリプトが、写真から読んだ値とフォームの入力を規則で突き合わせ、「一致」「要確認」「証憑の欠け」に分ける
- 自動「一致」は台帳に入れ、「要確認」は台帳に入れたうえで印を付け、「証憑の欠け」は店長へ撮り直しの依頼を送る
- 人経理担当が毎日「要確認」の行と、科目の候補が「迷った」になった行を見て直す
- 自動月末に、店舗ごとの出金の合計と月末の残高の報告を照らし、合わない店舗を一覧にする
各工程の詳しい説明を読む
- 経理担当がフォームの回答のシートを開き、前日までの新しい回答を確かめる
- 1件ずつレシートの写真を開き、日付・支払先・金額がフォームの入力と合っているかを見る
- 用途の欄とレシートの品目から、勘定科目を決める
- 店舗・日付・支払先・金額・科目・税率の区分を、小口現金の台帳に写す
- 写真が付いていない、写真がぼやけて読めない、金額が合わないものは、メモを残して店長にメールで問い合わせる
- 月末に、店舗ごとの出金の合計と、店長が報告した月末の現金の残高を照らす
- 台帳から会計ソフトへ仕訳を起こす
(a)写して照らすだけで1件数分かかる。 写真を開き、拡大し、金額を読み、フォームの入力と見比べ、台帳に写す。1件ごとに判断らしい判断はほとんど無いのに、月600件で時間がかさみます。
(b)勘定科目の付け方がぶれる。 「ゴム手袋」は消耗品費か衛生費か、「電球」は消耗品費か修繕費か、「業務スーパーで買った玉ねぎ」は仕入か。担当者2名の間で付け方が違い、月次の数字を店舗どうしで比べると、科目ごとの差が付け方の差なのか使い方の差なのか分かりません。
(c)レシートの欠けが月末まで分からない。 写真の付け忘れ、レシートではなく注文の控えの写真、手書きの領収書の金額の欄が空。日々の確認で見落とすと、月末の残高の照合で合わなくなってから探し始めます。 その頃には、店長も何を買ったか覚えていません。
- 【人】 店長がフォームで出金を報告し、レシートの写真を付ける(今と同じ)
- 【自動】 回答がシートに入ると、Apps Script のフォーム送信のトリガーが動く
- 【自動】 写真の形式・大きさを確かめ、Claude API に写真とフォームの入力を渡す
- 【自動】 AIが写真から日付・支払先・合計金額・品目・税率の区分を抜き出し、勘定科目の候補を一覧から選ぶ
- 【自動】 スクリプトが、写真から読んだ値とフォームの入力を規則で突き合わせ、「一致」「要確認」「証憑の欠け」に分ける
- 【自動】 「一致」は台帳に入れ、「要確認」は台帳に入れたうえで印を付け、「証憑の欠け」は店長へ撮り直しの依頼を送る
- 【人】 経理担当が毎日「要確認」の行と、科目の候補が「迷った」になった行を見て直す
- 【自動】 月末に、店舗ごとの出金の合計と月末の残高の報告を照らし、合わない店舗を一覧にする
人が見るのは、印の付いた行だけです。 写真の金額とフォームの金額が合い、科目の候補に迷いの無い行は、台帳を日に1回流し見るだけにします。全件の写真を開き直す設計にすると、5分は2分になりません。
6番目で、撮り直しの依頼だけは自動で送ります。 写真が無い、写真がレシートでない、という事実は人が見ても変わらないからです。金額が合わないものは自動で返さず、経理が見てから問い合わせます。 どちらの数字が正しいかで、店長への聞き方が変わります。
02今回想定するシステム構成
店長(Google フォーム:日付・支払先・金額・用途・写真) │ 写真はフォームのオーナーのドライブのフォルダへ ▼【トリガー】フォーム送信(スプレッドシートのインストール型トリガー) Google Apps Script ├──▶ 写真の形式・大きさの確認(ドライブから取得) ├──▶ Claude API(画像の入力+構造化出力) │ 写真+フォームの入力 → 日付・支払先・金額・品目・科目の候補 ├──▶ 規則による突き合わせ(金額・日付・店舗・重複) ├──▶ 小口現金の台帳のシートに書く ├──▶ MailApp で撮り直しの依頼を店長へ └──▶ 月末:残高の照合と、合わない店舗の一覧 ▼ 【経理が要確認の行を直し、月末に会計ソフトへ仕訳】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make |
| 生成AI | Claude API(画像の入力、構造化出力) | OpenAI API、Gemini API |
| 保管 | Google スプレッドシート(フォームの回答、台帳、科目の一覧、処理ログ)とドライブ(写真) | - |
| 通知 | Gmail(MailApp) | Google Chat |
新しく足すのは、Apps Script と、科目の一覧・処理ログのシートだけです。 フォームと回答のシート、台帳のシートは今のものを使います。会計ソフトにはつなぎません。 仕訳は今までどおり月末に台帳から起こします。
Apps Script は、フォームの回答のスプレッドシートに付けるスクリプトとして書きます。 公式のページでは、フォーム送信のトリガーには Google フォーム側とスプレッドシート側の2つがあり、どちらもインストール型のトリガーだけとされています。スプレッドシート側のイベントには、質問名と回答を対応させた namedValues と、回答の行を指す range が入ります。台帳への書き込みとシートの操作が中心なので、スプレッドシート側を使います。
インストール型のトリガーは、作った人のアカウントで動き、送るメールもその人のアカウントから出ると公式のページにあります。経理課の共有のアカウントで作ります。
画像は Claude API の画像の入力で読みます。 公式のページでは、画像は image の内容ブロックとして base64 などで渡し、対応する形式は JPEG・PNG・GIF・WebP、API を直接使う場合の1枚の上限は base64 で10MB、縦横の上限は 8000×8000ピクセルとされています。出力は構造化出力(output_config.format に type: "json_schema")で受け取り、オブジェクトには additionalProperties: false が必要です。
03どうやって実装するのか
処理の起点を決める
フォームの回答がシートに入ったことを起点にします。 スプレッドシートのインストール型のフォーム送信のトリガーを、経理課の共有のアカウントで1つ作ります。1件ずつ動くので、店長が報告した数分後には台帳に入ります。
月末の照合は、別に時間主導型のトリガーを置きます。 毎月1日の朝に、前月分の照合を走らせます。公式のページでは、時間主導型のトリガーの時刻は少しずれることがあり、9時に設定すると9時から10時のあいだで動くとされています。経理の始業に間に合えば足ります。
フォーム送信のトリガーが失敗したときに備え、1日1回の拾い直しも置きます。 回答のシートに「処理済み」の列を足し、空の行を朝にまとめて処理します。API が一時的に応答しなかった回答も、ここで拾われます。 公式のページでは、トリガーが失敗するとスクリプトの持ち主に失敗を知らせるメールが届くとされています。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| フォームの回答 | 送信日時、送信者のアカウント、店舗、日付、支払先、金額、用途(選択式)、メモ、写真 | 回答のシート(namedValues) |
| レシートの写真 | スマートフォンで撮った画像(1件に1〜3枚) | ドライブ(フォームのアップロード先のフォルダ) |
| 勘定科目の一覧 | 科目コード、科目名、使う場面の説明、迷いやすい品目と決め方の例 | スプレッドシート |
| 店舗の一覧 | 店舗コード、店名、店長・副店長のアカウント、小口現金の定額 | スプレッドシート |
| 台帳 | 店舗ごとの過去の出金(重複の確認に使う) | スプレッドシート |
質を決めるのは、勘定科目の一覧の「迷いやすい品目と決め方の例」の列です。 「電球・蛍光灯の交換用 → 消耗品費」「排水管の詰まりの業者の作業代 → 修繕費」「店頭で足りなくなった食材 → 仕入高」のように、経理の2名が迷ってきた品目を、決めた答えと一緒に並べます。 例が無いと、AIもぶれます。
送信者のアカウントは、店舗の一覧と照らします。 店長・副店長として登録されたアカウント以外からの報告は、処理せずに経理へ回します。
データの取得方法を決める
写真は、回答のシートに入るアップロードのファイルの値からドライブのファイルを特定し、DriveApp で取得します。 回答の値の形(ファイルのリンクか、IDか、複数枚の区切り方)は、テストの回答を1件送ってシートの値を見て確かめ、それに合わせて取り出し方を書きます。 推測で書くと、2枚付けたときに2枚目を落とします。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 回答の各項目 | トリガーのイベントの namedValues | AIに渡すフォームの入力と、突き合わせの相手 |
| 回答の行の位置 | イベントの range | 「処理済み」の列を書く行 |
| 写真のファイル | ドライブ(DriveApp.getFileById) | 形式と大きさの確認、base64 にして API へ |
| 科目の一覧・店舗の一覧 | スプレッドシート | AIに渡す選択肢、送信者の確認 |
API の呼び出しは UrlFetchApp で行います。 公式の割り当ての表では、URL Fetch の呼び出しは Google Workspace のアカウントで1日10万回、1回の実行の時間は6分が上限です。月600件なら、どちらにも遠く届きません。 1回の実行で1件だけを処理するので、6分を超えることもありません。
AIへ渡す前に整形する
- 送信者の確認 … 送信者のアカウントが店舗の一覧の店長・副店長かを確かめます。違えば処理せずに経理へ回します
- 写真の有無 … 写真が無ければAIに渡さず、「証憑の欠け」として撮り直しの依頼を送ります
- 形式の確認 … ファイルの種類が JPEG・PNG・GIF・WebP のどれかを確かめます。iPhone の既定の HEIC で撮られた写真は、そのままでは渡せません
- 大きさの確認 … base64 にしたときに10MBを超えないか、縦横が8000ピクセルを超えないかを確かめます
- 金額の整え … フォームの金額の欄から「円」「,」「¥」を外して数にします。数にならなければ要確認にします
- 重複の確認 … 同じ店舗・同じ日付・同じ金額の行が台帳に既にあれば、重複の疑いの印を付けます
3番目は、店舗への最初のお願いで減らします。 スマートフォンのカメラの設定で、保存の形式を JPEG にしてもらいます。それでも HEIC が届いたら、撮り直しの依頼を自動で送ります。 スクリプトの側で形式を変換する仕組みは作りません。
6番目は、同じ報告を2回送ってしまう場合のためです。 フォームは送信の後に「別の回答を送信」が出るので、送れたか不安になった店長が同じ内容をもう一度送ることがあります。 重複の疑いは消さずに印だけ付け、経理が決めます。
AIに処理させる
させるのは、写真から決まった項目を読み、科目の候補を一覧から選ぶことだけです。
| 読むもの・選ぶもの | 中身 | 読めない・無いとき |
|---|---|---|
| 書類の種類 | レシート/手書きの領収書/注文の控え・見積/その他 | other |
| 日付 | レシートに印字・記入された日付 | 空にする |
| 支払先 | 店名・会社名 | 空にする |
| 合計金額 | 税込の支払額 | 空にする |
| 税率ごとの金額 | 10%・8%の対象の金額が分かれていればそれぞれ | 空にする |
| 登録番号の有無 | 「T」で始まる番号が印字されているか(値は写す) | false |
| 品目 | 印字された品目名(最大10行) | 空の配列 |
| 科目の候補 | 一覧の科目コードから1つ。決められなければ undecided | undecided |
| 科目を選んだ理由 | 一覧の「決め方の例」のどれに当たるか | 空にする |
| させないこと | 理由 |
|---|---|
| フォームの金額との一致の判定 | 数の比較は規則で行う。AIは読むだけ |
| 読めない数字を推し量って埋める | 「1,9□0円」を1,980円にしない。読めないと返す |
| 一覧に無い科目を作る | 科目は本部の一覧で閉じる |
| 税込・税抜の計算 | 税率ごとの金額が無ければ空のまま |
| 適格請求書の要件を満たすかの判断 | この構成は登録番号の有無を写すまで |
2行目が、この構成でいちばん大事な制約です。 レシートの写真は、折れ・影・感熱紙のかすれで1桁が読めないことがよくあります。AIが前後から推し量って埋めると、フォームの金額と「一致」してしまい、誰も写真を見ないまま台帳に入ります。 読めない桁があれば、合計金額を空にして unreadable を返させます。
指示内容を固定する
あなたは飲食チェーンの本部の経理担当です。
店舗から届いた小口現金の出金の写真を読み、決められた項目を返してください。
写真に写っている文字だけを根拠にしてください。
【書類の種類 document_type】
- receipt ......... レジのレシート
- handwritten ..... 手書きの領収書
- order_or_quote .. 注文の控え、見積書、納品書など、支払の証明でないもの
- other ........... それ以外、または判断できない
【厳守事項】
- 写真から読み取れない項目は空にしてください。
- 数字が1桁でも読めない場合は、その金額を空にし、unreadable_fields に項目名を入れてください。
前後の数字や品目の合計から推し量って埋めないでください。
- 手書きの領収書で金額の欄が空欄の場合は、total を空にし、notes に「金額の欄が空欄」と書いてください。
- 合計金額は、レシートの「合計」「お買上計」など支払額を示す行の値を写してください。
「お預り」「お釣り」の金額と取り違えないでください。
- 税率ごとの金額が印字されていなければ空にしてください。計算しないでください。
- 登録番号は、印字された文字列をそのまま写してください。桁を補わないでください。
- 品目は印字のとおりに写し、最大10行までにしてください。
- 勘定科目は、下の一覧の account_code から1つだけ選んでください。
一覧の「決め方の例」に当たるものがあれば、それに従ってください。
2つ以上の科目に当たりそう、または当たるものが無い場合は undecided にしてください。
迷ったときに近そうな科目を選ばないでください。
- 店長の入力(参考)は、科目を選ぶときの用途の手がかりにだけ使ってください。
写真から読む日付・金額・支払先を、店長の入力に合わせて書き換えないでください。
- 複数枚の写真がある場合は、同じ1枚のレシートを分けて撮ったものか、
別のレシートかを multiple_receipts に書いてください。
【勘定科目の一覧】{account_list}
【店長の入力(参考)】日付 {form_date}/支払先 {form_payee}/金額 {form_amount}/用途 {form_purpose}/メモ {form_memo}
「店長の入力に合わせて書き換えない」を明記するのは、フォームの入力を渡しているからです。 用途は科目を選ぶ手がかりとして要りますが、金額まで見えていると、読みにくい数字をフォームの金額に寄せて読むことが起きます。突き合わせの意味が無くなるので、禁止を書いておきます。
金額をAIに渡さない設計もできます。 その場合は用途とメモだけを渡します。最初の試しでは両方を比べ、寄せて読む傾向が見えたら金額を外します。
出力形式を固定する
構造化出力のスキーマで、次の形を返させます。document_type と account_code は enum にして、一覧の外の値を返せないようにします。
{
"document_type": "receipt | handwritten | order_or_quote | other",
"receipt_date": "",
"payee": "",
"total": "",
"amount_10": "",
"amount_8": "",
"registration_no": "",
"has_registration_no": false,
"items": [""],
"account_code": "5110 | 5210 | 5320 | ... | undecided",
"account_reason": "",
"unreadable_fields": [""],
"multiple_receipts": "single | same_receipt | different_receipts",
"notes": ""
}
金額は文字列で受け取り、スクリプトの側で数にします。空と0を取り違えないためです。
1つ目の理由は、突き合わせを規則で書けることです。 スクリプトは次の順で行の区分を決めます。
| 区分 | 条件 |
|---|---|
| 証憑の欠け | 写真が無い、document_type が order_or_quote か other、手書きで金額の欄が空欄 |
| 要確認 | total が空(読めない)、フォームの金額と total が違う、日付が7日以上違う、account_code が undecided、重複の疑い、different_receipts |
| 一致 | 上のどれにも当たらない |
金額の一致は1円の違いも許しません。 店長の打ち間違いか、AIの読み違いか、どちらかが起きているからです。日付は数日のずれを許します。 店長が報告をまとめて送る日があるためです。
2つ目の理由は、科目の候補を enum で閉じ込められることです。 公式のページでは、構造化出力のスキーマで enum が使えるとされています。一覧に無い科目名が返ってくることが、構造の側で起きなくなります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| フォームの回答のシート | フォーム送信のトリガー、SpreadsheetApp | 回答の受け取り、「処理済み」の記入 |
| ドライブ | DriveApp | 写真の取得 |
| Claude API | UrlFetchApp(/v1/messages) | 写真の読み取りと科目の候補 |
| 台帳のシート | SpreadsheetApp | 一致・要確認の行の追加 |
| 店長 | MailApp | 証憑の欠けの撮り直しの依頼 |
台帳には、AIが読んだ値とフォームの入力の両方を列で残します。 「金額(店長)」「金額(写真)」「科目(候補)」「科目(確定)」のように分け、確定の列は経理だけが埋めます。 一致の行は、日に1回の流し見の後に経理が確定の列へまとめて写します。
撮り直しの依頼のメールには、何が欠けているかだけを書きます。 「写真が付いていません」「写っているのが注文の控えで、レシートではありません」「領収書の金額の欄が空欄です」。依頼のメールはフォームの回答の編集のリンクを付けず、新しく報告し直してもらいます。 元の回答は「撮り直し依頼済み」として残し、新しい回答と紐づけます。
会計ソフトへは書き込みません。 月末に台帳の確定の列から仕訳を起こすのは、これまでどおり人が行います。
人が確認する
- 経理が毎朝「要確認」の行を見る … 写真を開き、フォームの金額と写真の金額のどちらが正しいかを見ます。写真が正しければ台帳を直し、店長に打ち間違いを伝えます
undecidedの科目を決める … 決めた結果のうち、また出そうな品目は勘定科目の一覧の「決め方の例」に足します- 重複の疑いを決める … 同じレシートの写真なら片方を取り消し、別の支出なら両方を残します
- 一致の行を流し見る … 店舗と金額と科目の候補を一覧で見て、確定の列へ写します
- 月末の照合で合わない店舗を見る … 出金の合計と残高の報告の差を、台帳の行から探します
2番目が、この構成を育てる作業です。 決め方の例が増えるほど undecided は減り、2名の付け方のぶれも、例の側で吸収されます。 決めた結果を例に戻さないと、毎月同じ品目で迷います。
例外に対処する
| 起きること | 対応 |
|---|---|
| 写真が付いていない | 証憑の欠け。店長へ撮り直しの依頼を自動で送る |
| HEIC など渡せない形式 | 証憑の欠け。JPEG で撮り直してもらう |
| 写真が10MBを超える、縦横が8000ピクセルを超える | 証憑の欠け。撮り直しを依頼する |
| 写真がぼやけて金額が読めない | 要確認。経理が写真を見て、読めなければ店長に問い合わせる |
| 注文の控え・見積の写真 | 証憑の欠け。レシートを撮り直してもらう |
| 店長・副店長以外のアカウントからの報告 | 処理せず経理へ回す |
| 1件に別々のレシートが2枚 | 要確認。経理が2件に分ける |
| Claude API が応答しない・エラーを返す | 「処理済み」を書かずに残す。翌朝の拾い直しで再処理 |
| 返ってきた JSON がスキーマに合わない | 1回だけやり直し、だめなら要確認 |
| 月末の残高が合わない | 合わない店舗の一覧を経理へ。台帳の行から差を探す |
上から3行は、店舗への最初の案内で大半が防げます。 撮り方の例(レシート全体が入る、影が落ちない、平らに置く)を1枚の画像にして店舗に配ります。AIの読み取りを強くするより、写真の質をそろえるほうが効きます。
記録を残す
- フォームの回答の行の位置、送信日時、送信者
- 写真のファイルのID(写真そのものはドライブに残す)
- AIに渡した指示の版と、返ってきた JSON の全文
- 突き合わせの区分と、どの条件で要確認になったか
- 経理が直した内容 … どの項目を、何から何へ。科目の候補と確定の違い
- 撮り直しの依頼を送った日時と、新しい回答との紐づけ
科目の候補と確定の違いは、月に1回数えます。 候補が外れた品目が多い科目は、一覧の説明が足りていません。外れた品目を例に足すと、翌月の undecided と外れが減ります。
写真はドライブのフォームのフォルダに残り、経理課だけが見られるようにします。 フォームのオーナーのドライブに新しいフォルダができる仕組みなので、オーナーのアカウントを経理課の共有のアカウントにしておきます。 個人のアカウントで作ると、異動のときに写真ごと持ち主が変わります。
04実装レベルの3段階
本記事の想定は半自動化です。 本格構成で会計ソフトの取り込みのファイルを作る部分は、会計ソフトの取り込みの形式に合わせる必要があり、この部分は利用環境に応じた個別確認が必要です。 最小構成では件数がさばけません。 月600件を1枚ずつ貼るのは現実的でなく、読めるかと、科目の付け方が合うかを確かめる段階です。 段階を飛ばさないでください。 半自動化を2〜3か月回すと、写真の質の悪い店舗、undecided の多い品目、店長の打ち間違いの多い店舗が見えてきます。撮り方の案内と科目の一覧の例を先に直してから本格構成に進むと、会計ソフトへ渡す前の手直しが減ります。 要確認の割合が下がらないうちに仕訳の取り込みまでつなぐと、直す場所が台帳と会計ソフトの2か所に増えます。
05工数削減シミュレーション
導入後 600件 × 2分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 飲食店・小売店・介護事業所などを複数運営し、店舗ごとに小口現金を持たせて、急な買い出しや修理の支払を現金で済ませている会社。店舗からの出金の報告がフォームやメールで届き、本部の経理が1件ずつレシートの写真を見て台帳に写し、勘定科目を付けている場合。Google Workspace を使っている場合。
- 店舗の支払をすべて法人カードや経費精算のシステムに寄せ、小口現金を持たせていない場合。店舗が数店で、出金が月に数十件にとどまる場合。レシートの写真を国税関係書類の原本の代わりに保存したい場合(スキャナ保存の要件を満たす仕組みは別に要ります。この構成は確認用の写真を扱います)。
07最小構成で試す方法
- 先月の出金の報告から50件を選ぶ(ぼやけた写真、手書きの領収書、科目に迷った品目を必ず入れる)
- その50件について、台帳に写した金額と科目を書き出しておく
- 手元の Claude の画面に、第7章の指示と科目の一覧を貼り、写真を1枚ずつ渡して JSON で返させる
- 返ってきた金額・日付・科目を、台帳の値と突き合わせる
- 違っていたものを「AIの読み違い」「台帳の側の誤り」「写真が読めない」に分ける
50件のうち、ぼやけた写真が何件あるかを最初に数えてください。 その件数が多ければ、スクリプトより先に、撮り方の案内を店舗に出すほうが効きます。
| 出てきた内容 | 判断 |
|---|---|
| 金額と日付がほぼ一致し、科目も大半が合った | Apps Script でつなぐ段階に進む |
| 読めない数字を推し量って埋めた | 指示の書き方で直る。構成は有効 |
| 科目が担当者の付け方と合わない | 例の不足。 一覧に決め方の例を足して試し直す |
| 写真の質で読めないものが多い | 撮り方の案内が先。AIの問題ではない |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 読めない桁を推し量って埋め、「一致」になる | 推し量りを禁じ、読めない桁があれば金額を空で返させる |
| フォームの金額に寄せて読む | 書き換えを禁じる。傾向が見えたら金額を渡さない |
| 「お預り」の金額を合計と取り違える | 指示で取り違えを名指しで禁じる |
| HEIC の写真が渡せない | カメラの保存の形式を JPEG にしてもらう。届いたら撮り直し |
| 2枚目の写真を落とす | アップロードの値の形をテストの回答で確かめてから取り出す |
| 科目が一覧の外の名前で返る | enum で閉じ込める |
| 同じ報告が2回届く | 店舗・日付・金額で重複の印を付ける。消さない |
| トリガーの失敗で回答が残る | 「処理済み」の列と、毎朝の拾い直し |
| 写真の持ち主が異動で変わる | フォームのオーナーを経理課の共有のアカウントにする |
| 撮り直しの依頼が多すぎて店長が読まない | 欠けの理由を1行で書き、撮り方の例の画像を添える |
上の3行が、金額の誤りのほとんどです。 どれも「数字があるように見える」ことから起きます。読めないものは空で返させ、空なら人が見る、という流れを崩さないことが大事です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 店舗の支出の内容と金額、支払先、報告した社員のアカウント、レシートの写真です。レシートには、カードの下4桁や、ポイントカードの会員番号が印字されていることがあります。
- 写真をAIに渡す範囲を決める … 渡すのはレシートの写真とフォームの入力だけです。台帳や店舗の一覧そのものはAIに渡しません
- API の契約条件を確かめる … Claude の画像の入力の公式のページでは、アップロードされた画像はモデルの学習に使わないとされています。データの保存期間などは、契約する時点の Anthropic の規約で確かめます
- 写真を原本として扱わない … 国税庁は、紙で受け取った国税関係書類をスキャナ等で電子データにして保存するスキャナ保存の制度を案内しています。この構成の写真は確認用で、その要件を満たすようには作っていません。 写真で原本に代えるかは、税理士と要件を確かめてから決めます
- 科目の確定を経理に残す … AIが出すのは候補までです。科目を決めるのは経理で、確定の列は経理だけが書きます
- 報告できる人を絞る … ファイルのアップロードの質問は Google アカウントへのログインが要るので、報告者は会社のアカウントを持つ店長・副店長に限られます。 送信者のアカウントも店舗の一覧と照らします
誤りが起きた場合のリスクは、読み違いの金額が「一致」として台帳に入ることと、科目が誤ったまま月次の数字になることの2つです。 前者は推し量りの禁止と空で返す流れで、後者は確定の列を経理に残すことで防ぎます。
10まず何から始めるか
1週目:勘定科目の一覧を作る
経理の2名で、小口現金で使う科目を10前後に絞り、それぞれに迷いやすい品目と決め方の例を3つ以上書きます。 過去3か月の台帳から、2名で付け方が分かれていた品目を拾うと早く集まります。
2週目:50件で試す
先月の報告から50件を選び、手元の Claude の画面で読ませて、台帳と突き合わせます。読めない数字を埋めていないか、科目が例どおりかを最優先で見ます。
3週目:店舗に撮り方の案内を出す
カメラの保存の形式を JPEG にすること、レシート全体が入るように平らに置いて撮ることを、撮り方の例の画像1枚で全店舗に伝えます。あわせて、フォームのオーナーが経理課の共有のアカウントかを確かめます。
4週目:Apps Script をつなぐ
フォーム送信のトリガーから、Claude API の呼び出し、突き合わせ、台帳への記入までを作ります。最初の2週間は撮り直しの依頼を店長へ送らず、経理の宛先に送ります。 依頼の文面と、欠けの判定が正しいかを先に確かめます。
2か月目: 撮り直しの依頼を店長へ送り始め、要確認の件数と undecided の件数を毎週数えます。3か月目以降: 科目の候補と確定の違いを見て一覧の例を足し、1件5分が何分になったかを実測します。月末の残高の照合で合わない店舗が減り、経理が要確認の行だけを見て1日を終えられるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| インストール型のトリガーが作った人のアカウントで動き、メールもその人のアカウントから送られること。フォーム送信のトリガーがあること。時間主導型のトリガーの時刻が少しずれること(9時の設定で9時から10時)。失敗すると知らせのメールが届くこと | Google Apps Script: Installable triggers | 2026-10-13 |
フォーム送信のトリガーにフォーム側とスプレッドシート側があり、どちらもインストール型だけであること。スプレッドシート側のイベントに namedValues・range・values が入ること | Google Apps Script: Event objects | 2026-10-13 |
| URL Fetch の呼び出しが Google Workspace のアカウントで1日10万回、1回の実行の時間が6分であること | Google Apps Script: Quotas | 2026-10-13 |
| フォームのファイルのアップロードの質問に、回答者の Google アカウントへのログインが要ること。ファイルがドライブの新しいフォルダに保存されること。ファイルの形式・最大数・最大サイズを指定できること | Google ドキュメント エディタ ヘルプ: ファイルのアップロード | 2026-10-13 |
画像を image の内容ブロックとして base64 などで渡せること。対応形式が JPEG・PNG・GIF・WebP であること。API を直接使う場合の1枚の上限が base64 で10MB、縦横の上限が8000×8000ピクセルであること。画像が28×28ピクセルの区画で数えられ、大きな画像は縮めて処理されること。アップロードされた画像を学習に使わないこと | Claude Platform Docs: Vision | 2026-10-13 |
構造化出力が output_config.format に type: "json_schema" を渡す形で一般提供されていること。additionalProperties: false が必要で、enum が使えること | Claude Platform Docs: Structured outputs | 2026-10-13 |
| 紙で受け取った国税関係書類をスキャナ等で電子データにして保存するスキャナ保存の制度が案内されていること | 国税庁: スキャナ保存関係 | 2026-10-13 |
レシートの写真を原本の代わりに保存するかどうか、勘定科目の付け方は、税理士と自社の経理で決めてください。 本記事は確認用の写真を扱う構成です。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1395)についてのご相談はこちらから。
