Media > AI活用ユースケース > カスタマーサポート > クリーニング店に届く集配の依頼をメールとフォームから読み取り、集配の予定表に並べて、地域ごとの回り順の案を作る

クリーニング店に届く集配の依頼をメールとフォームから読み取り、集配の予定表に並べて、地域ごとの回り順の案を作る

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

メールとWebフォームで届く集配の依頼から、氏名・住所・希望日・時間帯・品目と点数を取り出して、集配の予定表に並べます。そのうえで、日と時間帯と地域ごとに回り順の案を作り、受付の担当が確かめてからドライバーに渡します。

サマリー
生成AI
ChatGPT/Claude/Gemini
連携・自動化
Google Apps Script/Python
対象業界
その他/小売
対象部門
カスタマーサポート/物流
対象業務
データ入力・転記/台帳・マスタ管理
主な課題
入力作業が多い/属人化している/期限・対応漏れが起きる
AIで行う処理
抽出
主な効果
入力漏れ削減/属人化解消/工数削減
導入難易度
★☆☆☆☆
実装レベル
半自動化
費用感
API連携(中)
人間の確認
条件付き
現在工数
60h/月
AI導入後
15h/月
想定削減
75%
年間削減
540h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 受付の担当が朝と昼にメールとフォームの回答を開き、新しい依頼を探す
  2. 1件ずつ読み、氏名・住所・電話・希望日・時間帯・品目と点数・注意事項を集配の予定表に書き写す
  3. 顧客台帳を開き、既存の顧客かを確かめる。住所が台帳と違えば、どちらが正しいかを考える
  4. 日時や点数が書かれていない依頼は、電話かメールで聞き直す
  5. 前日の夕方、店長が翌日の依頼を時間帯ごとに分け、地図を見ながら車ごとの回り順を決める
  6. 回り順を印刷してドライバーに渡す
導入後(After)
  1. 自動フォームの回答が届くたびに、スクリプトが依頼の取り込みを始める
  2. 自動10分ごとに、受付のメールのうち「集配依頼」のラベルが付いた未処理のものを読む
  3. 自動引用された過去のメールと署名を落とし、顧客台帳からメールアドレスと電話番号で顧客を引く
  4. 自動Claude API が、氏名・住所・希望日・時間帯・品目と点数・注意事項を決まった形のJSONで返す
  5. 自動スクリプトが地域表で地域を割り当て、住所を地図で引いて1か所に決まるかを確かめる
  6. 自動予定表に1行を書き、欠けている項目には「聞き直し」、地図で決まらない住所には「確認」の印を付ける
  7. 人受付の担当が印の付いた行だけを開き、顧客に聞き直すか台帳で確かめる
  8. 自動前日の16時に、翌日の依頼を時間帯と地域ごとにまとめ、地図のサービスで回り順の案を作る
  9. 人店長かドライバーが案を見て、顧客ごとの事情を足して順番を直し、確定する
各工程の詳しい説明を読む
  1. 受付の担当が朝と昼にメールとフォームの回答を開き、新しい依頼を探す
  2. 1件ずつ読み、氏名・住所・電話・希望日・時間帯・品目と点数・注意事項を集配の予定表に書き写す
  3. 顧客台帳を開き、既存の顧客かを確かめる。住所が台帳と違えば、どちらが正しいかを考える
  4. 日時や点数が書かれていない依頼は、電話かメールで聞き直す
  5. 前日の夕方、店長が翌日の依頼を時間帯ごとに分け、地図を見ながら車ごとの回り順を決める
  6. 回り順を印刷してドライバーに渡す

(a)書き写す作業が件数のぶんだけある。 1件で7〜8項目を予定表に写すので、メールを読む時間と合わせて1件2分ほどかかります。依頼の多い月曜と衣替えの時期は、受付の担当が昼までこの作業から離れられません。

