クリーニング店に届く集配の依頼をメールとフォームから読み取り、集配の予定表に並べて、地域ごとの回り順の案を作る
メールとWebフォームで届く集配の依頼から、氏名・住所・希望日・時間帯・品目と点数を取り出して、集配の予定表に並べます。そのうえで、日と時間帯と地域ごとに回り順の案を作り、受付の担当が確かめてからドライバーに渡します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/小売
- 対象部門
- カスタマーサポート/物流
- 対象業務
- データ入力・転記/台帳・マスタ管理
- 主な課題
- 入力作業が多い/属人化している/期限・対応漏れが起きる
- AIで行う処理
- 抽出
- 主な効果
- 入力漏れ削減/属人化解消/工数削減
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 受付の担当が朝と昼にメールとフォームの回答を開き、新しい依頼を探す
- 1件ずつ読み、氏名・住所・電話・希望日・時間帯・品目と点数・注意事項を集配の予定表に書き写す
- 顧客台帳を開き、既存の顧客かを確かめる。住所が台帳と違えば、どちらが正しいかを考える
- 日時や点数が書かれていない依頼は、電話かメールで聞き直す
- 前日の夕方、店長が翌日の依頼を時間帯ごとに分け、地図を見ながら車ごとの回り順を決める
- 回り順を印刷してドライバーに渡す
- 自動フォームの回答が届くたびに、スクリプトが依頼の取り込みを始める
- 自動10分ごとに、受付のメールのうち「集配依頼」のラベルが付いた未処理のものを読む
- 自動引用された過去のメールと署名を落とし、顧客台帳からメールアドレスと電話番号で顧客を引く
- 自動Claude API が、氏名・住所・希望日・時間帯・品目と点数・注意事項を決まった形のJSONで返す
- 自動スクリプトが地域表で地域を割り当て、住所を地図で引いて1か所に決まるかを確かめる
- 自動予定表に1行を書き、欠けている項目には「聞き直し」、地図で決まらない住所には「確認」の印を付ける
- 人受付の担当が印の付いた行だけを開き、顧客に聞き直すか台帳で確かめる
- 自動前日の16時に、翌日の依頼を時間帯と地域ごとにまとめ、地図のサービスで回り順の案を作る
- 人店長かドライバーが案を見て、顧客ごとの事情を足して順番を直し、確定する
各工程の詳しい説明を読む
- 受付の担当が朝と昼にメールとフォームの回答を開き、新しい依頼を探す
- 1件ずつ読み、氏名・住所・電話・希望日・時間帯・品目と点数・注意事項を集配の予定表に書き写す
- 顧客台帳を開き、既存の顧客かを確かめる。住所が台帳と違えば、どちらが正しいかを考える
- 日時や点数が書かれていない依頼は、電話かメールで聞き直す
- 前日の夕方、店長が翌日の依頼を時間帯ごとに分け、地図を見ながら車ごとの回り順を決める
- 回り順を印刷してドライバーに渡す
(a)書き写す作業が件数のぶんだけある。 1件で7〜8項目を予定表に写すので、メールを読む時間と合わせて1件2分ほどかかります。依頼の多い月曜と衣替えの時期は、受付の担当が昼までこの作業から離れられません。
(b)書き漏れが当日に分かる。 「火曜に取りに来て」とだけ書かれ、時間帯が無い依頼を見落とすと、ドライバーが夜間に行って留守だった、ということが起きます。品目の点数が無いまま行くと、車に積む場所が足りるかが分かりません。 聞き直しが必要な依頼を、読んだその場で見分けられていないのが原因です。
(c)回り順が店長の頭の中にある。 地域の土地勘と、顧客ごとの事情(駐車できる場所、管理人のいる時間)を知っているのは店長とベテランのドライバーだけです。店長が休む前日は、ドライバーが自分で組み直し、回り切れない依頼が出ます。
(d)同じ顧客の依頼が二重に入る。 常連の事業者がメールのあとで電話もかけてくると、両方が予定表に載ることがあります。
- 【自動】 フォームの回答が届くたびに、スクリプトが依頼の取り込みを始める
- 【自動】 10分ごとに、受付のメールのうち「集配依頼」のラベルが付いた未処理のものを読む
- 【自動】 引用された過去のメールと署名を落とし、顧客台帳からメールアドレスと電話番号で顧客を引く
- 【自動】 Claude API が、氏名・住所・希望日・時間帯・品目と点数・注意事項を決まった形のJSONで返す
- 【自動】 スクリプトが地域表で地域を割り当て、住所を地図で引いて1か所に決まるかを確かめる
- 【自動】 予定表に1行を書き、欠けている項目には「聞き直し」、地図で決まらない住所には「確認」の印を付ける
- 【人】 受付の担当が印の付いた行だけを開き、顧客に聞き直すか台帳で確かめる
- 【自動】 前日の16時に、翌日の依頼を時間帯と地域ごとにまとめ、地図のサービスで回り順の案を作る
- 【人】 店長かドライバーが案を見て、顧客ごとの事情を足して順番を直し、確定する
7番目が、この設計の分かれ目です。人が開くのは、印の付いた行だけです。 項目がそろって住所が1か所に決まった依頼は、一覧で流し見て終わりにします。全件を開き直す運用にすると、4分が1分になりません。
8番目と9番目を分けているのも、意図してのことです。 地図のサービスは道の上で最短になる順番を返しますが、時間の約束と駐車の事情は店の側にしかありません。 案を出すところまでを機械に、確定を人に置きます。
02今回想定するシステム構成
Googleフォーム(集配依頼) Gmail(受付のアドレス) │ 回答の送信 │ 「集配依頼」ラベル ▼【トリガー】フォーム送信 ▼【トリガー】10分ごと Google Apps Script ├──▶ 引用・署名の除去、顧客台帳の照合 ▼ Claude API ── 依頼の文面から項目を取り出す(JSON) ▼ Google Apps Script ├──▶ 地域表で地域を割り当てる ├──▶ Maps の Geocoder で住所を引き、1か所に決まるかを確かめる ▼ 集配の予定表(スプレッドシート) │ 「聞き直し」「確認」の印 → 受付の担当 ▼【トリガー】前日16時 Google Apps Script ── Maps の DirectionFinder で時間帯・地域ごとの回り順の案 ▼ 【人が確定】店長・ドライバー → 印刷・共有
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Python |
| 生成AI | Claude API(依頼の文面からの項目の取り出し) | OpenAI API、Gemini API |
| 地図 | Apps Script の Maps サービス(Geocoder と DirectionFinder) | Google Maps Platform の Routes API |
| 保管 | スプレッドシート(予定表・顧客台帳・地域表) | Google ドライブ上の CSV |
新しく足すものは、スクリプトと Claude API の契約だけです。 フォーム、受付のメール、顧客台帳、予定表はいま使っているものをそのまま使います。最初の準備は、地域表を作ることです。 町名か郵便番号から「北エリア」「駅前エリア」のような地域へ引ける表を、店長の土地勘から書き起こします。
起点になるのは、Apps Script のインストール型トリガーです。 公式の説明では、インストール型トリガーには時間主導型、フォーム送信(Googleフォーム用と、フォームが回答を送るスプレッドシート用)、カレンダーのイベントなどがあります。Gmail の受信をきっかけにするトリガーは一覧にありません。 そのため、メールは10分ごとの時間主導型で拾いに行きます。
時間主導型のトリガーは、実行の時刻がずれることがあります。 公式の説明では、たとえば9時に設定した定期のトリガーが9時から10時のあいだのどこかで動くことがあり、その時刻は日ごとに一定です。前日16時の回り順の案は、店長が見る時刻より余裕をもって設定します。 また、インストール型トリガーは作成した人のアカウントで動きます。受付の共用アカウントで作り、個人のアカウントで作らないようにします。
回り順の案には、Maps サービスの DirectionFinder を使います。 立ち寄り先の順番を効率のよい順に並べ替えるかを setOptimizeWaypoints(既定は false)で決められ、戻り値の経路には区間(legs)ごとの始点・終点の位置が入っています。
03どうやって実装するのか
処理の起点を決める
入口ごとにトリガーを分けます。 フォームは回答のたびに動くフォーム送信のトリガー、メールは10分ごとの時間主導型のトリガーです。電話で受けた依頼は受付の担当がフォームに打ち込むので、電話の依頼もフォームの経路に乗ります。
メールの拾い方は、Gmail の検索の文字列で決めます。受付のアドレスで、集配の依頼らしいメール(件名や送信元の常連の事業者)に「集配依頼」のラベルを自動で付けるフィルタを Gmail 側に置き、スクリプトは label:集配依頼 -label:集配_取込済 で探します。処理が終わったスレッドには「集配_取込済」のラベルを付けます。 付けるのは予定表への書き込みが成功したときだけにし、ラベルの付いていないものが、そのまま未処理の数になります。
GmailApp の search は、スレッド全体が大きすぎると失敗するとされ、ページ指定の版(search(query, start, max))が案内されています。ページ指定の版で、1回に読む件数の上限を決めておきます。
前日16時のトリガーは、回り順の案だけを作ります。 依頼の取り込みとは別の処理にしておくと、取り込みで止まった1件が回り順の案まで止めることがありません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| フォームの回答 | 氏名、住所、電話、メールアドレス、希望日、時間帯、品目(自由記入)、備考 | フォーム送信のトリガーのイベント |
| 依頼のメール | 本文、件名、送信元、受信日時、スレッドのID | Gmail(「集配依頼」のラベル) |
| 顧客台帳 | 顧客コード、氏名・屋号、住所、電話、メールアドレス、駐車・訪問の注意事項 | スプレッドシート |
| 地域表 | 町名・郵便番号と地域の対応、地域ごとの担当の車 | スプレッドシート(店長が作る) |
| 予定の枠 | 日付、時間帯、車ごとの受けられる件数の目安、休業日 | スプレッドシート |
質を決めるのは、顧客台帳と地域表です。 台帳に駐車や訪問の注意事項が無いと、回り順の案を直すときに店長の記憶に頼ることになります。地域表が無いと、地域を決めるのにまたAIや地図を使うことになり、判断の筋道が毎回変わります。 地域は表で機械的に決めるのが、この構成の決まりです。
予定の枠を表で持つのは、受けすぎを見るためです。 時間帯ごとの件数が目安を超えたら、予定表のその枠に色を付けます。受けるかどうかを決めるのは人ですが、超えていることに気づくのは機械にさせます。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| フォームの各欄 | フォーム送信のイベントが持つ回答 | 欄で分かれている項目はそのまま使う。品目と備考だけをAIへ |
| メールの本文と受信日時 | GmailApp で検索したスレッドの最新のメッセージ | 本文をAIへ。受信日時は「来週」などの基準日 |
| 顧客の情報 | 顧客台帳をメールアドレス→電話番号の順で引く | 既存の顧客か、住所が台帳と同じか |
| 地域 | 地域表を町名→郵便番号の順で引く | 予定表の地域の列 |
| 住所の位置 | Maps サービスの Geocoder の geocode | 1か所に決まるか。回り順の案の立ち寄り先 |
フォームの経路では、欄で分かれている項目をAIに渡しません。 氏名や電話は欄のまま正しいので、AIに通すと書き換わる余地が増えるだけです。AIに渡すのは、自由記入の品目と備考だけにします。メールの経路は本文に全部が書かれているので、本文全体を渡します。
顧客台帳の照合は、メールアドレスが先、電話番号が後、氏名は使いません。 同姓の顧客や、店名と代表者名が混ざる事業者があるからです。どちらでも引けなければ「新規」として扱い、新規の顧客は必ず受付の担当が確かめる行にします。
Geocoder の geocode は住所からおおよその地点を返し、results の各結果に formatted_address と緯度・経度が入ります。setRegion と setLanguage で日本と日本語に設定し、結果が1件でなければ「確認」の印にします。
AIへ渡す前に整形する
- 引用と署名の除去 … メールの本文から「>」で始まる行と、「-- 」以下の署名を落とします。過去のやり取りの日付や品目を、今回の依頼として読ませないためです
- 文字の正規化 … 全角の数字・英字を半角に、丁目・番地の「-」「ー」「の」の表記をそろえます
- 基準日の付与 … 受信日時(フォームは送信日時)と、そこから14日分の日付と曜日の一覧を作り、AIに一緒に渡します
- 顧客の引き当て … 台帳で引けた顧客は、顧客コードと台帳の住所を一緒に渡します
- 重複の検知 … 同じ顧客で、同じ希望日の依頼が予定表にすでにあれば「重複の疑い」の印を付けます
3番目を軽く見ないでください。 「来週の火曜」「明後日」は、いつ送られたかで日付が変わります。基準日と曜日の一覧を渡さないと、AIは今日の日付を知らないまま日付を作ります。 一覧の範囲外の日付は、選べないようにします。
AIに処理させる
させるのは、依頼の文面を決まった項目に分けることと、書かれていない項目を「書かれていない」と返すことだけです。
| 取り出すもの | 取り出し方 | 書かれていないときの扱い |
|---|---|---|
| 依頼の種類 | 集荷/お届け/両方 | 判断できなければ unknown |
| 氏名・屋号 | 文面にある表記のまま | 無ければ空。台帳の値で埋めない |
| 住所 | 文面にある表記のまま。台帳の住所と違えば address_differs | 無ければ空 |
| 希望日 | 基準日の一覧から選び、根拠の文字列を写す | 無ければ空。「来週のどこか」は ambiguous |
| 時間帯 | 午前/午後/夜間 | 「夕方」など枠に当てはまらなければ ambiguous |
| 品目と点数 | 品目ごとに点数。点数が無ければ空 | 「冬物いろいろ」は品目だけを写し点数は空 |
| 注意事項 | しみ抜き、急ぎ、不在時の置き場所など | 無ければ空 |
右端の列が、この構成でいちばん大事な区別です。 空と ambiguous は、どちらも受付の担当が顧客に聞き直すものですが、空は「書いてもらう」、ambiguous は「どちらかを選んでもらう」で、聞き方が違います。分けて返させると、聞き直しの文面がそのまま決まります。
| させないこと | 理由 |
|---|---|
| 地域の割り当て | 地域表で機械的に決める。AIに決めさせると日によって変わる |
| 回り順の決定 | 地図のサービスで案を出し、人が確定する |
| 住所の補完・修正 | 番地を足す、台帳の住所に置き換える、をしない |
| 依頼を受けるかの判断 | 枠の空き、天候、ドライバーの都合は人が決める |
| 料金や仕上がり日の回答 | 店頭の受付システムと料金表の仕事。文面に答えない |
3行目がいちばん起きやすい失敗です。 台帳の住所と文面の住所が少し違うと、AIは台帳の住所に寄せて書きたがります。引っ越した顧客の新しい住所が、その瞬間に古い住所で上書きされます。 違っていれば違っていると返させ、どちらが正しいかは人が顧客に確かめます。
指示内容を固定する
あなたはクリーニング店の受付で、集配の依頼の文面を予定表の項目に分ける担当です。
渡された文面に書かれていることだけを取り出してください。推測で埋めないでください。
【取り出す項目】
1. request_type:集荷(pickup)/お届け(delivery)/両方(both)/不明(unknown)
2. name:氏名または屋号。文面の表記のまま
3. address:住所。文面の表記のまま
4. preferred_date:希望日。下の【基準日と日付の一覧】から選ぶ
5. time_slot:午前(am)/午後(pm)/夜間(night)
6. items:品目と点数の組。点数が書かれていなければ count は null
7. notes:しみ抜き、急ぎ、不在時の置き場所など、作業や訪問の注意事項
【厳守事項】
- 書かれていない項目は空(文字列は ""、数は null)にしてください。
台帳の情報、過去の依頼、一般的な傾向から埋めないでください。
- 住所は文面の表記のまま写してください。番地を補う、表記を直す、
台帳の住所に置き換える、のいずれもしないでください。
台帳の住所と違う場合は address_differs を true にしてください。
- 希望日は【基準日と日付の一覧】にある日付からだけ選んでください。
「来週の火曜」などの言い方は一覧の曜日で日付に直し、
date_evidence に元の言い方をそのまま写してください。
1日に決められない(「来週のどこか」「火曜か水曜」)ときは
preferred_date を空にし、date_status を ambiguous にしてください。
- 時間帯が「夕方」「お昼ごろ」など3つの枠に当てはまらないときは
time_slot を空にし、slot_status を ambiguous にしてください。
- 「冬物いろいろ」のように点数が無いものは、品目だけを写し count を null にしてください。
点数を見積もらないでください。
- 料金、仕上がり日、受けられるかどうかには触れないでください。
- 集配の依頼でない文面(料金の質問、苦情、営業のメール)は、
is_request を false にし、ほかの項目は空にしてください。
- 1通に複数の依頼(別の日、別の住所)があるときは、requests に分けて並べてください。
【基準日と日付の一覧】{base_date_and_calendar}
【顧客台帳で引けた情報】{customer_record}
【依頼の文面】{request_text}
「台帳の住所に置き換えない」を明記しないと、置き換えます。 台帳の情報を一緒に渡しているので、何も言わなければ、より整った台帳の表記を「正しい住所」として選びます。禁じるのは、台帳を根拠に文面を書き換えることそのものです。 それでも台帳を渡すのは、address_differs を判定させるためです。
「点数を見積もらない」も同じ理由です。 「冬物いろいろ」から「5点」を作られると、予定表の上では点数がそろって見え、聞き直すべき依頼が聞き直されなくなります。
出力形式を固定する
Claude API の構造化出力で、次の形のJSONを受け取ります。 公式の説明では、output_config.format に type: "json_schema" とスキーマを渡すと、スキーマに沿った出力が返ります。
{
"is_request": true,
"requests": [
{
"request_type": "pickup | delivery | both | unknown",
"name": "",
"address": "",
"address_differs": false,
"preferred_date": "2026-10-20",
"date_status": "ok | missing | ambiguous",
"date_evidence": "来週の火曜",
"time_slot": "am | pm | night | ",
"slot_status": "ok | missing | ambiguous",
"items": [ { "item": "ワイシャツ", "count": 5 } ],
"notes": ""
}
]
}
1つ目の理由は、date_status と slot_status で聞き直しの印が機械的に決まることです。 どちらかが missing か ambiguous なら、スクリプトが予定表の「聞き直し」の列に印を付けます。印を付けるかどうかをAIに書かせないので、規則を変えるときはスクリプトだけを直します。
2つ目は、requests を配列にしておけることです。 事業者は「火曜に制服、金曜にタオル」のように1通で複数の依頼を書きます。1通を1行にすると、2つ目の依頼が消えます。
3つ目は、date_evidence で確認が速くなることです。 受付の担当は、日付が元の言い方から正しく直っているかを、メールを開かずに一覧で読めます。
公式の説明では、スキーマでは additionalProperties を false にする必要があり、数の範囲(minimum・maximum)や文字列の長さの制約は使えません。点数の上限や住所の長さは、受け取った後にスクリプトで確かめます。 また、出力が max_tokens で途中で切れたときはスキーマに沿わないことがあるとされているので、stop_reason を見て、切れていれば人に回します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Googleフォーム | フォーム送信のトリガー | 回答を受け取る |
| Gmail | GmailApp(検索とラベル) | 依頼のメールを読み、処理済みのラベルを付ける |
| Claude API | UrlFetchApp で Messages API を呼ぶ | 文面から項目を取り出す |
| 顧客台帳・地域表 | SpreadsheetApp(読み取り) | 顧客の引き当てと地域の割り当て |
| Maps サービス | Geocoder と DirectionFinder | 住所の位置と、回り順の案 |
| 集配の予定表 | SpreadsheetApp(書き込み) | 1依頼1行を追記し、印を付ける |
顧客台帳には書き込みません。 文面の住所が台帳と違っても、台帳を直すのは人が顧客に確かめた後です。スクリプトが書くのは予定表だけにします。
回り順の案の作り方は、次のとおりです。 翌日の依頼を時間帯と地域でまとめ、店を出発点と到着点にして、Geocoder で引いた緯度・経度を addWaypoint(latitude, longitude) で立ち寄り先に加え、setOptimizeWaypoints(true) で経路を取ります。返ってきた区間(legs)の終点の位置を、立ち寄り先の緯度・経度と突き合わせて、訪問の順番を読み取ります。 公式のページには立ち寄り先の数の上限が書かれていないので、1回の経路に入れる件数は地域と時間帯で分けて小さく保ち、試しの段階で何件まで通るかを確かめます。
Maps の経路の検索には1日の上限があります。 公式の割り当ての表では、Google Map の経路検索(Direction query)は個人のアカウントで1日1,000回、Google Workspace のアカウントで1日10,000回です。回り順の案は時間帯と地域の組ごとに1回なので、1日数十回に収まります。 1回の実行は6分までなので、前日の処理は時間帯ごとに分けて動かします。
API キーはスクリプトのプロパティに置き、コードに書きません。
人が確認する
人が開くのは、印の付いた行だけです。 印の付いていない行は、一覧で件数と時間帯の偏りを流し見ます。
- 「聞き直し」を先に片づける …
missingは書いてもらう、ambiguousは選んでもらう。前日の15時までに顧客へ連絡し、16時の回り順の案に間に合わせます - 「確認」を見る … 住所が地図で1か所に決まらない、台帳の住所と違う、新規の顧客。台帳を直すのは、顧客に確かめてからです
- 「重複の疑い」を見る … メールと電話の両方で届いた依頼か、本当に2回の依頼かを確かめます
- 回り順の案を確定する … 店長かドライバーが、時間の約束と駐車の事情を足して順番を直します
4番目を省かないでください。 地図の上で最短の順番は、開店前に回るはずの美容室を11時に置くことがあります。案のまま渡すと、約束の時間を守れない1件が出ます。
目標は、900件をならして1件1分です。 印が2割を大きく超える月は、フォームの欄か地域表を疑います。
例外に対処する
| 起きること | 対応 |
|---|---|
| 集配の依頼でないメール | is_request が false。ラベルを「受付_要確認」に替えて人に回す |
| 1通に複数の依頼 | requests の数だけ行を書く。行に同じスレッドのIDを残す |
| 希望日が一覧の範囲外 | 日付を書かず「聞き直し」の印 |
| 住所が地図で決まらない | Geocoder の結果が1件でなければ「確認」の印。回り順の案から外す |
| 地域表に無い町名 | 地域を空にし「確認」の印。地域表を足すのは店長 |
| 時間帯の枠の件数が目安を超える | 予定表の枠に色を付ける。受けるかは人が決める |
| 出力が途中で切れた | stop_reason が max_tokens なら書き込まずに人へ |
| Claude API が応答しない | 処理済みのラベルを付けない。次の10分で拾い直す |
| 経路が取れない | その時間帯は回り順の案を空にし、店長に知らせる |
上から4行目までが大半を占めます。 どれもAIの読み違いではなく、依頼の書き方と、地域表・台帳の整い方の問題です。
記録を残す
- 元の文面(メールのスレッドのID、フォームの回答の行)と受信日時
- AIに渡した基準日と、顧客台帳の引き当ての結果
- Claude API が返したJSONの全文と
stop_reason - 予定表に書いた行と、付けた印
- 人が直した記録 … どの項目を、何から何に変えたか。回り順をどう入れ替えたか
- 時間帯・地域ごとの件数と、回り順の案から外した依頼の数
5つ目の「回り順をどう入れ替えたか」が、地域表と台帳を育てる材料になります。 同じ顧客をいつも先頭に動かしているなら、それは台帳の注意事項に書くべき事情です。店長の頭の中にあった段取りが、記録として表に移っていきます。
ログは予定表とは別のシートに置き、文面の全文は保存期間を決めて消します。
04実装レベルの3段階
最小構成では件数がさばけません。 1件ずつ貼るので、月900件には使えません。確かめるための段階です。 半自動化で、1件4分が1分になり、この段階が本記事の想定です。 書き写しと台帳の照合と地域の割り当てが無くなり、回り順は案を直す作業になります。本格構成に進むと、聞き直しの連絡と当日の配信の手間が減りますが、店頭の受付システムとつなぐ作業は店ごとの事情が大きく、第10章の数値には入れていません。 段階を飛ばさないでください。 半自動化を1か月回すと、「確認」の印が多い町名と、回り順をいつも入れ替えている顧客が見えてきます。そこを直してから本格構成に進みます。
05工数削減シミュレーション
導入後 900件 × 1分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 店舗を持ちながら、個人宅や美容室・飲食店などへの集荷とお届けを行っているクリーニング店。依頼がメールとWebフォームに分かれて届き、受付の担当が1件ずつ読んで集配の予定表に書き写している場合。回り順を毎朝ベテランのドライバーか店長が頭の中で組んでいて、その人が休む日に段取りが崩れる場合。Google Workspace か Gmail で受付のメールを受けており、予定表をスプレッドシートで持てる場合。
- 集配の依頼が月に数十件で、受付の担当が読みながら予定表に書けば足りる店。依頼の受付をすでに予約システムに一本化していて、項目が入力欄で分かれて届いている場合。配送のルートを専用の配車システムで組んでいる場合。なお、依頼を受けるか断るか、時間帯の約束を変えるかの判断と、顧客への連絡は人が行うもので、この構成では代替できません。
07最小構成で試す方法
- 先週届いた依頼のメールとフォームの回答から30件を選ぶ(時間帯の書かれていないもの、1通に2つの依頼があるものを必ず入れる)
- その30件を、受付の担当が当時どう予定表に書いたかを並べておく
- 手元のAIサービスの画面に、1件ずつ文面を貼り付ける
- 「この文面から、依頼の種類・氏名・住所・希望日・時間帯・品目と点数・注意事項を表にしてください。書かれていない項目は空にし、推測で埋めないでください。今日は○月○日(○曜日)です」と指示する
- 出てきた表を、当時の予定表の行と突き合わせる
30件は必ずやってください。 スクリプトを書く前に、「文面から項目に分けられるのか」と「書かれていない項目を空で返すのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時の予定表と同じ行になった | スクリプトとフォームの連携に進む |
| 書かれていない時間帯や点数を埋めた | 指示の書き方で直る。構成は有効 |
| 2つの依頼を1行にまとめた | 出力を配列にすれば直る |
2行目が出ることは珍しくありません。 失敗ではなく、指示に何を書けばよいかが1つ分かったということです。 その場合は、厳守事項に1行足して同じ30件をやり直し、空で返るかを見てください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 台帳の住所に置き換えられる | 文面の表記のまま写すと明記し、違えば address_differs で返させる |
| 書かれていない時間帯や点数が埋まる | 空で返すよう指示し、slot_status で聞き直しの印を機械的に付ける |
| 「来週の火曜」がずれた日付になる | 基準日と14日分の日付・曜日の一覧を渡し、そこから選ばせる |
| 過去のやり取りの品目が混ざる | 引用の行と署名を前処理で落とす |
| メールの受信で動かない | Gmail の受信のトリガーは無い。10分ごとの時間主導型で拾う |
| 16時の案が16時に出ない | 時間主導型は1時間の幅でずれることがある。店長が見る時刻より早めに設定 |
| 個人のアカウントでトリガーを作った | 作成した人のアカウントで動く。受付の共用アカウントで作る |
| 地図で住所が決まらない | Geocoder の結果が1件でなければ「確認」の印にし、回り順の案から外す |
| 1回の経路に立ち寄り先を入れすぎる | 上限が公式に書かれていない。地域と時間帯で分け、試しで確かめる |
| 回り順の案をそのまま渡す | 時間の約束と駐車の事情が入っていない。人が確定する |
| 1通の複数の依頼が1行になる | 出力を配列にし、スレッドのIDを各行に残す |
| 料金の質問に答えてしまう | 料金と仕上がり日には触れないと明記し、依頼でない文面は人へ回す |
上の3行が、この構成の失敗のほとんどです。 どれも「予定表の上ではそろって見える」という同じ形をしています。書かれていないことを空のまま印にできているかどうかで、当日の空振りが減るかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧客の氏名、住所、電話番号、メールアドレス、不在時の置き場所、そしてどの日のどの時間帯に家にいるか(いないか)です。
- AIに渡す範囲を、項目の取り出しに要るところまでに限る … フォームの経路では、欄で分かれている氏名・電話をAIに渡さず、品目と備考だけを渡します。メールの経路でも、顧客台帳から渡すのは住所の照合に要る項目だけにし、台帳そのものを渡しません
- 不在時の置き場所と在宅の時間帯を扱いに注意する … 「玄関前の箱に置いて」「平日の昼は不在」は、外に出れば防犯上の情報です。予定表とログを見られる人を、受付とドライバーに限ります
- 顧客への連絡を自動で送らない … 聞き直しの連絡も、時間帯の変更の連絡も人が行います。本格構成で下書きを作る場合も、送信は人が行います
- API キーを共有しない … スクリプトのプロパティに置き、スクリプトの編集者を絞ります。インストール型トリガーは作成した人のアカウントで動くため、共用アカウントの管理者を決めておきます
- ログの保存期間を決める … 依頼の文面の全文には、住所と電話と在宅の時間帯が入っています。照合と振り返りに要る期間が過ぎたら消します
誤りが起きた場合のリスクは、違う日や時間帯に行って空振りすることと、古い住所に行くことの2つです。 前者は書かれていない時間帯を埋めると起き、後者は台帳の住所で文面を書き換えると起きます。どちらも「書かれていないことを書かれていないまま返す」という同じ区別から出ているので、そこだけは設計で守ります。
10まず何から始めるか
1週目:地域表を作る
店長の土地勘から、町名と地域の対応表を作ります。最初からすべての町名を埋める必要はありません。依頼の多い上位の町名から埋めます。 あわせて、顧客台帳に駐車・訪問の注意事項の列を足し、常連の事業者の分から書きます。
2週目:30件で試す
先週の依頼から30件を選び、手元のAIサービスに貼り付けて項目の表を作らせます。当時の予定表と突き合わせ、書かれていない時間帯や点数を埋めていないかを最優先で見ます。
3週目:メールとフォームから予定表までをつなぐ
Apps Script で、フォーム送信のトリガーと10分ごとのメールの取り込みを作り、Claude API で項目を取り出して予定表に書くところまで作ります。この時点では回り順の案を作らず、印の付き方だけを見ます。
4週目:回り順の案を足す
前日16時のトリガーで、時間帯と地域ごとに回り順の案を出します。店長が案をどう直したかを記録し、2週間分を見返します。
2か月目: 回り順を入れ替えた理由を台帳の注意事項に書き足し、「確認」の印が多い町名を地域表に足します。3か月目以降: 1件4分が何分になったかを実測し、印の割合が2割前後に落ち着いたら、聞き直しの連絡の下書きへ進むかを決めます。店長が休む日にも、ドライバーが案を直すだけで出発できるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| インストール型トリガーに時間主導型、フォーム送信(Googleフォーム用とスプレッドシート用)、カレンダーのイベントなどがあり、Gmail の受信のトリガーが一覧に無いこと。時間主導型の実行時刻がずれることがあり(9時の設定が9〜10時のどこかで、日ごとに一定)、インストール型トリガーは作成した人のアカウントで動くこと | Google for Developers: Installable Triggers | 2026-10-14 |
GmailApp の search がスレッド全体が大きすぎると失敗し、ページ指定の版を使うよう案内されていること。ラベルの取得・作成のメソッドがあること | Google for Developers: Class GmailApp | 2026-10-14 |
DirectionFinder の addWaypoint、setOptimizeWaypoints(既定は false)、getDirections の働きと、戻り値の経路・区間(legs)・始点と終点の位置。立ち寄り先の数の上限が記載されていないこと | Google for Developers: Class DirectionFinder | 2026-10-14 |
Geocoder の geocode が住所からおおよその地点を返し、results・formatted_address・geometry.location を持つこと。setRegion・setLanguage があること | Google for Developers: Class Geocoder | 2026-10-14 |
| Google Map の経路検索が個人1日1,000回・Workspace 1日10,000回、URL Fetch が個人1日20,000回、トリガーの合計の実行時間が個人1日90分・Workspace 6時間、1回の実行が6分までであること | Google for Developers: Quotas for Google Services | 2026-10-14 |
構造化出力を output_config.format(type: "json_schema")で指定すること。additionalProperties は false が必要で、数の範囲や文字列の長さの制約は使えないこと。max_tokens で切れた出力はスキーマに沿わないことがあること | Claude Platform Docs: Structured outputs | 2026-10-14 |
依頼を受けるかどうか、顧客との時間の約束をどう決めるかは、店の判断で決めてください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1478)についてのご相談はこちらから。
