郵便受付で撮った封筒の写真から宛名・差出人・郵便の種類を読み取り、受付台帳に記録して宛先の部署へ知らせる
郵便受付で封筒の表面をスマートフォンで撮ると、宛先の部署・氏名、差出人、親展・書留・速達などの表示を読み取ります。社員と部署の一覧に照らして受付台帳に記録し、宛先の部署へ受け取りを知らせます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate/Python
- 対象業界
- その他/商社/自治体/製造
- 対象部門
- 総務
- 対象業務
- データ入力・転記/台帳・マスタ管理
- 主な課題
- 人手が足りない/入力作業が多い/期限・対応漏れが起きる
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 郵便を受け取り、書留は配達員に受け取りの印を押す
- 1通ずつ宛名を見て、受付台帳のノートに日付・宛先・差出人・種類を書く
- 宛名が一覧と一致しないものは、社員の一覧を開いて部署を調べる
- 部署ごとの棚に仕分ける
- 書留・親展・速達は、部署へ内線かメールで知らせる
- 部署の担当者が取りに来たら、書留は台帳に受け取りのサインをもらう
- 退職者あてや宛先の分からないものは、総務の保留の箱に入れる
- 人郵便を受け取り、書留は配達員に受け取りの印を押す
- 人1通ずつ、封筒の表面をスマートフォンで撮る(Google ドライブのアプリで受付のフォルダへ)
- 自動10分おきにスクリプトが動き、フォルダの新しい写真を Gemini API に渡す
- 自動宛先の会社名・部署名・氏名、差出人、親展・書留・速達などの表示が返る
- 自動スクリプトが、読んだ部署名・氏名を社員と部署の一覧(旧部署名の対応表を含む)に照らす
- 自動一致したものは受付台帳のシートに記録し、宛先の部署の Chat スペースへ知らせる
- 自動一致しないもの・書留・宛先が自社でないものは、台帳に「要確認」として記録する
- 人受付の担当者が「要確認」の行を確かめ、行き先を決める
- 人封筒を部署ごとの棚に仕分ける(台帳の行番号を封筒に付箋で貼る)
- 人書留は、部署の担当者が取りに来たときに台帳のシートに受け取りを記録する
- 自動翌日の朝、知らせてから受け取られていない書留・親展を部署へもう一度知らせる
各工程の詳しい説明を読む
- 郵便を受け取り、書留は配達員に受け取りの印を押す
- 1通ずつ宛名を見て、受付台帳のノートに日付・宛先・差出人・種類を書く
- 宛名が一覧と一致しないものは、社員の一覧を開いて部署を調べる
- 部署ごとの棚に仕分ける
- 書留・親展・速達は、部署へ内線かメールで知らせる
- 部署の担当者が取りに来たら、書留は台帳に受け取りのサインをもらう
- 退職者あてや宛先の分からないものは、総務の保留の箱に入れる
(a)台帳を手で書いている。 1日90通を手で書くと、差出人の名前が略され、字が読めず、後から「あの郵便はいつ届いたか」を探すときに使えない台帳になります。 書留の受け取りの記録も、同じノートに混ざっています。
(b)行き先を調べるのに時間がかかる。 旧部署名や異動した社員あての郵便は、一覧を開いて名前で探し、今の部署を確かめるまでに数分かかります。人の入れ替わりが多い4月と10月は、この手間が何倍にもなります。
(c)部署への知らせが漏れる。 書留と親展は知らせることになっていますが、忙しい時間帯には内線がつながらず、そのまま忘れることがあります。 普通の郵便は知らせないので、取りに来ない部署には届いたことすら伝わりません。
(d)保留の箱が片付かない。 退職者あてや宛先の分からない郵便は保留の箱に入れますが、誰がいつ判断するかが決まっていません。 箱の中で何週間も過ぎる郵便があり、その中に期限のある通知が混ざっていることもあります。
- 【人】 郵便を受け取り、書留は配達員に受け取りの印を押す
- 【人】 1通ずつ、封筒の表面をスマートフォンで撮る(Google ドライブのアプリで受付のフォルダへ)
- 【自動】 10分おきにスクリプトが動き、フォルダの新しい写真を Gemini API に渡す
- 【自動】 宛先の会社名・部署名・氏名、差出人、親展・書留・速達などの表示が返る
- 【自動】 スクリプトが、読んだ部署名・氏名を社員と部署の一覧(旧部署名の対応表を含む)に照らす
- 【自動】 一致したものは受付台帳のシートに記録し、宛先の部署の Chat スペースへ知らせる
- 【自動】 一致しないもの・書留・宛先が自社でないものは、台帳に「要確認」として記録する
- 【人】 受付の担当者が「要確認」の行を確かめ、行き先を決める
- 【人】 封筒を部署ごとの棚に仕分ける(台帳の行番号を封筒に付箋で貼る)
- 【人】 書留は、部署の担当者が取りに来たときに台帳のシートに受け取りを記録する
- 【自動】 翌日の朝、知らせてから受け取られていない書留・親展を部署へもう一度知らせる
2番目で撮るのは、1枚に1通です。 まとめて撮ると、どの宛名がどの封筒のものか分からなくなります。1通ずつ撮る手間は、台帳を手で書く手間よりずっと小さく、写真がそのまま記録になります。
8番目が、この設計の分かれ目です。 受付が全件を確かめるのではなく、一覧と一致しなかったもの、書留、宛先が自社でないものだけを確かめます。全件を確かめる設計にすると、90.0時間はほとんど減りません。
02今回想定するシステム構成
封筒(表面だけを撮影。開封しない) │ スマートフォンの Google ドライブのアプリで撮影・保存 ▼ 受付のフォルダ 【トリガー】時間主導型(平日の8時〜18時、10分おき) Google Apps Script ├──▶ フォルダの新しい写真を読み、形式とサイズを確かめる ▼ Gemini API(画像の入力・構造化出力) │ 宛先の会社名・部署名・氏名、差出人、郵便の種類の表示、読めなかった欄 ▼ Google Apps Script ├──▶ 社員と部署の一覧、旧部署名の対応表に照らす ├──▶ 受付台帳のシートに記録(一致/要確認) └──▶ 宛先の部署の Chat スペースへ知らせる(Webhook) ▼ 【受付が「要確認」だけを確かめる】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make、Python |
| 生成AI | Gemini API(有料の枠、画像の入力と構造化出力) | Claude API、OpenAI API |
| 保管 | Google ドライブ(受付のフォルダと処理済みのフォルダ) | Microsoft OneDrive |
| シート | Google スプレッドシート(社員と部署の一覧・旧部署名の対応表・受付台帳) | Microsoft 365 のブック |
| 通知 | Google Chat(部署ごとのスペースへの Webhook) | Gmail |
新しく足すのは、スクリプトと Gemini API の契約と、受付台帳のシートだけです。 社員と部署の一覧は人事が更新しているものを読みます。一覧には書き込みません。 スクリプトが書き込むのは、受付台帳のシートだけです。
土台になるのは、Google Apps Script の時間主導型のトリガーです。 毎分から毎月までの間隔で関数を動かせます。インストール型トリガーは作成した人のアカウントで実行されるため、受付のフォルダと台帳は、総務の共用アカウントで作り、そのアカウントでトリガーを作ります。
スクリプトの実行時間には上限があります。 1回の実行は6分まで、トリガーの合計の実行時間は Google Workspace のアカウントで1日6時間まで、外部の API の呼び出しは1日100,000回までとされています。郵便が届いた直後は数十枚の写真が一度に入るため、1回の実行で処理する枚数を決めておきます。
画像の読み取りには、Gemini API に画像を直接渡します。 画像を base64 にして要求に含める形で、対応する形式は PNG・JPEG・WEBP・HEIC・HEIF です。要求の全体(指示・画像を合わせて)が20MBまでとされています。スマートフォンで撮った写真は、多くがこの範囲に収まります。
03どうやって実装するのか
処理の起点を決める
時間主導型のトリガーを10分おきに置きます。 平日の8時から18時のあいだだけ処理し、それ以外の時刻は何もせずに終わるようにします。郵便が届く時刻に合わせて、届いた直後の30分だけ5分おきにすることもできます。
写真の保存を直接のきっかけにしないのは、ドライブへの保存を起点にするトリガーが無いためです。 フォルダを一定の間隔で見に行き、新しいファイルを処理する形にします。10分の遅れは、受付が仕分けを終えるまでの時間とほぼ同じで、部署への知らせとしては十分です。
1回の実行で処理するのは、20枚までにします。 1枚あたり Gemini API の呼び出しと一覧の照合で数秒かかるため、20枚なら6分の上限に余裕があります。残った写真は、次の実行で処理します。 郵便が届いた直後に50枚入っても、30分ほどで処理が終わります。
処理が終わった写真は、処理済みのフォルダへ移します。 移すのは、台帳への記録と部署への知らせが終わったときだけにします。受付のフォルダに残っている写真の数が、そのまま未処理の数になります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 封筒の写真 | 表面1枚。撮影した日時 | 受付のフォルダ |
| 社員と部署の一覧 | 社員の氏名(よみ)、部署、在籍の状態(在籍・休職・退職)、退職日 | 人事が更新する一覧のシート |
| 旧部署名の対応表 | 旧部署名 → 今の部署名、組織変更の日 | 総務が持つ対応表のシート |
| 部署の連絡先 | 部署ごとの Chat スペースの Webhook の URL、郵便の担当者 | 総務が持つ部署の連絡先のシート |
| 自社名の表記ゆれ | 正式名、略称、旧社名、グループ会社の名前 | 総務が持つ一覧 |
AIに渡すのは、封筒の写真だけです。 社員と部署の一覧はAIに渡しません。照合はスクリプトの側で行います。 一覧を渡して「どの部署か選んで」と頼むと、AIは一致しない宛名でも一覧の中からいちばん近いものを選んでしまいます。
旧部署名の対応表が、この構成の質を決めます。 組織変更のたびに、旧部署名と今の部署名の対応を1行ずつ足します。取引先は数年前の部署名で送ってくることがあるため、古い対応も消しません。
データの取得方法を決める
受付のフォルダの中のファイルを一覧にし、撮影の日時の古い順に処理します。フォルダのファイルの一覧は getFiles() で取れ、ファイルの中身は getBlob() でバイナリとして取り出せます。 取り出したバイナリを Utilities.base64Encode() で base64 の文字列にし、MIME の種類と一緒に Gemini API の要求に入れます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 封筒の写真 | 受付のフォルダ(getFiles() → getBlob()) | 読み取りの材料 |
| 写真の形式とサイズ | ファイルの getMimeType()・getSize() | 前処理での確認 |
| 社員と部署の一覧 | 一覧のシート | 宛名の照合 |
| 旧部署名の対応表 | 対応表のシート | 旧部署名の読み替え |
| 部署の Webhook の URL | 部署の連絡先のシート | 知らせの送り先 |
社員と部署の一覧は、1回の実行の最初に1度だけ読みます。 写真1枚ごとに読み直すと、それだけで実行時間を使います。一覧を読んだ時刻を台帳に残し、異動の当日に一覧の更新が遅れた場合に、どちらの版で照合したかを後で確かめられるようにします。
AIへ渡す前に整形する
- 形式の確認 … PNG・JPEG・WEBP・HEIC・HEIF のどれかであることを確かめます。それ以外は台帳に「形式外」と記録し、撮り直しを頼みます
- サイズの確認 … 要求の全体が20MBに収まるかを確かめます。大きすぎる写真は、スマートフォンの撮影の設定を変えて撮り直します
- 重複の確認 … 同じ写真が2回保存されていないか、ファイルの中身のハッシュ値(
Utilities.computeDigest())で確かめます - 撮影の日時の記録 … 写真の保存の日時を、受付の日時として台帳に入れます
- 一覧の準備 … 社員の氏名・よみ、部署名、旧部署名の対応表を、照合しやすい形(空白・全角半角・「株式会社」の有無をそろえた形)にします
3番目を軽く見ないでください。 スマートフォンのアプリで保存がうまくいかなかったとき、受付が同じ封筒を撮り直すと、同じ郵便が台帳に2行入り、部署に2回知らせが届きます。 ハッシュ値が同じなら、2枚目は処理しません。
5番目の正規化は、AIの出力にも同じものをかけます。 一覧の側と読み取った側を同じ形にそろえてから比べないと、「第一営業部」と「第1営業部」が一致しません。
AIに処理させる
させるのは、封筒の表面に書かれている文字を、欄ごとに分けて読み取ることだけです。
| 読み取るもの | 中身 | 読めないときの扱い |
|---|---|---|
| 宛先の会社名 | 封筒に書かれた会社名 | 読めなければ空にし、unreadable に欄名を入れる |
| 宛先の部署名 | 部署・課・係の名前 | 書かれていなければ空(「書かれていない」と「読めない」を分ける) |
| 宛先の氏名 | 個人名。「ご担当者様」「御中」はそのまま | 同上 |
| 差出人 | 会社名・団体名・個人名 | 裏面に書かれていることが多いので、表面に無ければ空 |
| 郵便の種類の表示 | 親展、書留、簡易書留、速達、特定記録、「請求書在中」などの朱書き | 表示ごとに有無を返す |
| 封筒の種類の手がかり | 窓付きの封筒か、ラベルが貼られているか | — |
宛先の欄で「書かれていない」と「読めない」を分けるのが、この構成でいちばん大事な区別です。 部署名が書かれていない郵便は「会社あて」として総務が受けるもの、部署名が読めない郵便は撮り直すか受付が目で見るものです。混ぜると、部署名の書かれた郵便が総務の保留の箱に入ります。
| させないこと | 理由 |
|---|---|
| 宛先の部署の決定 | 一覧との照合はスクリプトで行う |
| 読めない文字の推測による補完 | もっともらしい部署名や氏名ができてしまう |
| 郵便の中身の推測 | 封筒の表面から中身を決めつけない |
| 重要度・急ぎ具合の判定 | 表示の有無だけを返し、扱いは規則で決める |
| 開封すべきかの判断 | 受付は開封しない運用 |
2行目がいちばん起きやすい失敗です。 手書きの宛名で1文字が読めないとき、AIは前後から推測して社員の氏名らしい文字列を作ります。その文字列が別の社員の名前と一致すれば、郵便は違う人に届きます。 読めない文字は読めないとして返させ、受付が封筒を見て決めます。
指示内容を固定する
あなたは会社の総務の郵便受付で、届いた封筒の表面の写真を読み取る係です。
封筒に書かれている文字を、欄ごとに分けてそのまま書き出してください。
宛先の部署を決めたり、中身を推測したりする必要はありません。
【書き出す欄】
- recipient_company … 宛先の会社名・団体名
- recipient_department … 宛先の部署・課・係の名前
- recipient_person … 宛先の個人名。「ご担当者様」「御中」などもそのまま
- sender … 差出人の会社名・団体名・個人名(表面に見える場合のみ)
- markings … 親展、書留、簡易書留、速達、特定記録、
「〜在中」などの朱書きや印字・スタンプの有無
【厳守事項】
- 写真に見える文字だけを、表記を変えずに書き出してください。
略称を正式名に直す、漢字を補う、表記をそろえる、をしないでください。
- 書かれていない欄は空にし、not_written に欄名を入れてください。
- 文字はあるが読めない欄は空にし、unreadable に欄名を入れてください。
一部の文字だけ読めない場合も、推測で補わずに unreadable にしてください。
- 部署がどこか、誰あてかを推測しないでください。
- 封筒の中身や、急ぎかどうかを書かないでください。
- 複数の封筒が写っている場合は、multiple_envelopes を true にし、
ほかの欄は空にしてください。
- 封筒でない物(荷物の伝票、はがきの裏面など)が写っている場合は、
item_type に何が写っているかを書いてください。
- 宛名のラベルと、封筒に印刷された差出人の住所を取り違えないでください。
差出人の情報は、封筒の印刷・スタンプ・裏面の記載から判断してください。
「一部の文字だけ読めない場合も推測で補わない」を明記しないと、AIは補います。 「営業〇部」の〇がかすれていれば、文脈から「第一」と書き足します。その会社に第一営業部と第二営業部があれば、半分の確率で違う部署に届きます。
最後の項目は、窓付きの封筒への対策です。 窓付きの封筒は、窓から見える宛名と、封筒に印刷された差出人の住所が同じ面に並びます。取り違えると、差出人の会社あての郵便として処理されます。
出力形式を固定する
次の形のJSONで受け取ります。 Gemini API の構造化出力を使い、response_format に mime_type を application/json、schema に下の形のスキーマを入れて渡します。画像は、同じ要求の input に type を image とし、base64 の data と mime_type を付けて入れます。指示の文を画像より前に置きます。
{
"item_type": "envelope",
"multiple_envelopes": false,
"recipient_company": "",
"recipient_department": "",
"recipient_person": "",
"sender": "",
"markings": {
"confidential": false,
"registered": false,
"simple_registered": false,
"express": false,
"recorded": false,
"enclosed_note": ""
},
"not_written": [],
"unreadable": []
}
1つ目の理由は、照合をスクリプトで行えることです。 部署名と氏名が別の欄で返るので、部署名は一覧と旧部署名の対応表に、氏名は社員の一覧に、それぞれ照らせます。両方が一致し、かつ同じ部署を指していれば「一致」です。
2つ目は、markings で扱いを規則で分けられることです。 スクリプトは次の表で台帳の区分と知らせの文面を決めます。
| 条件 | 台帳の区分 | 部署への知らせ |
|---|---|---|
| 部署と氏名が一致、表示なし | 一致 | 「郵便が届いています」 |
confidential が true | 一致(親展) | 「親展の郵便です。本人が取りに来てください」 |
registered か simple_registered が true | 要確認(書留) | 受付が確かめてから知らせる |
部署か氏名が一致しない、unreadable に宛先の欄がある | 要確認 | 受付が行き先を決めてから知らせる |
| 宛先の会社が自社名の一覧に無い | 要確認(誤配の疑い) | 知らせない |
| 氏名が退職者と一致 | 要確認(退職者あて) | 知らせない |
3つ目は、not_written と unreadable で受付の作業が分かれることです。 部署名が not_written なら「会社あて」として総務で受け、unreadable なら受付が封筒を見ます。台帳の「要確認」の理由の欄に、どちらかを書き分けます。
構造化出力は JSON の形を守りますが、値が正しいかはアプリケーションで確かめるよう公式の説明にあります。 読み取った部署名や氏名が一覧と一致しないことは、それ自体が「確かめる」仕組みになっています。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付のフォルダ | getFiles() で一覧にし、getBlob() で読む | 封筒の写真 |
| Gemini API | UrlFetchApp.fetch() で POST | 表面の文字の読み取り |
| 一覧・対応表・連絡先のシート | 読み取り | 照合と知らせの送り先 |
| 受付台帳のシート | 書き込み | 受付の日時、写真へのリンク、読み取り結果、区分、受け取りの記録 |
| 部署の Chat スペース | 受信 Webhook に POST | 受け取りの知らせ |
| 処理済みのフォルダ | ファイルの moveTo() | 処理の終わった写真を移す |
UrlFetchApp.fetch() は、method に post、contentType に JSON、headers に API キー、payload に要求の本文を入れて呼びます。muteHttpExceptions を true にすると、失敗の応答でも例外を投げずに応答を返します。 状態コードを見て、写真を受付のフォルダに残したまま次の実行に回すかを決めます。
Chat の Webhook は、部署のスペースごとに1つ作ります。 Webhook の投稿はスペースあたり毎秒1回までで、同じスペースの Webhook で共有されます。郵便が届いた直後は同じ部署あての知らせが続くことがあるため、1回の実行の中で部署ごとにまとめ、「3通届いています」の1件にします。
API キーと Webhook の URL は、コードに書かずスクリプト プロパティか連絡先のシートに置きます。 スクリプト プロパティはスクリプトのすべての利用者で共有されます。連絡先のシートとスクリプトの編集権限は、総務の担当者に限ります。 Webhook の URL を知っていれば誰でもそのスペースに投稿できるためです。
人が確認する
受付の担当者が確かめるのは、台帳の「要確認」の行だけです。 「一致」の行は、仕分けのときに封筒と台帳の行番号が合っているかを見るだけにします。
- 書留の行を先に見る … 配達員から受け取ったときの記録と、台帳の行数が合っているかを確かめます。書留の知らせは、受付が確かめてから送ります
- 宛先が一致しない行を見る … 写真と封筒を見て、行き先の部署を台帳に入れます。入れると、スクリプトが次の実行で知らせを送ります
- 退職者あて・誤配の疑いを見る … 退職者あては総務の規則に沿って扱い、誤配は差し戻しの箱に入れます
- 封筒に行番号の付箋を貼り、棚に仕分ける … 部署の担当者が棚から取るときに、台帳と照らせます
- 書留の受け取りを記録する … 部署の担当者が取りに来たら、台帳のシートの受け取りの欄に氏名と日時を入れます
2番目で受付が決めた行き先は、旧部署名の対応表を育てる材料になります。 同じ旧部署名が月に何度も「要確認」になるなら、対応表に1行足します。対応表が育つほど、「要確認」の行は減っていきます。
目標は、1,800通をならして1通1分です。 1分には、撮影・仕分け・付箋を貼る時間と、「要確認」の行を確かめる時間が入っています。「要確認」が全体の2割を超える日は、組織変更があったか、撮影の写真がぼけているかのどちらかです。
例外に対処する
| 起きること | 対応 |
|---|---|
| 1枚に複数の封筒が写っている | multiple_envelopes で検知し、撮り直しを頼む |
| 封筒でない物が写っている | item_type を見て、台帳に記録せず受付へ戻す |
| 写真がぼけて宛先が読めない | unreadable で検知。撮り直すか、受付が封筒を見て入力する |
| 形式・サイズが範囲外 | 処理せず台帳に「形式外」と記録し、撮り直しを頼む |
| 同じ写真が2回保存された | ハッシュ値で検知し、2枚目を処理しない |
| 宛名が退職者 | 「退職者あて」として要確認。総務の規則に沿って扱う |
| 宛先の会社が自社でない | 「誤配の疑い」として要確認。知らせない |
| Gemini API がエラーを返す | 写真を受付のフォルダに残し、次の実行で再試行 |
| Chat への投稿が失敗する | 台帳に「未通知」と記録し、次の実行で送り直す |
| 書留・親展が翌日も受け取られていない | 翌朝、部署へもう一度知らせる |
上から3行目までは、撮り方の問題です。 受付の机に、明るさのそろった撮影の位置を決めておくのがいちばん効きます。
記録を残す
- 封筒の写真(処理済みのフォルダ)と、受付の日時
- Gemini API が返したJSONの全文
- 照合の結果(一致した社員・部署、旧部署名の読み替えの有無)と、そのとき使った一覧を読んだ時刻
- 受付が「要確認」の行で決めた行き先と、決めた人
- 部署への知らせを送った日時と、再送の日時
- 書留の受け取りの記録 … 受け取った人の氏名と日時
最後の行は、紙の台帳でサインをもらっていた部分です。 シートに移しても、受け取った人が自分で入力するか、受付が本人の前で入力する運用にします。誰がいつ受け取ったかを後で確かめられることが、書留の台帳の役目です。
写真の保存の期間を先に決めます。 封筒の表面には、社員の氏名と取引先の名前・住所が写っています。台帳の記録は残し、写真は一定の期間が過ぎたら削除する運用が考えられます。期間は社内の文書の保存の規程に合わせます。
04実装レベルの3段階
本記事の想定は半自動化です。 1通3分が1分になる計算は、この段階で置いています。撮影と仕分けは人が行い、台帳を書く・行き先を調べる・知らせるの3つを仕組みに移します。 本格構成で足すのは、受け取りの記録と保留の管理です。 保留の郵便に判断の期限を付け、過ぎたものを総務の課長に知らせます。第3章の(d)の保留の箱が片付くのは、この段階です。
05工数削減シミュレーション
導入後 1,800件 × 1分 ÷ 60 = 30 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 本社や庁舎に1日数十〜百通以上の郵便が届き、総務の受付が宛名を見て部署を調べ、台帳に手で書き、部署へ連絡している企業・自治体。組織変更や異動が多く、旧部署名や退職者あての郵便の行き先を調べる手間が大きい場合。社員と部署の一覧を Google スプレッドシートで持ち、部署ごとに Google Chat のスペースがある場合。
- 届く郵便が1日に数通で、受付の担当者が全員の名前と部署を覚えている場合。郵便物の受付を外部の郵便室の代行に任せており、台帳もその仕組みの中にある場合。封筒を開けて中身(請求書や申請書)を読み取りたい場合(この構成は封筒の表面だけを読み、開封しません)。
07最小構成で試す方法
- 1日分の郵便から30通を選ぶ(旧部署名あて、手書きの宛名、窓付きの封筒、書留を混ぜる)
- 1通ずつ表面をスマートフォンで撮る
- 会社が契約しているAIサービスの画面に、写真を1枚ずつ貼る
- 「封筒の表面に書かれた宛先の会社名・部署名・氏名、差出人、親展・書留・速達の表示を、表記を変えずに書き出してください。書かれていない欄と読めない欄を分けてください。推測で補わないでください」と指示する
- 出てきた結果を、受付が手で書いた台帳と突き合わせる
| 出てきた内容 | 判断 |
|---|---|
| 宛先と表示が台帳と同じに読めた | スクリプトとの連携に進む |
| 読めない文字を推測で補った | 指示の書き方で直る。構成は有効 |
| 写真がぼけて読めない封筒が多い | 撮影の位置と明るさが先。 AIの問題ではない |
一覧とそのまま一致しそうな割合を数えておくと、旧部署名の対応表にどのくらい手を入れるかが分かります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 読めない文字を推測で補って別の社員と一致する | 推測を禁じ、unreadable に欄名を返させる |
| 「書かれていない」と「読めない」が混ざる | 別の欄で返させ、台帳の理由を書き分ける |
| AIに一覧を渡して部署を選ばせてしまう | 一覧は渡さず、照合はスクリプトで行う |
| 窓付きの封筒で差出人と宛先を取り違える | 指示で明記し、自社名の一覧に照らして宛先を確かめる |
| 「第一営業部」と「第1営業部」が一致しない | 一覧と読み取り結果の両方を同じ形に正規化する |
| 旧部署名あてが毎回「要確認」になる | 受付が決めた行き先から対応表を育てる |
| 同じ封筒を2回撮って二重に知らせる | ハッシュ値で重複を検知する |
| 郵便が一度に届いて処理が6分を超える | 1回の実行を20枚までにし、残りは次の実行へ |
| 同じ部署への知らせが続いて投稿の上限にかかる | 部署ごとにまとめて1件にする |
| 書留の受け取りの記録が残らない | 書留は必ず「要確認」にし、受け取りの欄を設ける |
| 異動の当日に一覧の更新が遅れる | 一覧を読んだ時刻を台帳に残し、照合の版を追えるようにする |
上の3行が、この構成の失敗のほとんどです。 どれも、AIに「行き先」を考えさせてしまうことから起きます。AIは読むだけ、決めるのは一覧と受付、という線を守ってください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 封筒の表面に写った社員の氏名と部署、取引先や個人の差出人の名前と住所です。封筒の中身は扱いません。 ただし、宛名の氏名と差出人の組み合わせからは、社員が誰とやり取りしているかが分かります。
- 封筒を開けない … 親展はもちろん、普通郵便もこの構成では開封しません。読み取りの精度を上げるために開封する運用に広げないでください
- 有料の枠で使う … Gemini API の追加の利用規約では、無料の枠に送った内容は製品の改善に使われ、人が読むことがあるとされ、個人の情報を送らないよう求められています。 有料の枠では、プロンプトと応答を製品の改善に使わないとされています。氏名と住所が写る以上、有料の枠で使います
- 一覧をAIに渡さない … 社員と部署の一覧は、照合のためにスクリプトの中でだけ使います
- 知らせに差出人を載せるかを決める … 部署のスペースには部署の全員がいます。親展の郵便は、差出人を載せずに「親展の郵便が届いています」とだけ知らせます
- 写真と台帳の閲覧を限る … 受付のフォルダ・処理済みのフォルダ・台帳は、総務の担当者だけが開けるようにします
- 写真の保存の期間を決める … 台帳の記録を残し、写真は一定の期間で削除する運用を、社内の規程に合わせて決めます
誤りが起きた場合のリスクは、郵便が違う部署・違う人に届くことと、書留や親展の受け取りの記録が残らないことの2つです。 前者は推測の禁止と一覧の照合で、後者は書留を必ず「要確認」に回すことで防ぎます。
10まず何から始めるか
1週目:旧部署名の対応表と自社名の一覧を作る
過去3年の組織変更から旧部署名の対応を書き出し、自社名の略称・旧社名も一覧にします。
2週目:30通で試す
旧部署名あて、手書き、窓付き、書留を混ぜた30通を撮り、会社が契約しているAIサービスで読み取らせます。読めない文字を推測で補っていないかを最優先で見ます。
3週目:撮影の場所と、フォルダから台帳までをつなぐ
受付の机に撮影の位置を決め、Google ドライブのアプリで受付のフォルダへ保存する手順をそろえます。スクリプトで写真を読み取り、一覧に照らして台帳に記録するところまで作ります。この時点では部署へ知らせず、台帳の「一致」と「要確認」の割合を数えます。
4週目:部署への知らせを足す
部署ごとの Chat スペースに Webhook を作り、「一致」の郵便から知らせを送ります。書留と親展の知らせの文面は、総務の課長と決めてから送ります。
2か月目: 紙の台帳をやめ、書留の受け取りをシートに記録する運用に切り替えます。3か月目以降: 「要確認」の行から旧部署名の対応表を育て、保留の郵便の期限管理を足します。1通3分が何分になったかと、「要確認」の割合が下がったかを実測した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 時間主導型のトリガーが毎分から毎月までの間隔で動くこと。インストール型トリガーが作成した人のアカウントで実行されること。フォーム・スプレッドシート・カレンダーなどの出来事を起点にするトリガーの種類 | Google for Developers: Installable triggers | 2026-10-07 |
| 1回の実行が6分まで。トリガーの合計実行時間が Google Workspace で1日6時間。URL の取得が Google Workspace で1日100,000回 | Google for Developers: Quotas for Google Services | 2026-10-07 |
フォルダの getFiles() が子のファイルの一覧を返すこと | Google for Developers: Folder | 2026-10-07 |
ファイルの getBlob()・getMimeType()・getSize()・moveTo() | Google for Developers: File | 2026-10-07 |
Utilities.base64Encode() がバイト列を base64 の文字列にすること。computeDigest() がダイジェストを計算すること | Google for Developers: Utilities | 2026-10-07 |
UrlFetchApp.fetch() の method・contentType・payload・headers・muteHttpExceptions | Google for Developers: UrlFetchApp | 2026-10-07 |
| スクリプト プロパティがスクリプトのすべての利用者で共有されること | Google for Developers: Properties Service | 2026-10-07 |
| Google Chat の受信 Webhook が一方向の知らせであること。スペースあたり毎秒1回の上限を Webhook で共有すること。組織が Webhook の利用を許可している必要があること | Google for Developers: Send Google Chat messages with incoming webhooks | 2026-10-07 |
Gemini API に画像を base64 で渡す形式(type・data・mime_type)。対応形式が PNG・JPEG・WEBP・HEIC・HEIF であること。要求の全体が20MBまでであること。指示の文を画像より前に置くことが勧められていること | Google AI for Developers: Image understanding | 2026-10-07 |
Gemini API の構造化出力が /v1beta/interactions の response_format(mime_type と schema)で指定でき、値の正しさはアプリケーションで確かめるべきこと | Google AI for Developers: Structured output | 2026-10-07 |
| 無料の枠に送った内容が製品の改善に使われ人が読むことがあり、機密・個人の情報を送らないよう求められていること。有料の枠ではプロンプトと応答を製品の改善に使わないこと | Google AI for Developers: Gemini API Additional Terms of Service | 2026-10-07 |
書留・親展・退職者あての郵便の扱いと、写真の保存の期間は、自社の総務の規程に合わせて決めてください。 本記事は Google for Developers と Google AI for Developers で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0637)についてのご相談はこちらから。