(b)書き漏れが当日に分かる。 「火曜に取りに来て」とだけ書かれ、時間帯が無い依頼を見落とすと、ドライバーが夜間に行って留守だった、ということが起きます。品目の点数が無いまま行くと、車に積む場所が足りるかが分かりません。 聞き直しが必要な依頼を、読んだその場で見分けられていないのが原因です。

(c)回り順が店長の頭の中にある。 地域の土地勘と、顧客ごとの事情(駐車できる場所、管理人のいる時間)を知っているのは店長とベテランのドライバーだけです。店長が休む前日は、ドライバーが自分で組み直し、回り切れない依頼が出ます。

(d)同じ顧客の依頼が二重に入る。 常連の事業者がメールのあとで電話もかけてくると、両方が予定表に載ることがあります。

  1. 【自動】 フォームの回答が届くたびに、スクリプトが依頼の取り込みを始める
  2. 【自動】 10分ごとに、受付のメールのうち「集配依頼」のラベルが付いた未処理のものを読む
  3. 【自動】 引用された過去のメールと署名を落とし、顧客台帳からメールアドレスと電話番号で顧客を引く
  4. 【自動】 Claude API が、氏名・住所・希望日・時間帯・品目と点数・注意事項を決まった形のJSONで返す
  5. 【自動】 スクリプトが地域表で地域を割り当て、住所を地図で引いて1か所に決まるかを確かめる
  6. 【自動】 予定表に1行を書き、欠けている項目には「聞き直し」、地図で決まらない住所には「確認」の印を付ける
  7. 【人】 受付の担当が印の付いた行だけを開き、顧客に聞き直すか台帳で確かめる
  8. 【自動】 前日の16時に、翌日の依頼を時間帯と地域ごとにまとめ、地図のサービスで回り順の案を作る
  9. 【人】 店長かドライバーが案を見て、顧客ごとの事情を足して順番を直し、確定する

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 ScriptPython
生成AIClaude 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どうやって実装するのか

Step1

処理の起点を決める

入口ごとにトリガーを分けます。 フォームは回答のたびに動くフォーム送信のトリガー、メールは10分ごとの時間主導型のトリガーです。電話で受けた依頼は受付の担当がフォームに打ち込むので、電話の依頼もフォームの経路に乗ります。

メールの拾い方は、Gmail の検索の文字列で決めます。受付のアドレスで、集配の依頼らしいメール(件名や送信元の常連の事業者)に「集配依頼」のラベルを自動で付けるフィルタを Gmail 側に置き、スクリプトは label:集配依頼 -label:集配_取込済 で探します。処理が終わったスレッドには「集配_取込済」のラベルを付けます。 付けるのは予定表への書き込みが成功したときだけにし、ラベルの付いていないものが、そのまま未処理の数になります。

GmailApp の search は、スレッド全体が大きすぎると失敗するとされ、ページ指定の版(search(query, start, max))が案内されています。ページ指定の版で、1回に読む件数の上限を決めておきます。

前日16時のトリガーは、回り順の案だけを作ります。 依頼の取り込みとは別の処理にしておくと、取り込みで止まった1件が回り順の案まで止めることがありません。

Step2

入力データを集める

データ中身取得元
フォームの回答氏名、住所、電話、メールアドレス、希望日、時間帯、品目(自由記入)、備考フォーム送信のトリガーのイベント
依頼のメール本文、件名、送信元、受信日時、スレッドのIDGmail(「集配依頼」のラベル)
顧客台帳顧客コード、氏名・屋号、住所、電話、メールアドレス、駐車・訪問の注意事項スプレッドシート
地域表町名・郵便番号と地域の対応、地域ごとの担当の車スプレッドシート(店長が作る)
予定の枠日付、時間帯、車ごとの受けられる件数の目安、休業日スプレッドシート

質を決めるのは、顧客台帳と地域表です。 台帳に駐車や訪問の注意事項が無いと、回り順の案を直すときに店長の記憶に頼ることになります。地域表が無いと、地域を決めるのにまたAIや地図を使うことになり、判断の筋道が毎回変わります。 地域は表で機械的に決めるのが、この構成の決まりです。

