チラシのポスティングを請け負う会社で、配布員が手書きする配布報告書を読み取り、地区・配布枚数・不配の理由を配布実績の台帳にそろえ、広告主への報告の前に計画との差を拾う
配布員が手書きする配布報告書を読み取り、町丁目ごとの配布枚数・残数・不配の理由を配布実績の台帳にそろえます。広告主へ完了報告を出す前に、計画との差、枚数の合わない報告、報告の無い地区を拾います。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/広告
- 対象部門
- 営業
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 配布員が配布指示書とチラシを受け取り、町丁目を回って配る
- 配布員が配布報告書に、町丁目ごとの配布日、配った枚数、残数、不配の理由を書いて回収箱に入れる
- 営業部の担当が翌朝に回収し、1枚ずつ台帳の計画の行を探して実績を書き写す
- 渡した枚数と、配った枚数・残数の合計が合うかを、気づいたときに電卓で確かめる
- 不配の理由を、担当の判断で台帳の理由の欄に書き換える
- 配布期間が終わった広告主について、町丁目ごとの実績を集計して完了報告を作る
- 計画どおりに配れていない町丁目があれば、完了報告に理由を書き添える
- 人配布員は今までどおり報告書を書いて回収箱に入れる
- 人営業部の担当が朝に回収し、複合機でまとめてスキャンして取込フォルダに保存する
- 自動Python のスクリプトが取込フォルダを見て、Document AI の Form Parser に渡す
- 自動Form Parser が、配布員・指示書番号の欄、町丁目ごとの表、信頼度を返す
- 自動Claude API が、表の行を町丁目・配布日・配布枚数・残数・不配の理由の区分にそろえる
- 自動Python が、指示書番号で計画の行に結び付け、渡した枚数との差を計算して台帳に書き込む
- 自動毎日昼に、「枚数の合わない報告」「報告の無い町丁目」「不配の多い町丁目」の一覧を営業部に送る
- 人担当が一覧を見て、配布員に電話で確かめる。配布期間の終わった広告主には完了報告を作って送る
各工程の詳しい説明を読む
- 配布員が配布指示書とチラシを受け取り、町丁目を回って配る
- 配布員が配布報告書に、町丁目ごとの配布日、配った枚数、残数、不配の理由を書いて回収箱に入れる
- 営業部の担当が翌朝に回収し、1枚ずつ台帳の計画の行を探して実績を書き写す
- 渡した枚数と、配った枚数・残数の合計が合うかを、気づいたときに電卓で確かめる
- 不配の理由を、担当の判断で台帳の理由の欄に書き換える
- 配布期間が終わった広告主について、町丁目ごとの実績を集計して完了報告を作る
- 計画どおりに配れていない町丁目があれば、完了報告に理由を書き添える
(a)枚数の引き算が後回しになる。 3番の書き写しに時間を取られ、4番は「気づいたとき」になります。合わない報告が見つかるのは、6番で集計した合計が計画と合わないときです。 そのころには配布から1週間以上たち、配布員に聞いても覚えていません。
(b)報告の無い町丁目が見えない。 届いた報告書を書き写す作業では、届かなかった報告書は目に入りません。 配布員が報告書を出し忘れた町丁目は、台帳の上で空欄のまま、完了報告の集計で初めて見つかります。
(c)不配の理由の書き方がばらばら。 「お断り」「チラシ×」「投函禁止」は同じ理由ですが、担当によって台帳への書き換え方が違います。広告主への説明が、担当によって変わります。
(d)完了報告が遅れる。 配布期間が終わってから集計と確かめを始めるので、広告主への完了報告は期間の終わりから数日後になります。 新しいチラシの反響を早く知りたい広告主ほど、この遅れを気にします。
- 【人】 配布員は今までどおり報告書を書いて回収箱に入れる
- 【人】 営業部の担当が朝に回収し、複合機でまとめてスキャンして取込フォルダに保存する
- 【自動】 Python のスクリプトが取込フォルダを見て、Document AI の Form Parser に渡す
- 【自動】 Form Parser が、配布員・指示書番号の欄、町丁目ごとの表、信頼度を返す
- 【自動】 Claude API が、表の行を町丁目・配布日・配布枚数・残数・不配の理由の区分にそろえる
- 【自動】 Python が、指示書番号で計画の行に結び付け、渡した枚数との差を計算して台帳に書き込む
- 【自動】 毎日昼に、「枚数の合わない報告」「報告の無い町丁目」「不配の多い町丁目」の一覧を営業部に送る
- 【人】 担当が一覧を見て、配布員に電話で確かめる。配布期間の終わった広告主には完了報告を作って送る
6番目の引き算を、報告書が届いた日に済ませるのがこの設計の要です。 合わない報告は、配布員の記憶が新しい翌日のうちに確かめられます。 「残数を書き忘れた」「別の町丁目の行に書いた」といった理由の多くは、その場で分かります。
7番目の「報告の無い町丁目」は、届いた紙からは作れない一覧です。 計画の行のうち、配布日を過ぎても実績の入らない行を数えます。台帳に計画の行があるから、届かなかった報告書が見えるようになります。
02今回想定するシステム構成
配布報告書(1人1日1枚、手書き) │ 営業部が朝にまとめてスキャン ▼【トリガー】Python のスクリプト(取込フォルダを15分ごとに確認、事務所のPCで定時実行) Python ── 形式・画質・ページの確認、1枚ずつに分割 ▼ Google Document AI(Form Parser) │ 配布員・指示書番号の欄、町丁目ごとの表、信頼度 ▼ Claude API ── 構造化出力で台帳の形にそろえる │ 町丁目/配布日/配布枚数/残数/不配の理由の区分 ▼ Python ── 指示書番号で計画の行に結び付け、差を計算 ▼ 配布計画・実績の台帳 ──【毎日昼】一覧を作る ├──▶ 枚数の合わない報告 ├──▶ 報告の無い町丁目 └──▶ 不配の多い町丁目 ▼ 【営業部が配布員に確かめる】──【完了報告を作って広告主へ】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(表の行を台帳の形にそろえる) | OpenAI API、Gemini API |
| 連携 | Python(フォルダの監視、台帳への書き込み、計画との照合) | Google Apps Script |
| 集計 | Python(差の計算と毎日の一覧) | Google Apps Script |
| 保管 | 事務所のファイルサーバー | Google ドライブ |
新しく作るのは、配布指示書の番号と、不配の理由の区分の一覧の2つです。 指示書には今も通し番号がありますが、報告書に書く欄がありません。 報告書の上部に「指示書番号」の欄を足し、指示書の側に印字した番号を書き写してもらいます。番号が報告書と計画の行を結ぶ鍵になります。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCRのテキストに加えて、キーと値のペア、チェックボックス、表を抽出するとされ、言語の一覧で日本語(ja)は手書きに対応する言語として示されています。報告書の上部の「配布員」「指示書番号」はキーと値のペアとして、町丁目ごとの行は表として読めます。
Form Parser の注意書きのうち、この題材で効くのは表の制限です。 公式のページでは、行や列をまたぐセルの無い、単純な表から抽出するとされています。いまの報告書は、広告主の名前の欄を縦に結合しているので、この結合をなくして1行1町丁目の格子にします。
処理する場所は、リージョンの一覧から選びます。 マルチリージョンの us と eu、シンガポール(asia-southeast1)などの単一リージョンがあり、日本のリージョンはありません。 報告書に書かれるのは配布員の氏名と町丁目の名前で、国外で処理することは社内で確かめておきます。
03どうやって実装するのか
処理の起点を決める
営業部の担当が朝に回収箱から報告書を出し、複合機でまとめてスキャンして取込フォルダに保存することを起点にします。 報告書は1人1日1枚なので、束のまま両面なしで通し、1つのPDFにします。 ファイル名にはスキャンした日付を入れます。
Python のスクリプトを、事務所のPCで15分ごとに定時実行します。 新しいPDFがあれば、ページごとに1枚の報告書に分けてから処理します。台帳への書き込みまで成功したページだけを処理済みとして記録し、失敗したページは次の実行で拾い直します。
毎日の一覧は、別のスクリプトで昼の12時に作ります。 午前中に回収とスキャンを済ませれば、午後のうちに配布員へ確かめの電話ができます。 配布員の多くは午後から夕方に配るので、その前に連絡がつくようにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 報告書のPDF | 1人1日1枚。スキャンした日付(ファイル名) | 取込フォルダ |
| 読み取り結果 | 配布員・指示書番号の欄、町丁目ごとの表、要素ごとの信頼度 | Document AI(Form Parser) |
| 配布計画 | 指示書番号、広告主、町丁目、渡した枚数、配布期間 | 配布計画・実績の台帳 |
| 不配の理由の区分 | 区分の名前と、報告書に書かれうる表記の一覧 | 営業部で用意する一覧 |
| 町丁目の一覧 | 配布地域の町丁目の正式な名前と、略し方 | 営業部で用意する一覧 |
質を決めるのは、不配の理由の区分です。 区分は広告主への説明に使う言葉で決めます。たとえば「投函禁止の表示」「管理人・住人に断られた」「空き家・空き室」「立ち入れない(オートロックなど)」「天候で中止」「その他」です。区分ごとに、配布員がよく書く表記を集めておきます。
町丁目の一覧は、地名の読み違いをそろえるために使います。 手書きの「本町2」「本2」「本町二丁目」を同じ町丁目として扱えるようにします。ただし、一覧に無い地名を一覧のどれかに寄せることはしません。
データの取得方法を決める
読み取りは、Python から Document AI の処理の API を呼ぶだけです。公式のページには Python のクライアントライブラリで応答を扱う例が載っています。返ってきた Document から次のものを取ります。
| 取るもの | 応答のどこから | 何に使うか |
|---|---|---|
| 項目名と値の組 | pages[].formFields[] の fieldName と fieldValue | 配布員、指示書番号、報告日 |
| 表 | pages[].tables[] の headerRows と bodyRows | 町丁目ごとの配布日、配布枚数、残数、不配の理由、時間 |
| 全文のテキスト | text と各要素の textAnchor | 欄外のメモ |
| 信頼度 | 各要素の layout の confidence | 手書きの数字が確かに読めているかの判定 |
指示書番号は、計画の行を探す鍵です。 読み取った番号で計画を引き、完全に一致する指示書が1つだけあるときだけ結び付けます。 番号が読めないときに、配布員の名前と日付から指示書を推すことはしません。配布員は1日に複数の指示書を持つことがあるからです。 結び付かなければ no_plan として担当者が確かめます。
表は、見出しの行で列を決めます。 「町丁目」「配布枚数」「残数」の見出しで列の位置を決め、見出しが読めないときに列の並び順で推すことはしません。 配布枚数と残数の列を取り違えると、差の計算がすべて狂います。
AIへ渡す前に整形する
- 書式の見直し(導入時に1回) … 広告主の欄の結合をなくし、1行に1町丁目の単純な格子にします。上部に「指示書番号」の欄を足します
- 1枚ずつに分割 … まとめてスキャンしたPDFをページごとに分けます。オンラインの処理は1回の要求で最大15ページです
- 形式と画質の確認 … Document AI の対象は PDF や画像です。公式には、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよい結果になるとされています。鉛筆の報告書のために、複合機の設定を300dpi以上・濃いめに固定します
- 白紙と裏面の除外 … 文字のほとんど無いページは、報告書として扱わず飛ばします
- 重複の検知 … 同じ指示書番号・同じ配布員のものが2枚あれば、後のものを書き直しとして扱い、前のものも残します
3番目の「濃いめ」がいちばん効きます。 屋外で鉛筆で書かれた報告書は、数字が薄く、雨でにじんでいることもあります。数字の信頼度は、スキャンの濃さで目に見えて変わることがあります。
AIに処理させる
させるのは、表の行を台帳の項目にそろえ、不配の理由を区分に当てることだけです。 計画との照合と差の計算は Python が行います。
| 取り出すもの | 取り出し方 | 判断できないときの扱い |
|---|---|---|
| 町丁目 | 欄の文字。町丁目の一覧に当たれば一覧の名前 | 一覧に無ければ書かれたまま unlisted |
| 配布日 | 欄の日付をそのまま | 読めなければ unreadable |
| 配布枚数・残数 | 欄の数字をそのまま | 欄に値が無ければ missing |
| 不配の理由 | 書かれた文を写し、区分の一覧に当てる | 当たらなければ区分は other、文はそのまま |
| 配布の時間 | 欄の時刻や時間をそのまま | 無ければ空 |
Python が比べる規則は次のとおりです。
| 比べること | 規則 |
|---|---|
| 枚数の合わない報告 | 渡した枚数 − 配布枚数 − 残数 が0でない行 |
| 報告の無い町丁目 | 計画の配布期間の終わりを過ぎても、実績が1行も無い町丁目 |
| 配布日のずれ | 配布日が計画の配布期間の外にある行 |
| 不配の多い町丁目 | 不配の枚数が渡した枚数の一定の割合を超える行(割合は営業部が決める) |
区分 other の多さ | 区分に当たらなかった理由が多い配布員・町丁目 |
4行目の割合は、町丁目ごとの事情で変わります。 集合住宅の多い町丁目は、投函禁止で配れない枚数がもともと多めです。割合は一律にせず、町丁目の過去の実績から決めると、一覧が本当に見るべきものに絞れます。
| させないこと | 理由 |
|---|---|
| 残数の欄が空のときに、差から残数を計算して埋める | 枚数の合わない報告が消える |
| 読めない数字を計画の枚数に寄せる | 計画どおりに見えて、差が消える |
| 配布員が実際に配ったかの判断 | 報告書から分かることではない |
| 不配の理由の書き換え・言い足し | 配布員の書いた事実が消える |
| 配布員の報酬への反映 | 営業部と責任者が、取り決めに沿って決める |
1行目がいちばん起きやすい失敗です。 残数の欄が空の行を渡すと、AIは「渡した枚数 − 配布枚数」を計算して残数を埋めようとします。埋めた残数で差は0になり、確かめるべき報告が一覧から消えます。 そもそもAIには渡した枚数を見せず、計画との照合は Python で行います。
指示内容を固定する
あなたはチラシのポスティング会社の営業部で、配布員の配布報告書を
配布実績の台帳に記録する担当です。
渡すのは、報告書1枚の読み取り結果です。
書かれている文字だけを使って、町丁目ごとに値を並べてください。
推測で埋めないでください。
【やること】
1. staff:「配布員」の欄の文字をそのまま写す
2. order_no:「指示書番号」の欄の文字をそのまま写す
3. 表の各行について次を並べる
area:町丁目。町丁目の一覧に当たれば一覧の名前、無ければ書かれたまま
date:配布日
delivered:配った枚数(数字だけ)
returned:残数(数字だけ)
reason_text:不配の理由として書かれた文をそのまま
reason_code:reason_text を不配の理由の区分に当てた結果。
当たらなければ other、書かれていなければ none
4. 項目ごとに status を付ける
read(読めた)/missing(欄に値が無い)/unreadable(読めない)
5. evidence に、根拠にした文字列をそのまま写す
【厳守事項】
- 配った枚数や残数が書かれていない欄を、計算で埋めないでください。
missing のままにします。
- 読めない数字を、ほかの行の数字や切りのよい数字に寄せないでください。
- 不配の理由の文を書き換えたり、言葉を足したりしないでください。
- reason_code は区分の一覧にあるものだけを使ってください。
- 配布員が実際に配ったかどうか、報告が正しいかどうかは書かないでください。
- 欄外のメモは note にそのまま写してください。
【町丁目の一覧】{areas}
【不配の理由の区分と表記の一覧】{reason_codes}
【読み取り結果】{ocr_result}
AIに渡す情報から、計画の枚数を外しているのは意図してのことです。 渡した枚数が見えると、AIは読めない数字をそれに合わせて読もうとします。計画を知らない状態で読ませ、照合は後ろの Python に任せます。
reason_text と reason_code を両方残すのは、区分が後から変わるからです。 広告主から「オートロックで入れなかった枚数を別に知りたい」と言われたら、区分を足して reason_text から当て直せます。 書かれた文が残っていないと、過去の分は当て直せません。
出力形式を固定する
Claude API の構造化出力を使い、次の形のJSONで受け取ります。 output_config.format に JSON スキーマを渡すと、応答がそのスキーマに沿った形になります。
{
"file": "20261008_scan.pdf",
"page": 14,
"staff": "佐藤",
"order_no": "A-10342",
"rows": [
{ "area": "本町二丁目", "date": "10/7",
"delivered": "380", "returned": "20",
"reason_text": "マンション チラシお断り", "reason_code": "no_flyer_sign",
"status": { "delivered": "read", "returned": "read" },
"evidence": "本2 380 20 マンション チラシお断り" },
{ "area": "本町三丁目", "date": "10/7",
"delivered": "410", "returned": "",
"reason_text": "", "reason_code": "none",
"status": { "delivered": "read", "returned": "missing" },
"evidence": "本3 410" }
],
"note": "雨のため途中で中断"
}
1つ目の理由は、差の計算をAIの外に出せることです。 AIが返すのは報告書1枚の値までで、計画との照合は Python が行います。上の例の2行目は残数が missing なので、差を計算せずに「枚数の合わない報告」の候補として一覧に出します。
2つ目は、数字を文字列のまま受け取ることです。 「380」を数値にしてから返させると、「38O」のような読み違いが黙って別の数になります。文字列で受け取り、Python で数字だけかを確かめてから数値にします。
3つ目は、note に欄外のメモが残ることです。 「雨のため途中で中断」と書かれていれば、残数の多さの理由が分かります。一覧にメモが載っていれば、配布員に電話する前に当たりを付けられます。
公式のページでは、列挙の値の大文字・小文字までは保証されないとされているので、reason_code と status は Python で正規化してから使います。stop_reason が max_tokens のときは出力が途中で切れているので、台帳に書かずに呼び直します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 取込フォルダ | Python で定時に読む | 新しいPDFをページに分けて処理する |
| Document AI | Python のクライアントライブラリから処理の API を呼ぶ | 欄の値、表、信頼度 |
| Claude API | Python から呼ぶ | 表の行を台帳の形にそろえる |
| 配布計画・実績の台帳 | Python で計画の行を探して書き込む | 実績、差、印 |
| 毎日の一覧 | 毎日昼に作るファイルとメール | 営業部の担当へ |
台帳への書き込みは、実績と印の列だけにします。 計画の枚数は営業部が広告主と決めた値で、報告書の値で上書きしません。 差がある行には印を付け、どちらが正しいかは担当者が確かめます。
広告主への完了報告は、この構成からは送りません。 完了報告の下書きの表までは台帳から作れますが、送る前に担当者が差のある行を確かめ終えていることが条件です。
人が確認する
- 毎日昼、「枚数の合わない報告」を見る … 配布員に電話で確かめ、残数の書き忘れや行の書き違いなら台帳を直します。直した記録は台帳の別の列に残します
- 「報告の無い町丁目」を見る … 配布員に報告書の出し忘れか、まだ配っていないのかを確かめます。配布期間の終わりが近い町丁目から先に見ます
- 「不配の多い町丁目」と区分
otherを見る … 理由を読み、区分に足すべき表記なら一覧に足します - 完了報告を出す … 配布期間の終わった広告主について、差のある行が残っていないことを確かめてから送ります
1番目を翌日にするのは、配布員の記憶が新しいうちに聞くためです。 1週間たつと、どの町丁目で何があったかを配布員は覚えていません。その日のうちに聞けば、ほとんどは書き方の間違いとして片付きます。
電話で聞く順番も決めておきます。 差が大きい行、配布期間の終わりが近い広告主の行、区分 other の行の順です。同じ配布員の行はまとめて1回の電話で聞き、1日に何度も同じ人へ電話しないようにします。
目標は、1,200枚をならして1枚1.5分です。 印の付く報告書が2割前後という想定で、それより多い月は、書式か、特定の配布員の書き方を疑います。
例外に対処する
| 起きること | 対応 |
|---|---|
| 指示書番号が読めない・計画に無い | no_plan。配布員に確かめ、番号を手で入れる |
| 町丁目が一覧に無い | unlisted。地名の略し方なら一覧に足す。計画外の地区なら配布員に確かめる |
| 表の列が見出しで決まらない | 画像で列を確かめて直す。多ければ書式を見直す |
| 1枚に2つの指示書の分が書かれている | 行ごとに指示書番号の欄を足す書式に直す。それまでは人が分ける |
| 雨でにじんで全体が読めない | 原本を見て手で入力する。報告書をクリアファイルで持ち歩く運用を検討 |
| 同じ指示書の報告書が2枚 | 後のものを書き直しとし、前のものも残す |
| 配布日が配布期間の外 | 配布員に確かめる。広告主の指定日がある案件は特に先に見る |
| Document AI か Claude API が応答しない | PDFを取込フォルダに残し、次の実行で拾い直す |
4行目は、複数の広告主を重ねて配る日に起きます。 1回の配布で2つの指示書を持って出ると、配布員は1枚の報告書にまとめて書きがちです。行ごとに指示書番号を書く欄を足すと、1枚にまとまっていても結び付けられます。
記録を残す
- スキャンしたPDFと、スキャンした日付(紙の原本は、社内で決めた期間保管する)
- Document AI が返したJSONの全文
- Claude API に渡した入力と、返ってきたJSON
- 台帳に書き込んだ実績、差、印、人が直した記録と、配布員に確かめた内容
- 毎日の一覧の控えと、そのときの不配の理由の区分の版
- 広告主に完了報告を送った日と、送った内容
人が直した記録を残すのは、広告主から問い合わせを受けたときに説明するためです。 「本町三丁目の残数が後から変わったのはなぜか」と聞かれたら、いつ、配布員に何を確かめて直したかを示せます。
04実装レベルの3段階
最小構成では枚数がさばけません。 確かめるための段階です。 半自動化で、1枚4分が2.5分程度になります。 書き写しはなくなりますが、計画の行を探して値を移すのはまだ人です。本格構成で1.5分になり、この段階が本記事の想定です。 差が大きいのは、指示書番号で計画の行が自動で決まり、探し物がなくなるからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、不配の理由の表記の揺れと、一覧に無い町丁目の略し方が集まります。
05工数削減シミュレーション
導入後 1,200件 × 1.5分 ÷ 60 = 30 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 不動産・学習塾・小売・飲食などの広告主からチラシのポスティングを請け負い、業務委託の配布員を100人以上抱えている配布会社や新聞販売店。配布員が紙の報告書に町丁目ごとの配布枚数と不配の理由を手書きし、事務所の担当が台帳に書き写してから広告主への完了報告を作っている場合。報告書の枚数が計画と合わないことに、広告主から問い合わせを受けて気づくことがある場合。
- 配布員がすでにスマートフォンのアプリで配布の実績を入力しており、紙の報告書がほとんど無い場合。配布員が数人で、責任者が毎日口頭で実績を聞き取れる場合。広告主が町丁目ごとの実績を求めず、総数だけの報告で足りる場合。なお、配布員が実際に配ったかどうかの判断や、配布員の報酬をどうするかの判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の報告書から30枚を選ぶ(鉛筆のもの、不配の多いもの、枚数の合わなかったものを入れる)
- 30枚をスキャンして、手元のAIサービスの画面に1枚ずつ貼り付ける
- 「この報告書の表から、町丁目ごとに配布日、配った枚数、残数、不配の理由を書き出してください。空欄は空欄のまま、計算で埋めないでください」と指示する
- 書き出された値を、台帳に書き写した値と比べる
- あわせて、30枚の各行について、渡した枚数 − 配布枚数 − 残数 を表計算ソフトの式で計算する
5番目はAIを使いません。 台帳の値だけで計算できます。0にならない行がどれくらいあるかで、毎日の引き算の価値が分かります。
| 出てきた内容 | 判断 |
|---|---|
| 台帳に書き写した値とほぼ同じになった | Document AI と Python のつなぎに進む |
| 残数の空欄を計算で埋めた | 指示の書き方で直る。構成は有効 |
| 表の列がずれて配布枚数と残数が入れ替わる | 書式の見直しが先。 結合セルをなくす |
| 0にならない行が多く見つかった | 読み取りの前に、引き算だけを毎日始める |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 残数の空欄が計算で埋まる | AIに計画の枚数を渡さない。 指示でも禁じる |
| 配布枚数と残数の列が入れ替わる | 見出しで列を決め、並び順で推さない |
| 指示書番号が書かれない | 書式に欄を足し、書かれていない報告書は配布員に戻す |
| 結合セルで表が崩れる | 書式から結合セルをなくす。 Form Parser の表は単純な表が対象 |
不配の理由が other ばかりになる | 表記の揺れを集めて区分の一覧に足す |
| 数字の読み違いが黙って別の数になる | 文字列で受け取り、数字だけかを確かめる |
| 集合住宅の多い町丁目が毎回一覧に出る | 不配の割合を町丁目ごとの過去の実績で決める |
| 報告の無い町丁目に気づかない | 計画の行から数える。 届いた紙からは作れない |
| 完了報告を自動で送る | 差のある行を確かめ終えてから、担当者が送る |
| 一覧を配布員の評価に使う | 目的は広告主への報告の確かさ。評価に使うと書き方がゆがむ |
| 国外で処理することを確かめていない | 日本のリージョンが無い。導入前に社内で確かめる |
上の2行が、この構成の失敗のほとんどです。 どちらも、合わないはずの報告が合って見える形で現れます。導入の初月は、毎週10枚を抜き取って原本と台帳を見比べてください。
下から2行目も、早く効いてきます。 一覧に名前の多く出る配布員を評価で下げると、配布員は残数を書かなくなるか、渡された枚数ちょうどを配ったと書くようになります。一覧が拾うべき差そのものが、報告書から消えます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 配布員の氏名、配布した町丁目と日付、不配の理由の文、そして欄外のメモです。不配の理由に、特定の建物や住人の様子が書かれることがあります。
- 国外で処理することを確かめる … Document AI のリージョンの一覧に日本はありません。配布員の氏名と町丁目ごとの記録を国外のリージョンで処理してよいかを、社内で確かめます
- 広告主へ出す情報を絞る … 完了報告に載せるのは町丁目ごとの枚数と不配の区分までにします。不配の理由の文や欄外のメモに書かれた建物や住人の様子は、広告主に渡しません
- 配布員が配ったかどうかを一覧で決めない … 一覧が出すのは確かめる候補だけです。配布員を疑う連絡にせず、書き方の確かめとして電話します
- 報酬の計算と切り分ける … 配布員の多くは業務委託です。公正取引委員会のフリーランス法の特設サイトでは、業務委託をしたら直ちに書面か電磁的方法で報酬の額や支払期日などの取引条件を明示する義務があり、報酬の支払期日は発注した物品等を受け取った日から数えて60日以内のできる限り短い期間内で定めるとされています。一覧の確かめが長引いても、取り決めた支払期日は動かせない前提で運用を組みます
- 投函禁止の物件の情報を大切に扱う … 不配の理由から「この建物は投函禁止」という一覧ができます。配布の品質を上げる大事な情報ですが、住所と結び付いた情報として社内で管理します
誤りが起きた場合のリスクは、合わない実績を広告主に報告することと、配布員に誤った疑いをかけることの2つです。 前者は空欄を計算で埋めると起き、後者は読み取りの誤りを書き誤りとして扱うと起きます。missing と unreadable を分けておくことが、両方を防ぎます。
10まず何から始めるか
1週目:先月の差を数える
先月の台帳で、渡した枚数 − 配布枚数 − 残数 が0にならない行を数えます。AIを使わずにできる作業で、この構成が何を拾うためのものかが、数字で分かります。
2週目:30枚で試す
先月の報告書から30枚を選び、手元のAIサービスに貼り付けて値を書き出させます。残数の空欄を計算で埋めていないかを最優先で見ます。
3週目:書式と一覧を整える
報告書に指示書番号の欄を足し、結合セルをなくします。 あわせて、不配の理由の区分と、町丁目の一覧を作ります。区分は、広告主への完了報告で使っている言葉から決めます。
4週目:取込フォルダから一覧までをつなぐ
Python で取込フォルダを見張り、Document AI と Claude API を呼び、値を一覧に書き出すところまで作ります。この時点では計画と照らさず、読み取りの精度だけを見ます。
2か月目: 指示書番号で計画に結び付け、差と報告の無い町丁目の一覧を毎日出します。配布員に新しい書式を配ります。3か月目以降: 1枚4分が何分になったかを実測します。完了報告を配布期間の終わりの翌日に出せるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| フリーランスに業務委託をした場合、直ちに書面または電磁的方法で給付の内容・報酬の額・支払期日などの取引条件を明示する義務があること。報酬の支払期日を発注した物品等を受け取った日から数えて60日以内のできる限り短い期間内で定め、決めた期日までに支払う必要があること。フリーランスが従業員を使用しない事業者であること | 公正取引委員会: フリーランス法特設サイト | 2026-10-08 |
Form Parser がOCRのテキストに加えてキーと値のペア、チェックボックス、表を抽出すること。言語の一覧で日本語(ja)が手書きに対応する言語として示されていること。オンラインの処理が1回の要求で最大15ページであること | Google Cloud: Processor list | 2026-10-08 |
| 表の抽出が行や列をまたぐセルの無い単純な表を対象にすること。値の入っていないキーと値の組を確実には読み取れないこと | Google Cloud: Form Parser | 2026-10-08 |
項目名と値の組が formFields の fieldName/fieldValue で、表が headerRows/bodyRows で返ること。信頼度が各要素の layout に入ること | Google Cloud: Handle the processing response | 2026-10-08 |
| 対応形式に PDF や画像が含まれること。スキャンは最低200dpiが望ましく300dpi以上が一般に最もよいこと | Google Cloud: Supported files | 2026-10-08 |
マルチリージョンが us と eu で、単一リージョンにシンガポール(asia-southeast1)などがあり、日本のリージョンが一覧に無いこと | Google Cloud: Regional and multi-regional support | 2026-10-08 |
output_config.format に JSON スキーマを渡して応答の形を固定できること。列挙の値の大文字・小文字は保証されないこと。max_tokens で打ち切られたときはスキーマに合わない出力になりうること | Claude API: Structured outputs | 2026-10-08 |
配布員との取引条件や報酬の扱いは、公正取引委員会の特設サイトと自社の顧問の専門家に確かめてください。 本記事は各製品の公式ページと公正取引委員会の特設サイトで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0892)についてのご相談はこちらから。
