新聞折込の代理店にFAXで届く手書きの折込申込書を読み取り、折込日・新聞・地区・部数を受注台帳にそろえて、販売店の部数との食い違いと記入漏れを拾う
FAXで届く手書きの折込申込書を読み取り、折込日・新聞・販売店・部数を受注台帳の行にそろえます。自社の折込部数表と照らし、部数の食い違い、記入漏れ、締切に間に合わない申込を受付の当日に拾います。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 不動産/小売/広告
- 対象部門
- 営業
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- インターネットFAXが申込書を受信し、受注の担当のメールにPDFで転送する
- 担当がPDFを開き、申込日、広告主、折込日、銘柄、チラシの規格を受注台帳に打ち込む
- 販売店ごとの部数を1行ずつ台帳に打ち込む
- 部数表を開き、販売店ごとに申込の部数と表の部数を見比べる
- 読めない字、空欄、部数の食い違いがあれば、メモにまとめて申込者に電話かFAXで確かめる
- 確かめが済んだら、販売店ごとの手配表に反映し、納品の段取りを組む
- 折込日の前に、販売店へ部数と納品の連絡を出す
- 自動インターネットFAXが申込書を受信し、決まったメールアドレスにPDFで転送する
- 自動Google Apps Script が数分おきにメールを確かめ、新しい申込書のPDFをドライブに保存する
- 自動Google Document AI の Form Parser が、申込書の欄のキーと値、銘柄のチェックボックス、販売店ごとの部数の表を返す
- 自動Claude API が、読み取り結果を受注台帳の行(申込の見出しと販売店ごとの明細)にそろえる
- 自動Apps Script が、販売店名を部数表と照らし、部数の食い違い、記入漏れ、締切に間に合わない折込日を規則で拾う
- 自動受注台帳の「受付待ち」のシートに行を書き込み、印の付いた行に申込書の写しのリンクを付ける
- 人受注の担当が印の付いた行を申込書の写しと見比べ、申込者に確かめる
- 人確かめが済んだ申込を「受付済み」に移し、販売店への手配に回す
各工程の詳しい説明を読む
- インターネットFAXが申込書を受信し、受注の担当のメールにPDFで転送する
- 担当がPDFを開き、申込日、広告主、折込日、銘柄、チラシの規格を受注台帳に打ち込む
- 販売店ごとの部数を1行ずつ台帳に打ち込む
- 部数表を開き、販売店ごとに申込の部数と表の部数を見比べる
- 読めない字、空欄、部数の食い違いがあれば、メモにまとめて申込者に電話かFAXで確かめる
- 確かめが済んだら、販売店ごとの手配表に反映し、納品の段取りを組む
- 折込日の前に、販売店へ部数と納品の連絡を出す
(a)打ち込みに時間を取られる。 1件の申込書に販売店の行が数十行あることも珍しくありません。行の多い申込書ほど、打ち込みの途中で行を飛ばしやすくなります。 飛ばした販売店にはチラシが届かず、広告主から問い合わせが来て初めて分かります。
(b)部数表との見比べが目視。 申込の部数を、180店ある部数表と1行ずつ見比べます。広告主が古い部数表を見て書いた申込は、ほとんどの行が少しずつずれています。 ずれが小さいと、急いでいるときは見過ごします。
(c)不備に気づくのが手配の直前になる。 申込は折込日の直前に集中します。打ち込みと見比べが追いつかないと、確かめが後回しになり、気づいたときには販売店への連絡の締切が迫っています。 広告主に確かめる時間が残らず、折込日を変えてもらうことになります。
(d)FAXの字が読めない。 FAXの画像は、元の紙より細かい文字がつぶれます。「3」と「8」、「1」と「7」の見分けがつかない部数を、推測で打ち込んでしまうことがあります。推測が外れると、チラシが余るか足りなくなります。
- 【自動】 インターネットFAXが申込書を受信し、決まったメールアドレスにPDFで転送する
- 【自動】 Google Apps Script が数分おきにメールを確かめ、新しい申込書のPDFをドライブに保存する
- 【自動】 Google Document AI の Form Parser が、申込書の欄のキーと値、銘柄のチェックボックス、販売店ごとの部数の表を返す
- 【自動】 Claude API が、読み取り結果を受注台帳の行(申込の見出しと販売店ごとの明細)にそろえる
- 【自動】 Apps Script が、販売店名を部数表と照らし、部数の食い違い、記入漏れ、締切に間に合わない折込日を規則で拾う
- 【自動】 受注台帳の「受付待ち」のシートに行を書き込み、印の付いた行に申込書の写しのリンクを付ける
- 【人】 受注の担当が印の付いた行を申込書の写しと見比べ、申込者に確かめる
- 【人】 確かめが済んだ申込を「受付済み」に移し、販売店への手配に回す
7番目が、この設計の分かれ目です。 担当が見るのは、印の付いた行だけです。印の無い行は件数と合計部数を流し見て、受付済みに移します。 合っている行の見比べは、規則に移します。
受注台帳の「受付済み」には、人が移したものしか入りません。 販売店への手配は、これまでどおり受付済みの行から作ります。読み取った値がそのまま手配に流れる経路は作りません。
02今回想定するシステム構成
折込申込書(手書き、FAX) │ インターネットFAXがPDFでメールに転送 ▼【トリガー】Apps Script の時間主導型トリガー(数分おき) Google Apps Script ── 新しいメールを探し、PDFをドライブに保存 ▼ Google Document AI(Form Parser) │ 欄のキーと値、銘柄のチェックボックス、部数の表、信頼度 ▼ Claude API ── 申込の見出しと販売店ごとの明細にそろえる ▼ Google Apps Script ── 部数表との照合/記入漏れ/締切の確認 ▼ 受注台帳の「受付待ち」シート(印と申込書の写しのリンク) ▼ 【受注の担当が印の付いた行を確かめ、申込者に問い合わせる】 ▼ 「受付済み」へ移し、販売店への手配へ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(申込書の欄を受注台帳の行にそろえる) | OpenAI API、Gemini API |
| 連携 | Google Apps Script(メールの確認、ドライブへの保存、台帳への書き込み) | Python |
| 差異計算 | Google Apps Script(部数表との照合と締切の確認) | Python |
| 保管 | Google ドライブ(申込書のPDFと読み取り結果) | 社内のファイルサーバー |
新しく足すのは、受注台帳の「受付待ち」のシートと、販売店名の別名の一覧の2つです。 広告主は販売店を「○○店」「○○専売所」「○○地区」とさまざまに書きます。部数表の販売店コードに引き当てるための別名の一覧を、受注の担当が作ります。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCRのテキストに加えてキーと値のペア、チェックボックス、表を抽出するとされ、言語の一覧で日本語(ja)は手書きに対応する言語として示されています。申込書の「折込日」「広告主」はキーと値のペアとして、銘柄の□はチェックボックスとして、販売店ごとの部数は表として読めます。
Form Parser の注意書きのうち、この題材で効くのは2つです。 1つは、値が空のキーと値のペアは確実には読み取れないとされていること。もう1つは、表はセルが行や列にまたがらない単純なものだけが対象とされていることです。申込書の部数の表で「朝刊」「夕刊」の見出しが2列にまたがっている書式は、表として崩れて返ることがあります(第7章)。
処理する場所は、リージョンの一覧から選びます。 マルチリージョンの us と eu、シンガポール(asia-southeast1)などの単一リージョンがあり、日本のリージョンはありません。 申込書には広告主の会社名と担当者の名前・電話番号が書かれているので、取引先との契約や自社の決まりに照らして、国外で処理してよいかを導入前に確かめます(第13章)。
03どうやって実装するのか
処理の起点を決める
Apps Script の時間主導型トリガーで、数分おきに受信用のメールを確かめます。 公式のページでは、時間主導型のトリガーは最短で1分ごとから月1回まで設定でき、実行の時刻はわずかにずれることがあるとされています。メールの受信そのものを起点にするトリガーは一覧に無いので、一定の間隔で新しいメールを探す形にします。
インターネットFAXの転送先は、受注専用のメールアドレスにします。担当者個人のメールに転送していると、休みの日の申込が処理されません。Apps Script は GmailApp.search で、転送元のアドレスと「未処理」のラベルが付いていないメールを探します。
処理が終わったメールには「処理済み」のラベルを付けます。付けるのは、台帳への書き込みまで終わったときだけにします。途中で止まったメールは次の実行で拾い直され、「未処理」のラベルの数が、そのまま受付待ちの件数になります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 申込書のPDF | FAXの画像。受信日時、送信元のFAX番号 | インターネットFAXの転送メール |
| 読み取り結果 | 欄のキーと値、チェックボックス、表のセル、各要素の信頼度 | Google Document AI |
| 折込部数表 | 販売店コード、販売店名、銘柄、朝刊・夕刊ごとの部数、更新日 | 部数表のスプレッドシート |
| 販売店の別名の一覧 | 申込書に書かれうる販売店の呼び方と、販売店コードの対応 | 新しく作る一覧 |
| 受付の決まり | 折込日ごとの申込の締切、休刊日、受け付けるチラシの規格 | 自社で用意する表 |
| 広告主の一覧 | 広告主コード、名称、申込者の連絡先 | 受注台帳の取引先のシート |
質を決めるのは、販売店の別名の一覧です。 部数表と照らすには、申込書の「駅前店」が部数表のどの販売店コードかが決まらなければなりません。引き当てられない販売店は、部数の食い違いを見ることもできません。
受付の決まりの表は、締切に間に合わない申込を拾うために使います。 折込日ごとに、何日前の何時までに申込とチラシがそろっている必要があるかを、自社の決まりのとおりに書きます。新聞の休刊日も、この表に入れておきます。
データの取得方法を決める
Apps Script は、メールに付いたPDFをドライブの「受付」フォルダに保存し、Form Parser のプロセッサに送ります。オンラインの処理は1回の要求で最大15ページなので、ふつうの申込書は1回で足ります。それを超えるものは、公式の上限が100ページのバッチ処理に回します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 見出しの欄 | 各ページの formFields(fieldName/fieldValue) | 申込日、広告主、申込者、折込日、規格、納品日 |
| 銘柄の印 | fieldValue の valueType(filled_checkbox/unfilled_checkbox) | どの新聞に折り込むか |
| 部数の表 | 各ページの表(ヘッダの行と本体の行のセル) | 販売店ごとの部数 |
| 全文 | 応答の text | 欄や表として取れなかった値を本文から拾う |
| 信頼度 | 各要素の layout の confidence | FAXでつぶれた数字の見分け |
| 位置 | layout の boundingPoly | 確認のときに、申込書の写しの該当箇所を示す |
空欄の見分けは、キーと値のペアだけに頼りません。 「折込日」という項目名があって値が取れないとき、全文の中で項目名の近くに日付らしい文字が検出されているかを見ます。何も検出されていなければ空欄、検出されていて信頼度が低ければ読めない欄として扱います。
部数表と受付の決まりは、Apps Script がスプレッドシートを読むだけです。販売店コードと部数は文字列のまま読み、部数は照合の直前に数値にします。
AIへ渡す前に整形する
- 形式の確認 … 公式の対応形式は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などです。インターネットFAXの転送はPDFにそろえます
- 解像度の確認 … 公式のページでは、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよいとされています。FAXの標準の画質はこれを下回ることが多いので、読めない欄が多い申込者には、高画質での送信かPDFのメール添付をお願いします
- 送り状の除外 … FAXの1枚目に送り状が付いていることがあります。申込書でないページは読み取りの対象から外します
- 向きの確認 … 横向きに送られたページは、向きを直してから送ります
- 重複の確認 … 同じ送信元から同じ広告主・同じ折込日の申込書が短い間隔で2通届いたら、再送か訂正かを担当に確かめる印を付けます
- 訂正の申込書の確認 … 「訂正」「差し替え」と書かれた申込書は、前の申込と並べて担当に回します
2番目が、この構成の精度をいちばん左右します。 FAXの画像は、Document AI が勧める解像度に届かないことがあります。読めない欄がAIの問題ではなく送り方の問題であることを、申込者に説明できるようにしておきます。
5番目と6番目は、二重の手配を防ぐためのものです。 広告主は、部数を直した申込書を「訂正」と書かずに送り直すことがあります。同じ折込日の申込が2つ台帳に並ぶと、販売店に2回チラシが届きます。
AIに処理させる
させるのは、読み取り結果を、受注台帳の項目に書かれたとおりに写すことと、表が崩れたときに行をそろえ直すことです。 部数表との照合も、締切の確認も、Apps Script の規則で行います。
| させること | 中身 | 判断できないときの扱い |
|---|---|---|
| 見出しの写し | 申込日、広告主、申込者、折込日、チラシの規格と枚数、納品日 | 読めなければ unreadable、空欄なら blank |
| 銘柄の写し | 印の付いた銘柄 | 印が読み取れなければ unclear |
| 明細の写し | 販売店(書かれたとおりの名前)と、朝刊・夕刊ごとの部数 | 部数が読めなければ unreadable |
| 表の行のそろえ直し | 見出しが2列にまたがって崩れた表を、販売店ごとの行に戻す | そろえられなければ table_broken |
| 合計の写し | 申込書に書かれた合計部数 | 空欄なら blank |
| 訂正の印 | 「訂正」「差し替え」の文字、二重線で消された部数 | 両方の値を写す |
4行目が、AIを使う理由です。 Form Parser が返す表は、単純な表なら販売店ごとの行がそのまま並びます。見出しが2列にまたがる書式では、朝刊と夕刊の列がずれて返ることがあります。 列のずれを読み取り結果の位置と全文から戻すのは、決まった規則では書きにくい作業です。
| させないこと | 理由 |
|---|---|
| 部数の補正 | FAXでつぶれた数字を「それらしく」直すと、推測の打ち込みを機械が繰り返す |
| 部数表との照合 | Apps Script が販売店コードで行う |
| 販売店の引き当て | 別名の一覧で決める。似た名前の販売店に寄せない |
| 合計と明細の帳尻合わせ | 合わないことが確かめの材料になる |
| 申込を受けるかどうかの判断 | 受注の担当と広告主が決める |
1行目がいちばん大事です。 つぶれた「8」を部数表の値に近い数字に直すと、食い違いは消えますが、広告主が本当に書いた部数も消えます。 照らすのは書かれたとおりの値で、直すのは広告主に確かめた担当です。
指示内容を固定する
あなたは新聞折込の代理店の受注担当で、FAXで届いた折込申込書の
読み取り結果を、受注台帳の項目に写す立場です。OCRが返した結果だけを見て、
書かれていることを写してください。推測で埋めないでください。
【写す項目】
見出し:order_date(申込日)、advertiser(広告主)、applicant(申込者)、
insert_date(折込日)、papers(銘柄)、flyer_size(規格)、
flyer_pages(枚数)、delivery_date(納品日)、total_copies(合計部数)
明細:shop_text(販売店。書かれたとおり)、morning_copies(朝刊部数)、
evening_copies(夕刊部数)
【厳守事項】
- 数字は書かれたとおりの文字列で写してください。
桁を補う、つぶれた数字をそれらしい数字に直す、ということをしないでください。
- 販売店は書かれたとおりに写してください。似た名前の販売店に直さないでください。
- 欄が空欄なら status を blank、文字はあるが読めなければ unreadable に
してください。空欄と読めない欄を混ぜないでください。
- 表の列がずれていると判断した場合は、読み取り結果の位置をもとに
販売店ごとの行に戻してください。戻せない場合は table_broken を true にし、
無理に行を作らないでください。
- 合計部数と明細の合計が合わなくても、どちらかを直さないでください。
- 二重線で消された部数と書き直された部数があるときは、両方を写し、
corrected を true にしてください。
- 「訂正」「差し替え」と書かれていれば revision を true にしてください。
- 部数が正しいか、申込を受けるべきかは書かないでください。
- 折込申込書でない書類と判断した場合は、document_type に種類を書いてください。
【読み取り結果】{ocr_result}
AIに部数表を渡していないことが、このプロンプトのいちばんの工夫です。 部数表を見せると、つぶれた数字を表の値に合わせて写します。照らす相手を見せなければ、合わせることもできません。 照合は Apps Script が、AIの写した値と部数表を並べて行います。
「合計と明細の合計が合わなくても直さない」も同じ理由です。 合わないことは、行を飛ばしたか、どこかの数字を書き間違えたかの手がかりです。帳尻を合わせると、その手がかりが消えます。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に JSON スキーマを渡す方式)を使い、形を固定します。
{
"document_type": "insert_order_form",
"revision": false,
"table_broken": false,
"header": [
{ "item": "order_date | advertiser | applicant | insert_date | papers | flyer_size | flyer_pages | delivery_date | total_copies",
"value": "", "status": "read | blank | unreadable | unclear" }
],
"lines": [
{
"shop_text": "",
"morning_copies": "", "morning_status": "read | blank | unreadable",
"evening_copies": "", "evening_status": "read | blank | unreadable",
"corrected": false, "previous_value": ""
}
]
}
1つ目の理由は、見出しと明細を分けて持てることです。 受注台帳は申込1件に対して販売店の行が並ぶ形なので、AIの出力をそのまま台帳の2つのシートに書き分けられます。
2つ目は、照合と締切の確認を Apps Script の規則で持てることです。
| 条件 | 扱い |
|---|---|
| 販売店が別名の一覧で引き当てられない | shop_unknown |
| 申込の部数が、部数表のその販売店・銘柄の部数を超える | over_count |
| 申込の部数が、部数表の部数と違う(下回る) | count_diff |
| 明細の合計と、申込書の合計部数が合わない | total_mismatch |
折込日・銘柄・部数などの必須の欄が blank | incomplete |
| 折込日が休刊日、または受付の締切を過ぎている | deadline |
該当の欄が unreadable または表が崩れている | check_image |
deadline は、他の印より先に担当に出します。 締切を過ぎた申込は、その日のうちに広告主に連絡しないと、折込日そのものを動かせなくなります。 受付待ちのシートでは、deadline の行を一番上に並べます。
over_count と count_diff を分けているのは、扱いが違うためです。 部数表より多い部数は、販売店に届けてもチラシが余るので、必ず広告主に確かめます。少ない部数は、広告主が意図して絞っていることもあり、確かめるかどうかを担当が決めます。 公式のページでは、列挙の値の大文字・小文字までは保証されないとされているので、status などは Apps Script で小文字にそろえてから使います。stop_reason が max_tokens のときは出力が途中で切れているので、販売店の行が多い申込書では max_tokens を大きめにし、切れたら台帳に書かずに呼び直します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受信用のメール | Apps Script の GmailApp.search | 未処理の転送メールを探し、PDFを取り出す |
| Google ドライブ | Apps Script | 申込書のPDFと読み取り結果のJSONを保存する |
| Google Document AI | REST API の呼び出し | 欄、チェックボックス、表、信頼度を返す |
| Claude API | REST API の呼び出し | 申込書の欄を受注台帳の行に写す |
| 折込部数表・受付の決まり | スプレッドシートの読み取り | 販売店コード・部数・締切を引く |
| 受注台帳 | 「受付待ち」シートへの書き込み | 見出しと明細、印、申込書の写しのリンク |
受注台帳の「受付済み」のシートと販売店への手配表には、この構成から書き込みません。 受付待ちから受付済みへ移すのは、受注の担当の操作だけです。読み取りの誤りが、そのまま販売店への手配に流れることはありません。
申込者への問い合わせも、この構成からは送りません。 問い合わせの文面が要るときは、GmailApp.createDraft で下書きを作るところまでにします。送るのは、印の付いた行を確かめた担当です。
人が確認する
受注の担当が見るのは、印の付いた行のある申込書だけです。 印の無い申込書は、受付待ちのシートで件数と合計部数を流し見て、受付済みに移します。
deadlineを先に見る … 締切を過ぎた申込は、その場で広告主か広告会社に電話し、折込日を動かすか、受けられる範囲を相談しますcheck_imageを見る … 申込書の写しの該当箇所を開き、読めない数字を確かめます。読めないものは推測せず、申込者に再送を頼みますover_countとcount_diffを見る … 部数表の版を広告主と確かめます。古い部数表を見て書かれた申込なら、まとめて確かめますshop_unknownを見る … 販売店を特定し、別名の一覧に新しい呼び方を足しますincompleteとtotal_mismatchを見る … 記入漏れや合計の食い違いを申込者に確かめます- 受付済みに移す … 確かめた結果を台帳に書き、受付済みに移します
目標は、600件をならして1件2分です。 印の無い申込書は流し見で数十秒、印の付いた申込書は申込者に確かめるので数分かかります。
例外に対処する
| 起きること | 対応 |
|---|---|
| FAXの画質が低く、読めない欄が多い | check_image。申込者に高画質での送信かPDFの添付を頼む |
| 部数の表が崩れて返る | AIが行をそろえ直す。戻せなければ table_broken で担当へ |
| 送り状や別の書類が混ざる | document_type を見て、申込書でないページを外す |
| 同じ申込が2回届く | 重複の印を付け、再送か訂正かを担当が確かめる |
| 「訂正」の申込書が届く | 前の申込と並べて担当へ。前の申込を自動で消さない |
| 部数表に無い販売店 | shop_unknown。担当が特定して別名の一覧に足す |
| 部数表の更新が遅れている | 部数表の更新日を受付待ちの行に出す。古ければ担当が販売店に確かめる |
| OCR・AIが応答しない | メールに「処理済み」のラベルを付けずに残す。次の実行で拾い直す |
記録を残す
- 元の申込書のPDFと、受信日時・送信元のFAX番号
- OCRが返したJSONの全文と、Claude API の応答の全文
- 照合に使った部数表の版(更新日)と受付の決まりの版
- 付いた印と、担当が確かめた結果・申込者とのやり取り・受付済みに移した日時と担当
- 販売店の別名の一覧に足した呼び方と、足した日
- 申込者ごとの
check_imageとincompleteの件数
3つ目で部数表の版を残すのは、部数表が更新されるためです。 申込を受けた時点の部数表と、手配した時点の部数表が違うことがあります。どの版と照らして食い違いと判断したかが残っていないと、広告主に説明できません。
最後の行は、申込者との相談の材料になります。 特定の広告会社だけ読めない欄が多いなら、FAXの画質か書式に理由があります。
04実装レベルの3段階
最小構成は確かめるための段階です。 1件ずつ貼り付けるので、月600件には使えません。 半自動化で、1件6分が3分程度になります。 打ち込みは無くなりますが、部数表との見比べと記入漏れの確かめは、目で行う作業として残ります。 本格構成で2分になり、この段階が本記事の想定です。 差が大きいのは、見比べが規則に移り、人が見るのが印の付いた行だけになるためです。 段階を飛ばさないでください。 半自動化のシートを1か月見ると、表が崩れやすい書式と、別名の一覧に無い呼び方が分かります。
05工数削減シミュレーション
導入後 600件 × 2分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 地域の新聞販売店に折込チラシを振り分ける折込の代理店・折込広告会社で、スーパー・不動産会社・学習塾などの広告主や広告会社から、手書きの折込申込書がFAXで毎日届いている場合。申込書の販売店ごとの部数を、自社の折込部数表と目で見比べてから受注台帳に打ち込んでいる場合。部数の食い違いや記入漏れに気づくのが、販売店への手配の直前になることがある場合。
- 申込をすでにWebの受付画面や広告主専用の発注システムで受けており、手書きの申込書がほとんど無い場合。申込が月に数十件で、受付の担当が目で見て足りる場合。広告主の情報を国外のリージョンで処理することを、取引先との契約や自社の決まりで認められない場合。なお、部数をいくつにするか、申込を受けるかどうかの判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の申込書から30件を選ぶ(部数の食い違いがあった申込、販売店の行が多い申込、読みにくいFAXを必ず入れる)
- その30件について、当時の受注台帳の行と、申込者に確かめた記録を用意する
- 申込書のPDFを手元のAIサービスの画面に1件ずつ貼り付ける
- 「この折込申込書の申込日、広告主、折込日、銘柄、規格、販売店ごとの朝刊・夕刊の部数を、書かれたとおりに写してください。数字を補ったり直したりしないでください。読めない欄は『読めない』、空欄は『空欄』としてください」と指示する
- 写された値を当時の受注台帳と比べ、部数表と手で照らす
| 出てきた内容 | 判断 |
|---|---|
| 当時の台帳と同じ値が写せ、食い違いも同じ行で見つかった | OCRと Apps Script の連携に進む |
| つぶれた数字をそれらしい数字に直した | 指示の書き方で直る。構成は有効 |
| 部数の表の行がずれる | 書式ごとの傾向を見る。直らない書式は table_broken として人に回す |
| 読めない欄が多い | FAXの画質が先。 申込者に送り方を相談する |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| つぶれた部数をAIがそれらしく直す | 部数表をAIに見せない。 書かれたとおりに写させる |
| 合計と明細をAIが合わせてしまう | 帳尻を合わせないことを指示に書く |
| 見出しが2列にまたがる表が崩れる | 単純な表だけが対象。AIに行をそろえ直させ、戻せなければ人へ |
| 販売店が引き当てられない | 別名の一覧を作り、確認のたびに足す |
| 空欄と読めない欄が混ざる | 値が空のキーと値は確実に読めない。全文と信頼度で分ける |
| FAXの画質で読めない欄が多い | 200dpi以上が望ましい。高画質の送信かPDFの添付を頼む |
| 訂正の申込で二重に手配する | 「訂正」と重複に印を付け、前の申込を自動で消さない |
| 部数表の版が古いまま照合する | 部数表の更新日を受付待ちの行に出す |
| 処理の途中で止まったメールが抜ける | ラベルは台帳に書き込んでから付ける |
| 国外での処理を確かめていない | 日本のリージョンが無い。取引先との契約を先に確かめる |
上の2行が、この構成の失敗のほとんどです。 どちらも、AIが「合っている」側に寄せてしまうという同じ型の失敗です。照らす相手を見せないことと、合わせないことを指示することで、食い違いが消えないようにします。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 広告主の会社名、申込者の担当者名・電話番号・FAX番号、折込日と部数、チラシの規格です。チラシの中身や価格は扱いません。 ただし、折込日と部数は広告主の販促の計画そのもので、同じ地域の競合する広告主には知られたくない情報です。
- 国外で処理することを確かめる … Document AI のリージョンの一覧に日本はありません。広告主との契約や自社の決まりで、申込書を国外のリージョンで処理してよいかを確かめます。認められない場合は、日本のリージョンで処理できる製品を検討します
- 外部へ渡す範囲を絞る … AIに渡すのは申込書の読み取り結果だけです。部数表や他の広告主の申込はAIに渡さず、照合は Apps Script の側で行います
- 手配を自動で行わない … 読み取った値で販売店への手配を作りません。受付済みに移すのは担当の操作だけです
- 申込者への連絡を自動で送らない … 問い合わせは下書きまでです。広告主との関係に直接ひびきます
- 受付待ちのシートの共有範囲を絞る … 複数の広告主の折込日と部数が1枚に並びます。受注の担当と上長だけが見られるようにします
- 元の申込書を残す … 部数や折込日で広告主と食い違いがあったとき、拠り所は申込書の原本です。AIの写しは原本の代わりにしません
誤りが起きた場合のリスクは、部数を誤って手配することと、締切に間に合わない申込を見落とすことの2つです。 前者は読めない数字を推測すると起き、後者は印の付いた行の確かめが後回しになると起きます。どちらも、推測させないことと、deadline を先に出すことで設計の側から防ぎます。
10まず何から始めるか
1週目:販売店の別名の一覧と受付の決まりを表にする
先月の申込書を見て、販売店がどう呼ばれているかを書き出し、部数表の販売店コードと対応させます。あわせて、折込日ごとの締切と休刊日を表にします。
2週目:30件で試す
先月の申込書から30件を選び、手元のAIサービスに貼り付けて欄と部数を写させます。つぶれた数字を直していないか、表の行がずれていないかを最優先で見ます。
3週目:取引先との確かめ
申込書を外部のサービスで、国外のリージョンで処理してよいかを、広告主との契約と自社の決まりで確かめます。 あわせて、読めない欄の多い申込者を洗い出し、送り方の相談を始めます。
4週目:メールから受付待ちのシートまでをつなぐ
Apps Script で受信用のメールを確かめ、OCRを呼び、写した値を受付待ちのシートに書き出すところまで作ります。この時点では印を出さず、担当がこれまでどおり見比べながら、シートの値が合っているかを見ます。
2か月目: 部数表との照合、記入漏れ、締切の規則を足し、印の付いた行だけを見る運用を始めます。3か月目以降: 1件6分が何分になったかを実測します。締切に間に合わない申込が受付の当日に担当の手元に届き、別名の一覧が育って shop_unknown がほとんど出なくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser がOCRのテキストに加えてキーと値のペア、チェックボックス、表を抽出すること。言語の一覧で日本語(ja)が手書きに対応する言語として示されていること。オンラインの処理が1回の要求で最大15ページ、バッチ処理が最大100ページであること | Google Cloud: Processor list | 2026-10-08 |
| 値の入っていないキーと値の組を確実には読み取れないこと。表はセルが行や列にまたがらない単純なものが対象であること | Google Cloud: Form Parser | 2026-10-08 |
項目名と値の組が formFields の fieldName/fieldValue で返ること。チェックボックスの valueType が filled_checkbox/unfilled_checkbox であること。信頼度と位置が各要素の layout に入ること。text が文書の文字の基準になること | Google Cloud: Handle the processing response | 2026-10-08 |
| 対応形式が PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などであること。スキャンは最低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 |
| 時間主導型のトリガーが最短1分ごとから月1回まで設定でき、実行の時刻がわずかにずれることがあること。インストール型トリガーの一覧にメールの受信を起点とするものが無いこと | Apps Script: Installable triggers | 2026-10-08 |
GmailApp.search でメールを検索でき、GmailApp.createDraft で下書きを作れること | Apps Script: Class GmailApp | 2026-10-08 |
部数をいくつにするか、締切を過ぎた申込を受けるかどうか、申込書を外部のサービスで処理してよいかは、自社の受付の決まりと広告主との取り決めに沿って決めてください。 本記事は各製品の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1053)についてのご相談はこちらから。