予定の枠を表で持つのは、受けすぎを見るためです。 時間帯ごとの件数が目安を超えたら、予定表のその枠に色を付けます。受けるかどうかを決めるのは人ですが、超えていることに気づくのは機械にさせます。

Step3

データの取得方法を決める

取るものどこから何に使うか
フォームの各欄フォーム送信のイベントが持つ回答欄で分かれている項目はそのまま使う。品目と備考だけをAIへ
メールの本文と受信日時GmailApp で検索したスレッドの最新のメッセージ本文をAIへ。受信日時は「来週」などの基準日
顧客の情報顧客台帳をメールアドレス→電話番号の順で引く既存の顧客か、住所が台帳と同じか
地域地域表を町名→郵便番号の順で引く予定表の地域の列
住所の位置Maps サービスの Geocoder の geocode1か所に決まるか。回り順の案の立ち寄り先

フォームの経路では、欄で分かれている項目をAIに渡しません。 氏名や電話は欄のまま正しいので、AIに通すと書き換わる余地が増えるだけです。AIに渡すのは、自由記入の品目と備考だけにします。メールの経路は本文に全部が書かれているので、本文全体を渡します。

顧客台帳の照合は、メールアドレスが先、電話番号が後、氏名は使いません。 同姓の顧客や、店名と代表者名が混ざる事業者があるからです。どちらでも引けなければ「新規」として扱い、新規の顧客は必ず受付の担当が確かめる行にします。

Geocoder の geocode は住所からおおよその地点を返し、results の各結果に formatted_address と緯度・経度が入ります。setRegion と setLanguage で日本と日本語に設定し、結果が1件でなければ「確認」の印にします。

Step4

AIへ渡す前に整形する

  1. 引用と署名の除去 … メールの本文から「>」で始まる行と、「-- 」以下の署名を落とします。過去のやり取りの日付や品目を、今回の依頼として読ませないためです
  2. 文字の正規化 … 全角の数字・英字を半角に、丁目・番地の「-」「ー」「の」の表記をそろえます
  3. 基準日の付与 … 受信日時(フォームは送信日時)と、そこから14日分の日付と曜日の一覧を作り、AIに一緒に渡します
  4. 顧客の引き当て … 台帳で引けた顧客は、顧客コードと台帳の住所を一緒に渡します
  5. 重複の検知 … 同じ顧客で、同じ希望日の依頼が予定表にすでにあれば「重複の疑い」の印を付けます

3番目を軽く見ないでください。 「来週の火曜」「明後日」は、いつ送られたかで日付が変わります。基準日と曜日の一覧を渡さないと、AIは今日の日付を知らないまま日付を作ります。 一覧の範囲外の日付は、選べないようにします。

Step5

AIに処理させる

させるのは、依頼の文面を決まった項目に分けることと、書かれていない項目を「書かれていない」と返すことだけです。

取り出すもの取り出し方書かれていないときの扱い
依頼の種類集荷/お届け/両方判断できなければ unknown
氏名・屋号文面にある表記のまま無ければ空。台帳の値で埋めない
住所文面にある表記のまま。台帳の住所と違えば address_differs無ければ空
希望日基準日の一覧から選び、根拠の文字列を写す無ければ空。「来週のどこか」は ambiguous
時間帯午前/午後/夜間「夕方」など枠に当てはまらなければ ambiguous
品目と点数品目ごとに点数。点数が無ければ空「冬物いろいろ」は品目だけを写し点数は空
注意事項しみ抜き、急ぎ、不在時の置き場所など無ければ空

右端の列が、この構成でいちばん大事な区別です。 空と ambiguous は、どちらも受付の担当が顧客に聞き直すものですが、空は「書いてもらう」、ambiguous は「どちらかを選んでもらう」で、聞き方が違います。分けて返させると、聞き直しの文面がそのまま決まります。

