税理士事務所で、小規模な顧問先から毎月届く手書きの現金出納帳を読み取り、仕訳の下書きにして会計ソフトの取込形式にそろえ、残高の合わない行を拾う
小規模な顧問先から毎月届く手書きの現金出納帳を読み取り、日付・摘要・入出金額を仕訳の下書きにして、会計ソフトの取込形式にそろえます。残高の合わない行は、原因の型を付けて担当者に返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 士業
- 対象部門
- 経理
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 顧問先から預かった出納帳のコピーを、担当者が顧問先のフォルダにスキャンして保存する
- 1行ずつ、日付・摘要・金額を見て、勘定科目と消費税の区分を決め、会計ソフトに打ち込む
- 月末に、会計ソフトの現金の残高と、出納帳の月末の残高を比べる
- 合わなければ、出納帳の残高を行ごとに電卓で検算し、どこで食い違ったかを探す
- 打ち込みの誤りなら直し、顧問先の書き間違いや書き漏れらしければメモする
- 摘要だけでは科目が決まらない行と、書き漏れらしい行を、顧問先への質問の一覧にする
- 次の訪問か電話で顧問先に確かめ、答えを受けて仕訳を直す
- 人担当者が出納帳のコピーを複合機でスキャンし、顧問先のフォルダの「出納帳_取込」に保存する
- 自動Apps Script の時間主導型トリガーが15分おきに各顧問先の取込フォルダを見て、新しいファイルを拾う
- 自動Document AI が出納帳を読み、表のセル・全文のテキスト・位置・信頼度を返す
- 自動Apps Script が表の行を「月日・摘要・入金・出金・残高」の列に並べ直し、数字を数値に直す
- 自動Apps Script が前月の確定した残高から行ごとに残高を計算し、顧問先の書いた残高と比べて食い違いの型を付ける
- 自動Apps Script が顧問先ごとの摘要と科目の対応表を引き、当たらなかった摘要だけを Gemini API に渡す
- 自動Gemini API が、摘要を勘定科目の候補に対応付け、根拠の語を返す
- 自動Apps Script が会計ソフトの取込形式の下書きと、確認の一覧を書き出す
- 人担当者が確認の一覧を見て、食い違いの行を画像で確かめ、科目の候補を確定する
- 人担当者が取込用の CSV を会計ソフトに取り込み、顧問先への質問を送る
各工程の詳しい説明を読む
- 顧問先から預かった出納帳のコピーを、担当者が顧問先のフォルダにスキャンして保存する
- 1行ずつ、日付・摘要・金額を見て、勘定科目と消費税の区分を決め、会計ソフトに打ち込む
- 月末に、会計ソフトの現金の残高と、出納帳の月末の残高を比べる
- 合わなければ、出納帳の残高を行ごとに電卓で検算し、どこで食い違ったかを探す
- 打ち込みの誤りなら直し、顧問先の書き間違いや書き漏れらしければメモする
- 摘要だけでは科目が決まらない行と、書き漏れらしい行を、顧問先への質問の一覧にする
- 次の訪問か電話で顧問先に確かめ、答えを受けて仕訳を直す
(a)1行ずつの打ち込みが終わらない。 1件あたり40〜80行、40件で月に2,000行を超えます。月初の1〜2週間に集中し、試算表を顧問先へ返すのが月の半ばを過ぎます。
(b)残高の食い違いの原因探しに時間がかかる。 4番の検算は、合わない理由が自分の打ち込みか、顧問先の計算か、書き漏れかが分からないまま始まります。 1件で30分かかる月もあります。
(c)手書きの数字が読みにくい。 「1」と「7」、「0」と「6」、桁の区切りの無い数字、書き直した跡。読み違えたまま打ち込むと、4番で自分の誤りを探すことになります。
(d)科目の付け方が担当者ごとに違う。 「○○商店 食材」を仕入にする人と、消耗品にする人がいます。顧問先ごとの決まりは、担当者の記憶とメモに残っているだけです。
- 【人】 担当者が出納帳のコピーを複合機でスキャンし、顧問先のフォルダの「出納帳_取込」に保存する
- 【自動】 Apps Script の時間主導型トリガーが15分おきに各顧問先の取込フォルダを見て、新しいファイルを拾う
- 【自動】 Document AI が出納帳を読み、表のセル・全文のテキスト・位置・信頼度を返す
- 【自動】 Apps Script が表の行を「月日・摘要・入金・出金・残高」の列に並べ直し、数字を数値に直す
- 【自動】 Apps Script が前月の確定した残高から行ごとに残高を計算し、顧問先の書いた残高と比べて食い違いの型を付ける
- 【自動】 Apps Script が顧問先ごとの摘要と科目の対応表を引き、当たらなかった摘要だけを Gemini API に渡す
- 【自動】 Gemini API が、摘要を勘定科目の候補に対応付け、根拠の語を返す
- 【自動】 Apps Script が会計ソフトの取込形式の下書きと、確認の一覧を書き出す
- 【人】 担当者が確認の一覧を見て、食い違いの行を画像で確かめ、科目の候補を確定する
- 【人】 担当者が取込用の CSV を会計ソフトに取り込み、顧問先への質問を送る
5番目が、この設計の分かれ目です。 残高の検算を、打ち込みの後ではなく読み取りの直後に機械で行います。 担当者が画面を開いた時には、どの行で食い違ったか、どの型らしいかが並んでいます。
10番目の取り込みを人に残すのも、意図してのことです。 取り込んだ仕訳は試算表になり、顧問先の申告の数字につながります。 確かめてから取り込みます。
02今回想定するシステム構成
手書きの現金出納帳(コピー、1か月分で2〜4ページ) │ 事務所の複合機でスキャン ▼【トリガー】Apps Script の時間主導型トリガー(15分おき) Google Apps Script ── 形式・ページ数の確認 ▼ Google Document AI(Form Parser) │ 表のセル・全文のテキスト・位置・信頼度を返す ▼ Google Apps Script ── 列への並べ直し、残高の検算 │ ok/ocr_suspect/client_calc_error/possible_omission ▼ Google Apps Script ── 摘要と科目の対応表を引く ▼ Gemini API ── 対応表に当たらなかった摘要だけ、勘定科目の候補に対応付ける ▼ Google Apps Script ── 取込形式の下書きと確認の一覧を書き出す ▼ 【人が食い違いの行と科目を確かめ、会計ソフトへ取り込む】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Gemini API(摘要の勘定科目の候補への対応付け) | Claude API、OpenAI API |
| 差異計算 | Google Apps Script(残高の検算と食い違いの型の判定) | Python |
| 連携 | Google Apps Script(取込フォルダの監視、対応表の照合、取込形式の書き出し) | Python |
| 保管 | Google ドライブ(顧問先ごとのフォルダ)、Google スプレッドシート | 会計ソフトの証憑の保管機能 |
新しく作るのは、顧問先ごとの摘要と科目の対応表です。 「○○商店」「ガソリン」「切手」のような摘要の語と、科目・消費税の区分を並べた表で、担当者の記憶とメモにあった決まりを表に移します。 確定した科目は月ごとにこの表へ足していきます。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCRのテキストに加えてキーと値のペア、表、一般的なエンティティを抽出するとされ、言語の一覧で日本語(ja)は手書きに対応する言語として示されています。 出納帳は罫線で区切られた表なので、表の抽出をそのまま使えます。
ただし、表は単純なものに限られます。 公式には、行や列をまたぐセルの無い単純な表から抽出するとされています。市販の出納帳には「月日」の見出しが「月」と「日」の2列にまたがるものがあり、見出しの結合で表として取れないことがあります。 そのときは、全文のテキストの位置から列を割り当てる方法に切り替えます(第7章)。
03どうやって実装するのか
処理の起点を決める
担当者が出納帳のコピーを顧問先のフォルダの「出納帳_取込」に保存することを起点にします。 Apps Script の時間主導型トリガーが15分おきに、全顧問先の取込フォルダを順に見ます。ファイル名は「顧問先コード_年月」にし、何月分の出納帳かをファイル名で決めます。
1回の実行で処理する件数に上限を置きます。 Apps Script の1回の実行は6分までとされています。1件で2〜4ページ、Document AI と Gemini API を呼ぶので、1回に3件までとし、残りは次の実行に回します。 処理済みのフォルダへ移すのは、取込形式の下書きと確認の一覧の書き込みまで成功したときだけにします。
月初に預かった分は、預かった日のうちにスキャンします。 1か月分を月の半ばにまとめると、今の打ち込みの集中がそのまま残ります。訪問のときに顧問先の店で預かる場合は、事務所に戻ってからスキャンし、スマートフォンの写真では取り込みません。 斜めの写真は列の位置での割り当てが崩れるためです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 出納帳のPDF | 1か月分の出納帳。顧問先コード、年月 | 取込フォルダ |
| 読み取り結果 | 表のセル、全文のテキスト、トークンごとの位置と信頼度 | Document AI(Form Parser) |
| 前月の確定した残高 | 前月の会計ソフトの現金の月末残高 | 前月の確認の一覧(担当者が確定した値) |
| 摘要と科目の対応表 | 摘要の語、科目、消費税の区分、最後に確定した日 | 顧問先ごとのスプレッドシート |
| 帳面の列の位置 | その顧問先の帳面の、列ごとの横の位置の範囲 | 顧問先ごとに1回登録する |
| 取込形式の定義 | 会計ソフトの取込 CSV の列の並びと書式 | 事務所で用意する定義 |
質を決めるのは、前月の確定した残高です。 検算の起点が出納帳の「前月繰越」の行だけだと、顧問先が繰越を書き間違えた月に、全行が食い違いになります。 起点は前月に担当者が確定した値に置き、出納帳の繰越の行はそれと比べる対象にします。
帳面の列の位置は、表として取れなかったときのために持ちます。 市販の帳面は顧問先ごとに決まっているので、最初の1回に列の境目を登録すれば、翌月からはそのまま使えます。
データの取得方法を決める
読み取りは、Apps Script から Document AI の処理の API を呼ぶだけです。ファイルを渡すと、Document という形の応答が返ります。
| 取るもの | 応答のどこから | 何に使うか |
|---|---|---|
| 表 | pages[].tables[] の headerRows と bodyRows のセル | 行ごとの月日・摘要・入金・出金・残高 |
| 全文のテキスト | text と、各要素の textAnchor | セルの中身の文字 |
| 位置 | 各要素の layout の boundingPoly(normalizedVertices) | 表として取れなかったときの列の割り当て |
| 信頼度 | 各要素の layout の confidence | 数字ごとの読み取りが確かかの判定 |
位置は、ページの左上を原点とする値で返ります。 表として取れなかったページは、全文のテキストの行ごとに横の位置を見て、登録した列の位置の範囲に当てはめて「入金」「出金」「残高」を決めます。 金額の列を取り違えると入金と出金が逆になるので、範囲の境目に近い数字は column_uncertain の印を付けます。
信頼度は、行ではなく金額の欄ごとに持ちます。 残高が合わない行で、どの欄の信頼度が低いかを見れば、読み取りの誤りか、顧問先の書いた数字そのものの問題かの手がかりになります。
AIへ渡す前に整形する
- 形式の確認 … Document AI の対象は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などです。複合機の保存形式は PDF にします
- 解像度の確認 … 公式には、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよい結果になるとされています。複合機を300dpiに設定します
- 圧縮の確認 … 非可逆の形式は画質と精度を落とすことがあるとされています。「高圧縮」の設定を使いません
- ページの順の確認 … ページの見出しの年月と、最初の行の月日で順を確かめます
- 数字の正規化 … 「1,200」「1200」「1.200」のような区切りを除き、全角を半角に直して数値にします。 正規化できない文字が混ざる欄は数値にせず、そのまま残します
- 書き直しの検知 … 二重線で消した数字の上に書き直した欄は、文字が2つ重なって読まれます。1つの欄に数字の塊が2つあれば
overwrittenの印を付けます
6番目を軽く見ないでください。 書き直しの欄を1つの数字として読むと、桁が倍になった金額が生まれます。残高の食い違いの原因として、いちばん見つけにくい型です。
AIに処理させる
させるのは、対応表に当たらなかった摘要を、勘定科目の候補に対応付けることだけです。 金額の読み取り、残高の計算、食い違いの判定はさせません。
| させること | 中身 | 判断できないときの扱い |
|---|---|---|
| 勘定科目の候補 | 摘要の語から、顧問先の科目の一覧の中の候補を1つ | 決められなければ undecided |
| 消費税の区分の候補 | 科目と摘要から、事務所の区分の一覧の中の候補 | 決められなければ undecided |
| 根拠の語 | 判断に使った摘要の中の語 | 必ず埋める |
| 顧問先への質問の要否 | 摘要だけでは決まらないかどうか | 迷えば ask_client |
候補は、顧問先の科目の一覧の中からしか選ばせません。 一覧に無い科目名を作らせると、取込のときに会計ソフトの科目と合わず、取り込みが止まるか、新しい科目が勝手にできます。
| させないこと | 理由 |
|---|---|
| 金額の読み直し・修正 | 読み取りは Document AI、数値への変換は規則で行う |
| 残高の計算 | 検算は Apps Script の規則。計算の過程を残す |
| 合わない行の金額の推測 | 合うように書き換えると、顧問先の書き間違いが消える |
| 書き漏れの取引の補完 | 漏れは顧問先に確かめる。仕訳を作らせない |
| 科目の確定 | 確定は担当者。対応表への追加も担当者が行う |
3行目がいちばん起きやすい失敗です。 残高の合わない行を見せると、AIは「入金は3,800円の誤りと思われます」と書いてきます。それが正しくても、顧問先が実際に何を書いたかという記録が消えます。 だから、AIには金額も残高も渡しません。渡すのは摘要の文字だけです。
指示内容を固定する
あなたは税理士事務所で、顧問先の現金出納帳の摘要を読み、
勘定科目の候補を付ける立場です。
渡された摘要の文字だけを見てください。推測で埋めないでください。
【やること】
1. 各行の摘要について、下の科目の一覧から勘定科目の候補を1つ選んでください。
2. 下の区分の一覧から、消費税の区分の候補を1つ選んでください。
3. 判断の根拠にした摘要の中の語を basis に写してください。
【厳守事項】
- 科目と区分は、必ず一覧の中から選んでください。一覧に無い名前を作らないでください。
- 摘要だけでは決められないときは undecided にし、ask_client を true にしてください。
迷ったときに、それらしい科目を選ばないでください。
- 金額、残高、日付については何も書かないでください。
- 取引の内容を摘要の文字以上に補って説明しないでください。
- 同じ摘要の語でも、顧問先の業種によって科目が違うことがあります。
下の業種を踏まえ、決められなければ undecided にしてください。
【顧問先の業種】{client_industry}
【科目の一覧】{account_list}
【区分の一覧】{tax_class_list}
【摘要(行番号つき)】{descriptions}
「金額について何も書かない」を明記するのは、渡していなくても書くからです。 摘要に「釣銭補充」とあれば、AIは「現金の移動なので残高に影響しない」と添えます。担当者がそれを読むと、検算の結果より先に、AIの説明を信じたくなります。
「迷ったときにそれらしい科目を選ばない」も同じ理由です。 「○○さん 立替」のような摘要は、顧問先に聞かないと科目が決まりません。選ばせると、聞くべき行が確認の一覧から消えます。
出力形式を固定する
Gemini API の構造化出力で、次の形のJSONに固定して受け取ります。 公式には、Interactions の response_format に JSON スキーマを渡すと、そのスキーマに従う応答を生成させられるとされ、enum で値の候補を限り、required で必須の項目を決められます。科目の一覧と区分の一覧は、顧問先ごとにスキーマの enum に入れます。
{
"rows": [{
"row_no": 0,
"account": "<科目の一覧の値> | undecided",
"tax_class": "<区分の一覧の値> | undecided",
"basis": "",
"ask_client": false
}]
}
金額と残高は、このJSONには入りません。 Apps Script が表から作った行の記録と、row_no でつなぎます。
| 食い違いの型 | 付ける条件(Apps Script が決める) |
|---|---|
ok | 前の行の残高+入金-出金が、この行の残高と一致する |
ocr_suspect | 一致しない行で、金額の欄の信頼度が基準を下回る、または overwritten・column_uncertain の印がある |
client_calc_error | 一致しない行で、信頼度が十分あり、次の行からは顧問先の残高どおりに計算が続く |
possible_omission | 一致しない差額が、その後の行でもずっと残り続ける |
carry_over_diff | 出納帳の前月繰越が、前月の確定した残高と合わない |
negative_balance | 計算上の残高がマイナスになる |
この表が、出力を分けた理由です。 食い違いの型は、金額と信頼度だけで決まる規則で、AIの判断が入りません。client_calc_error は1行だけで計算を誤り、次の行からはその誤った残高を起点に書き続けている型です。差額がその行だけで閉じているか、後ろへ持ち越されているかで、書き間違いか書き漏れかを分けます。
例で見ると分かりやすくなります。 5日の行で顧問先の残高が計算より1,000円少なく、6日の行からは顧問先の残高を起点にすると計算が合う。これは5日の行だけの計算違いです。一方、5日から月末まで計算より1,000円少ないまま続くなら、5日より前に1,000円の出金が書かれていないか、5日の入金が1,000円多く書かれています。前者は担当者が直せ、後者は顧問先に聞くしかありません。
negative_balance は書き漏れの強い手がかりです。 手元の現金がマイナスになることは無いので、その日までに書かれていない入金があるはずです。 公式にも、構文として正しいJSONでも値はアプリケーションの側で検証するよう書かれています。科目の候補が一覧の中にあるかも、Apps Script がもう一度確かめます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 取込フォルダ | Apps Script の時間主導型トリガー | 新しい出納帳の PDF を拾う |
| Document AI | API呼び出し | 表のセル・全文のテキスト・位置・信頼度を返す |
| 摘要と科目の対応表 | スプレッドシートの読み取り | 当たった摘要は対応表の科目を使う |
| Gemini API | API呼び出し(構造化出力) | 対応表に当たらなかった摘要だけ、科目の候補を返す |
| 確認の一覧 | スプレッドシートへの書き込み | 行ごとの読み取り値、食い違いの型、科目の候補、画像へのリンク |
| 取込形式の下書き | CSV の書き出し | 確定した行だけを、会計ソフトの取込の列の並びで |
| 会計ソフト | 書き込まない | 取り込みは担当者が行う |
対応表に当たった摘要は、Gemini API に渡しません。 毎月同じ「○○商店」「電気代」が並ぶ顧問先では、2か月目から AI に渡る行が大きく減ります。 費用と、科目がぶれる余地の両方が減ります。
取込形式の CSV は、担当者が確定の列に印を付けた行だけで作ります。 列の並びは会計ソフトによって違うので、事務所で使っている会計ソフトの取込の説明に合わせて定義を作ります。
人が確認する
人が見るのは、食い違いのある行と、undecided の行だけです。 ok で対応表の科目が当たった行は、一覧で流し見て確定の印を付けます。全行を画像と見比べる設計にすると、第10章の10.0時間には収まりません。
ocr_suspectを画像で見る … 読み取りの誤りなら値を直します。直した値で検算をやり直し、okになるかを見ますclient_calc_errorを確かめる … 顧問先の書き間違いと確かめたら、正しい残高で仕訳を作り、顧問先への連絡に「○日の残高の計算違い」と書きますpossible_omissionとnegative_balanceを顧問先への質問にする … 書き漏れの取引は、事務所で仕訳を作らず、顧問先に聞きます- 科目の候補を確定する …
undecidedとask_clientの行を決め、確定した摘要を対応表に足します - 取込用の CSV を作って取り込む … 取り込んだ日時と件数を一覧に残します
3番目を省かないでください。 差額だけ「雑費」や「事業主貸」で埋めれば残高は合いますが、その月の売上や経費が抜けたまま申告の数字になります。 書き漏れの判断は顧問先に確かめてからです。
目標は、40件をならして1件15分です。 食い違いと undecided が全行の1割前後という想定で、それより多い顧問先は、帳面の書き方か列の位置の登録を見直します。
例外に対処する
| 起きること | 対応 |
|---|---|
| 見出しの結合で表として取れない | 登録した列の位置で割り当てる。境目に近い数字は column_uncertain |
| 列の位置が登録されていない帳面 | 割り当てをせず、担当者に列の境目の登録を頼む |
| 1つの欄に書き直しが重なる | overwritten。数値にせず画像で確かめる |
| 前月繰越が前月の確定値と合わない | carry_over_diff。検算は確定値を起点に続ける |
| 1ページだけ別の月が混ざる | ページの見出しの年月で分け、別の月のページは人へ |
| 摘要が空欄の行 | 科目の候補を出さず ask_client |
| 出納帳でない書類(領収書の束など) | 表の列が見つからない。処理せず担当者へ |
| APIが応答しない、6分を超える | 取込フォルダに残す。処理済みへ移すのは書き込み成功時だけ |
4行目がいちばん大事な例外です。 繰越を出納帳の値で始めると、顧問先が繰越を1か所書き間違えただけで全行が食い違いになり、本当の書き漏れが埋もれます。
記録を残す
- 元の出納帳の PDF と、預かった日・スキャンした日時
- Document AI が返した
DocumentのJSONの全文 - Apps Script が作った行の記録(読み取り値、数値への変換の結果、信頼度、印)と、検算の過程
- Gemini API に渡した摘要と、返ってきたJSON
- 担当者が直した値・確定した科目と、その日時・担当者
- 顧問先に質問した内容と、その答え
3つ目の検算の過程は、顧問先への説明に使います。 「○日の行で残高が1,000円ずれ、そのまま月末まで続いています」と、行と金額で示せば、顧問先も帳面を見て思い出しやすくなります。
保存の期間は、事務所と顧問先の取り決めで決めます。 国税庁のページでは、個人で事業を行う方の帳簿は法定帳簿が7年、任意帳簿が5年の保存とされています。原本の出納帳は顧問先に返し、事務所のPDFとJSONの扱いを契約で決めておきます。
04実装レベルの3段階
半自動化で、1件60分が30分程度になります。 打ち込みと検算は自動になりますが、科目を1行ずつ考えて会計ソフトに入れる作業が残ります。本格構成で15分になり、この段階が本記事の想定です。 差が大きいのは、対応表が育つにつれ、科目を考える行が減っていくからです。 段階を飛ばさないでください。 半自動化の検算の結果を1か月見ると、ocr_suspect の多い顧問先と、client_calc_error の多い顧問先が分かれます。前者はスキャンと帳面、後者は顧問先への記帳の助言で直ります。
05工数削減シミュレーション
導入後 40件 × 15分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 飲食店・小売店・個人の工務店など、現金の取引が多い小規模な顧問先から、手書きの現金出納帳のコピーやスキャンを毎月預かって記帳を代行している税理士事務所・会計事務所。担当者が出納帳を1行ずつ会計ソフトへ打ち込み、顧問先の書いた残高と打ち込んだ残高の食い違いを探すのに時間がかかっている場合。Google Workspace を使っている場合。
- 顧問先がすでに会計ソフトやレジのデータで現金の取引を記録しており、手書きの出納帳が届かない場合。手書きの出納帳を預かる顧問先が数件で、手入力で足りる場合。なお、勘定科目と消費税の区分の最終判断、帳簿として何をどう記載するかの判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の出納帳から、残高の食い違いがあった顧問先を含めて5件を選ぶ
- 顧問先の名前と、摘要の中の個人名を紙で隠してからスキャンする
- 1件ずつ、手元のAIサービスの画面に画像を貼り付ける
- 「この現金出納帳を、月日・摘要・入金・出金・残高の表にしてください。数字は書かれたとおりに写し、計算や修正をしないでください。読めない数字は『?』にしてください」と指示する
- 出てきた表を表計算に貼り、前の行の残高+入金-出金の列を自分で足して、会計ソフトの打ち込み済みの値と比べる
| 出てきた内容 | 判断 |
|---|---|
| 数字が書かれたとおりに写り、食い違いの行が当時と同じだった | OCRとワークフローの連携に進む |
| 残高を計算し直して書き換えた | 指示の書き方で直る。構成は有効。 本格構成では金額をAIに渡さない |
| 手書きの数字が読めない行が多い | スキャンの設定と帳面が先。 AIの問題ではない |
5番目の検算は、表計算でかまいません。 試す段階で見たいのは、読み取った数字で検算が回るかです。科目の付け方は、その後で試します。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 残高が合うようにAIが金額を書き換える | 金額と残高をAIに渡さない。 渡すのは摘要だけ |
| 見出しの結合で表として取れない | 単純な表に限られる。列の位置を登録して割り当てる |
| 入金と出金の列を取り違える | 境目に近い数字に column_uncertain を付けて人へ |
| 書き直しの欄が桁の多い金額になる | overwritten を検知し、数値にしない |
| 繰越の書き間違いで全行が食い違う | 検算の起点を前月の確定値に置く |
| 書き漏れの差額を雑費で埋める | possible_omission は顧問先に聞く。事務所で仕訳を作らない |
| 一覧に無い科目名が作られる | 科目の一覧をスキーマの enum に入れ、Apps Script でも確かめる |
| 同じ摘要の科目が担当者でぶれる | 確定した科目を対応表に足し、2か月目からは表を優先する |
| 6分の上限で処理が途中で止まる | 1回3件に区切り、処理済みへ移すのは成功時だけ |
上の2行が、この構成の失敗のほとんどです。 前者は顧問先の書いた事実を消す誤り、後者は検算そのものが回らない誤りで、どちらも「残高が合わない理由を分ける」という目的を壊します。
6行目は、忙しい月ほど起きます。 差額を埋めれば月次の締めは早く終わりますが、埋めた差額は、売上の計上漏れかもしれません。 書き漏れは顧問先に聞くところまでを、この構成の範囲にします。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧問先の日々の現金の出入り、取引先の名前、摘要に書かれた従業員や家族の名前、売上の金額です。顧問先の経営の情報そのものです。
- Gemini API は有料の枠で使う … 公式の利用規約では、有料のサービスではプロンプトと応答を製品の改善に使わないとされる一方、無料のサービスでは改善に使われ、人が読むことがあるとされ、機密の情報や個人情報を送らないよう求めています。請求先のアカウントを付けたプロジェクトから呼びます
- 生成AIに渡すのは摘要の文字だけにする … 金額、残高、顧問先の名前は渡しません。対応表に当たった摘要も渡しません
- 摘要の中の個人名に気をつける … 「○○さん 給料」のような摘要は、Apps Script で人名らしい語を伏せてから渡す設計にできます
- 会計ソフトへ自動で取り込まない … 取り込みは担当者が確かめてからです。取り込んだ仕訳は申告の数字につながります
- 顧問先ごとにフォルダの権限を分ける … 担当者が自分の顧問先のフォルダだけを見られるようにします
- 保存の期間と扱いを契約で決める … 帳簿の保存の義務は顧問先にあります。事務所が持つ PDF とJSONの保存と消し方を、記帳代行の契約で決めます
- この構成は記帳と税務の判断を代替しない … 勘定科目と消費税の区分の確定、書き漏れの取引の扱いは、担当者と税理士が顧問先に確かめて決めることです。 この構成が出すのは、帳面に何が書かれ、どこで残高がずれたかという事実と、科目の候補だけです
誤りが起きた場合のリスクは、書き漏れを埋めて申告の数字が欠けることと、読み取りの誤りを顧問先の誤りとして伝えることの2つです。 前者は差額をAIにも担当者にも埋めさせないことで、後者は信頼度で ocr_suspect を分けることで防ぎます。
10まず何から始めるか
1週目:対応表を作る
手書きの出納帳を預かる顧問先のうち、行数の多い上位10件について、先月の仕訳から摘要と科目の対応表を作ります。会計ソフトの仕訳の一覧を出力し、摘要と科目の組を並べれば、多くはそのまま使えます。
2週目:5件で試す
先月の出納帳から5件を選び、名前を隠してから手元のAIサービスで表にさせ、表計算で検算します。数字を書き換えていないか、読めない数字を推し量っていないかを最優先で見ます。
3週目:スキャンの設定と列の位置を決める
複合機を300dpi・PDFで顧問先のフォルダへ保存する設定にします。上位10件の帳面について、表として取れるかを試し、取れない帳面は列の境目を登録します。
4週目:取込フォルダから検算までをつなぐ
Apps Script で取込フォルダを見張り、Document AI を呼び、行の記録と検算の結果を確認の一覧に書き出すところまで作ります。この時点では科目の候補を出さず、食い違いの型が当時の原因と合うかだけを見ます。
2か月目: 対応表と Gemini API による科目の候補を足し、取込形式の下書きを出します。3か月目以降: 残りの顧問先に広げ、1件60分が何分になったかを実測します。残高の合わない理由が、担当者が画面を開く前に型で分かれて並ぶようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser がOCRのテキストに加えてキーと値のペア、表、一般的なエンティティを抽出すること。言語の一覧で日本語(ja)が手書きに対応する言語として示されていること | Google Cloud: Processor list | 2026-10-06 |
| 表は行や列をまたぐセルの無い単純な表から抽出すること | Google Cloud: Form Parser | 2026-10-06 |
表が headerRows と bodyRows のセルで返ること。textAnchor、boundingPoly(normalizedVertices、ページの左上が原点)、信頼度が返ること | 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 |
| 個人で事業を行う方の記帳の内容(取引の年月日、相手方、金額、日々の合計金額など)、日々の合計金額をまとめて記載するなどの簡易な方法が認められていること、帳簿の保存期間(法定帳簿7年、任意帳簿5年) | 国税庁: 個人で事業を行っている方の記帳・帳簿等の保存について | 2026-10-06 |
勘定科目・消費税の区分の判断と、記帳代行で預かる書類の扱いは、担当の税理士と顧問先との取り決めで決めてください。 本記事は各製品と国税庁の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0591)についてのご相談はこちらから。