させないこと理由
地域の割り当て地域表で機械的に決める。AIに決めさせると日によって変わる
回り順の決定地図のサービスで案を出し、人が確定する
住所の補完・修正番地を足す、台帳の住所に置き換える、をしない
依頼を受けるかの判断枠の空き、天候、ドライバーの都合は人が決める
料金や仕上がり日の回答店頭の受付システムと料金表の仕事。文面に答えない

3行目がいちばん起きやすい失敗です。 台帳の住所と文面の住所が少し違うと、AIは台帳の住所に寄せて書きたがります。引っ越した顧客の新しい住所が、その瞬間に古い住所で上書きされます。 違っていれば違っていると返させ、どちらが正しいかは人が顧客に確かめます。

Step6

指示内容を固定する

あなたはクリーニング店の受付で、集配の依頼の文面を予定表の項目に分ける担当です。
渡された文面に書かれていることだけを取り出してください。推測で埋めないでください。

【取り出す項目】
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点」を作られると、予定表の上では点数がそろって見え、聞き直すべき依頼が聞き直されなくなります。

Step7

出力形式を固定する

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 を見て、切れていれば人に回します。

Step8

システムへ連携する

つなぎ先方式内容
Googleフォームフォーム送信のトリガー回答を受け取る
GmailGmailApp(検索とラベル)依頼のメールを読み、処理済みのラベルを付ける
Claude APIUrlFetchApp で 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 キーはスクリプトのプロパティに置き、コードに書きません。

Step9

人が確認する

人が開くのは、印の付いた行だけです。 印の付いていない行は、一覧で件数と時間帯の偏りを流し見ます。

  1. 「聞き直し」を先に片づける … missing は書いてもらう、ambiguous は選んでもらう。前日の15時までに顧客へ連絡し、16時の回り順の案に間に合わせます
  2. 「確認」を見る … 住所が地図で1か所に決まらない、台帳の住所と違う、新規の顧客。台帳を直すのは、顧客に確かめてからです
  3. 「重複の疑い」を見る … メールと電話の両方で届いた依頼か、本当に2回の依頼かを確かめます
  4. 回り順の案を確定する … 店長かドライバーが、時間の約束と駐車の事情を足して順番を直します

4番目を省かないでください。 地図の上で最短の順番は、開店前に回るはずの美容室を11時に置くことがあります。案のまま渡すと、約束の時間を守れない1件が出ます。

目標は、900件をならして1件1分です。 印が2割を大きく超える月は、フォームの欄か地域表を疑います。

Step10

例外に対処する

起きること対応
集配の依頼でないメールis_request が false。ラベルを「受付_要確認」に替えて人に回す
1通に複数の依頼requests の数だけ行を書く。行に同じスレッドのIDを残す
希望日が一覧の範囲外日付を書かず「聞き直し」の印
住所が地図で決まらないGeocoder の結果が1件でなければ「確認」の印。回り順の案から外す
地域表に無い町名地域を空にし「確認」の印。地域表を足すのは店長
時間帯の枠の件数が目安を超える予定表の枠に色を付ける。受けるかは人が決める
出力が途中で切れたstop_reason が max_tokens なら書き込まずに人へ
Claude API が応答しない処理済みのラベルを付けない。次の10分で拾い直す
経路が取れないその時間帯は回り順の案を空にし、店長に知らせる

上から4行目までが大半を占めます。 どれもAIの読み違いではなく、依頼の書き方と、地域表・台帳の整い方の問題です。

Step11

記録を残す

  • 元の文面(メールのスレッドのID、フォームの回答の行)と受信日時
  • AIに渡した基準日と、顧客台帳の引き当ての結果
  • Claude API が返したJSONの全文と stop_reason
  • 予定表に書いた行と、付けた印
  • 人が直した記録 … どの項目を、何から何に変えたか。回り順をどう入れ替えたか
  • 時間帯・地域ごとの件数と、回り順の案から外した依頼の数

5つ目の「回り順をどう入れ替えたか」が、地域表と台帳を育てる材料になります。 同じ顧客をいつも先頭に動かしているなら、それは台帳の注意事項に書くべき事情です。店長の頭の中にあった段取りが、記録として表に移っていきます。

ログは予定表とは別のシートに置き、文面の全文は保存期間を決めて消します。

04実装レベルの3段階

最小構成:文面を手でAIの画面に貼り、項目の表を作らせる / 1件ごとの項目の取り出し
半自動化:上記+スクリプトがメールとフォームを拾い、予定表に書き、印を付け、前日に回り順の案を作る / 取り込み・転記・印付け・回り順の案
本格構成:上記+聞き直しのメールの下書き、店頭の受付システムとの品目の照合、ドライバーの端末への配信 / 受付から当日の配信まで

最小構成では件数がさばけません。 1件ずつ貼るので、月900件には使えません。確かめるための段階です。 半自動化で、1件4分が1分になり、この段階が本記事の想定です。 書き写しと台帳の照合と地域の割り当てが無くなり、回り順は案を直す作業になります。本格構成に進むと、聞き直しの連絡と当日の配信の手間が減りますが、店頭の受付システムとつなぐ作業は店ごとの事情が大きく、第10章の数値には入れていません。 段階を飛ばさないでください。 半自動化を1か月回すと、「確認」の印が多い町名と、回り順をいつも入れ替えている顧客が見えてきます。そこを直してから本格構成に進みます。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
3 名
月間件数
900 件
1件あたり現在時間
4 分
1件あたり導入後時間
1 分
現在  900件 × 4分 ÷ 60 = 60 時間/月
導入後 900件 × 1分 ÷ 60 = 15 時間/月
月間削減時間
45h
削減率
75%
年間削減時間
540h
年間金額換算(時間単価1,800円)
97万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 店舗を持ちながら、個人宅や美容室・飲食店などへの集荷とお届けを行っているクリーニング店。依頼がメールとWebフォームに分かれて届き、受付の担当が1件ずつ読んで集配の予定表に書き写している場合。回り順を毎朝ベテランのドライバーか店長が頭の中で組んでいて、その人が休む日に段取りが崩れる場合。Google Workspace か Gmail で受付のメールを受けており、予定表をスプレッドシートで持てる場合。
向いていない
  1. 集配の依頼が月に数十件で、受付の担当が読みながら予定表に書けば足りる店。依頼の受付をすでに予約システムに一本化していて、項目が入力欄で分かれて届いている場合。配送のルートを専用の配車システムで組んでいる場合。なお、依頼を受けるか断るか、時間帯の約束を変えるかの判断と、顧客への連絡は人が行うもので、この構成では代替できません。

07最小構成で試す方法

  1. 先週届いた依頼のメールとフォームの回答から30件を選ぶ(時間帯の書かれていないもの、1通に2つの依頼があるものを必ず入れる)
  2. その30件を、受付の担当が当時どう予定表に書いたかを並べておく
  3. 手元のAIサービスの画面に、1件ずつ文面を貼り付ける
  4. 「この文面から、依頼の種類・氏名・住所・希望日・時間帯・品目と点数・注意事項を表にしてください。書かれていない項目は空にし、推測で埋めないでください。今日は○月○日(○曜日)です」と指示する
  5. 出てきた表を、当時の予定表の行と突き合わせる

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ガバナンス上の注意点

この構成で扱うデータ: 顧客の氏名、住所、電話番号、メールアドレス、不在時の置き場所、そしてどの日のどの時間帯に家にいるか(いないか)です。

  1. AIに渡す範囲を、項目の取り出しに要るところまでに限る … フォームの経路では、欄で分かれている氏名・電話をAIに渡さず、品目と備考だけを渡します。メールの経路でも、顧客台帳から渡すのは住所の照合に要る項目だけにし、台帳そのものを渡しません
  2. 不在時の置き場所と在宅の時間帯を扱いに注意する … 「玄関前の箱に置いて」「平日の昼は不在」は、外に出れば防犯上の情報です。予定表とログを見られる人を、受付とドライバーに限ります
  3. 顧客への連絡を自動で送らない … 聞き直しの連絡も、時間帯の変更の連絡も人が行います。本格構成で下書きを作る場合も、送信は人が行います
  4. API キーを共有しない … スクリプトのプロパティに置き、スクリプトの編集者を絞ります。インストール型トリガーは作成した人のアカウントで動くため、共用アカウントの管理者を決めておきます
  5. ログの保存期間を決める … 依頼の文面の全文には、住所と電話と在宅の時間帯が入っています。照合と振り返りに要る期間が過ぎたら消します

誤りが起きた場合のリスクは、違う日や時間帯に行って空振りすることと、古い住所に行くことの2つです。 前者は書かれていない時間帯を埋めると起き、後者は台帳の住所で文面を書き換えると起きます。どちらも「書かれていないことを書かれていないまま返す」という同じ区別から出ているので、そこだけは設計で守ります。

10まず何から始めるか

1週目:地域表を作る

店長の土地勘から、町名と地域の対応表を作ります。最初からすべての町名を埋める必要はありません。依頼の多い上位の町名から埋めます。 あわせて、顧客台帳に駐車・訪問の注意事項の列を足し、常連の事業者の分から書きます。

2週目:30件で試す

先週の依頼から30件を選び、手元のAIサービスに貼り付けて項目の表を作らせます。当時の予定表と突き合わせ、書かれていない時間帯や点数を埋めていないかを最優先で見ます。

3週目:メールとフォームから予定表までをつなぐ

Apps Script で、フォーム送信のトリガーと10分ごとのメールの取り込みを作り、Claude API で項目を取り出して予定表に書くところまで作ります。この時点では回り順の案を作らず、印の付き方だけを見ます。

4週目:回り順の案を足す

前日16時のトリガーで、時間帯と地域ごとに回り順の案を出します。店長が案をどう直したかを記録し、2週間分を見返します。

2か月目: 回り順を入れ替えた理由を台帳の注意事項に書き足し、「確認」の印が多い町名を地域表に足します。3か月目以降: 1件4分が何分になったかを実測し、印の割合が2割前後に落ち着いたら、聞き直しの連絡の下書きへ進むかを決めます。店長が休む日にも、ドライバーが案を直すだけで出発できるようになった時点で、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-14/最終更新:2026-10-14
確認した内容情報源確認日
インストール型トリガーに時間主導型、フォーム送信(Googleフォーム用とスプレッドシート用)、カレンダーのイベントなどがあり、Gmail の受信のトリガーが一覧に無いこと。時間主導型の実行時刻がずれることがあり(9時の設定が9〜10時のどこかで、日ごとに一定)、インストール型トリガーは作成した人のアカウントで動くことGoogle for Developers: Installable Triggers2026-10-14
GmailApp の search がスレッド全体が大きすぎると失敗し、ページ指定の版を使うよう案内されていること。ラベルの取得・作成のメソッドがあることGoogle for Developers: Class GmailApp2026-10-14
DirectionFinder の addWaypoint、setOptimizeWaypoints(既定は false)、getDirections の働きと、戻り値の経路・区間(legs)・始点と終点の位置。立ち寄り先の数の上限が記載されていないことGoogle for Developers: Class DirectionFinder2026-10-14
Geocoder の geocode が住所からおおよその地点を返し、results・formatted_address・geometry.location を持つこと。setRegion・setLanguage があることGoogle for Developers: Class Geocoder2026-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 Services2026-10-14
構造化出力を output_config.format(type: "json_schema")で指定すること。additionalProperties は false が必要で、数の範囲や文字列の長さの制約は使えないこと。max_tokens で切れた出力はスキーマに沿わないことがあることClaude Platform Docs: Structured outputs2026-10-14

依頼を受けるかどうか、顧客との時間の約束をどう決めるかは、店の判断で決めてください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-1478)についてのご相談はこちらから。

AI活用について相談する
目次