旅行会社が法人・団体旅行の行程表を、顧客の要望と訪問先・移動時間から下書きし、無理のある移動と営業時間の食い違いを指摘する
法人・団体の顧客から受けた旅行の要望をもとに、社内の訪問先の台帳から行程表の下書きを作ります。 そのうえで、地図のAPIで求めた移動時間と施設の営業時間に照らし、間に合わない移動や閉まっている時間の訪問を指摘します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Power Automate/Python
- 対象業界
- その他/宿泊/自治体
- 対象部門
- 営業
- 対象業務
- 内容確認・チェック/書類作成
- 主な課題
- 属人化している/書類作成に時間がかかる/確認ミスが多い
- AIで行う処理
- 生成
- 主な効果
- 品質標準化/属人化解消/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 営業担当が顧客の要望を聞き取り、案件の管理表に日程・人数・出発地・行きたい場所・予算の目安を書く
- 過去に似た旅行を組んだ行程表を共有フォルダから探し、使えそうなものを開く
- 行きたい場所を地図のサイトで1か所ずつ調べ、順番を考え、区間ごとの移動時間を見る
- 施設のサイトで営業時間・定休日・団体の受入れを確かめる。分からないものは電話で聞く
- 昼食の場所を、団体の入れる店から時間に合うものを選ぶ
- ひな形のスプレッドシートに時刻を入れ、行程表の形に整える
- 新人の行程はベテランが見直し、直してから顧客に出す
- 人営業担当が依頼シートに要望を書き、メニューから「下書きを作る」を押す
- 自動要望と訪問先の台帳から、台帳にある施設だけを使った行程の案をAIが作る
- 自動行程の区間ごとに Routes API で移動時間を求め、Places API で施設の営業時間を取る
- 自動バスの乗降と休憩の時間を足し、到着・出発の時刻を規則で計算する
- 自動営業時間外の訪問、昼食の時間帯の外れ、連続運転の目安の超過を規則で拾う
- 自動拾った食い違いを、直し方の案とあわせてAIが文章にする
- 自動行程表のひな形に時刻と指摘を書き込み、下書きとして保存する
- 人営業担当が指摘を読み、順番や滞在時間を直して、もう一度点検を走らせる
- 人「台帳外」と「要確認」の施設に電話で団体の受入れを確かめる
- 人行程表をバス会社に見せて運行の可否を聞き、顧客に出す
各工程の詳しい説明を読む
- 営業担当が顧客の要望を聞き取り、案件の管理表に日程・人数・出発地・行きたい場所・予算の目安を書く
- 過去に似た旅行を組んだ行程表を共有フォルダから探し、使えそうなものを開く
- 行きたい場所を地図のサイトで1か所ずつ調べ、順番を考え、区間ごとの移動時間を見る
- 施設のサイトで営業時間・定休日・団体の受入れを確かめる。分からないものは電話で聞く
- 昼食の場所を、団体の入れる店から時間に合うものを選ぶ
- ひな形のスプレッドシートに時刻を入れ、行程表の形に整える
- 新人の行程はベテランが見直し、直してから顧客に出す
(a)移動時間の見積が人によって違う。 地図のサイトの所要時間は乗用車の目安で、大型バスの乗り降り、トイレ休憩、駐車場から入口までの歩きは入っていません。 ベテランは経験で足しますが、新人は地図の数字をそのまま使い、現地で毎回30分ずつ遅れる行程になります。
(b)営業時間は「季節」と「曜日」で変わる。 冬の閉館が早い施設、月曜が休みで祝日なら翌日が休みの施設、団体の受付が閉館の1時間前で締まる施設があります。施設のサイトを開いて確かめるのは手間で、忙しい週ほど省かれます。
(c)運転の目安が行程に反映されていない。 バス運転者には連続運転時間の基準があり、高速道路の区間はおおむね2時間までとするよう努めることとされています。運行計画を立てるのはバス会社ですが、行程表がそれを無視していると、バス会社から組み直しを求められます。 2泊3日の旅行で1日目に長距離を詰め込むと、たいていここで止まります。
(d)ベテランの見直しが追いつかない。 繁忙期にはベテラン自身の行程も止まり、見直しを飛ばした案が顧客に出ます。
- 【人】 営業担当が依頼シートに要望を書き、メニューから「下書きを作る」を押す
- 【自動】 要望と訪問先の台帳から、台帳にある施設だけを使った行程の案をAIが作る
- 【自動】 行程の区間ごとに Routes API で移動時間を求め、Places API で施設の営業時間を取る
- 【自動】 バスの乗降と休憩の時間を足し、到着・出発の時刻を規則で計算する
- 【自動】 営業時間外の訪問、昼食の時間帯の外れ、連続運転の目安の超過を規則で拾う
- 【自動】 拾った食い違いを、直し方の案とあわせてAIが文章にする
- 【自動】 行程表のひな形に時刻と指摘を書き込み、下書きとして保存する
- 【人】 営業担当が指摘を読み、順番や滞在時間を直して、もう一度点検を走らせる
- 【人】 「台帳外」と「要確認」の施設に電話で団体の受入れを確かめる
- 【人】 行程表をバス会社に見せて運行の可否を聞き、顧客に出す
3番から5番が、この構成の中心です。 時刻はすべてAPIの数字と規則で決まり、AIが書いた時刻は使いません。 2番でAIが出すのは「どこを、どの順で、何分ずつ」という案だけで、時刻の列は空のまま受け取ります。
8番で人が直したら、もう一度3番から回します。 直した結果が別の食い違いを生むことがあるためです。
02今回想定するシステム構成
営業担当(依頼シートに要望を記入) ▼【トリガー】スプレッドシートのメニュー「下書きを作る」 Google Apps Script ├── 訪問先の台帳 ── 団体可否・バス駐車・滞在の目安・place_id ├──▶ Gemini API ── 行程の案(訪問先の順番・滞在分数) ▼ Google Apps Script ├──▶ Routes API(Compute Route Matrix)── 区間ごとの所要時間・距離 ├──▶ Places API(Place Details)── 営業時間・営業の状態 ▼ 規則での点検(時刻の計算・営業時間・昼食・連続運転の目安) ▼ Gemini API ── 食い違いの説明と直し方の案 ▼ 行程表の下書き(スプレッドシート) ▼ 【営業担当が直す → 施設に確認 → バス会社に確認 → 顧客へ】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Gemini API(行程の案の作成と、食い違いの説明文) | Claude API、OpenAI API |
| 連携 | Google Apps Script(依頼シートの読み取り、地図のAPIの呼び出し、規則での点検、行程表の作成) | Python、Power Automate |
| 連携 | Google Maps Platform(Routes API の Compute Route Matrix、Places API の Place Details) | 各社の経路の API |
| 保管 | Google スプレッドシート(依頼シート、訪問先の台帳、行程表のひな形) | 案件の管理システム |
移動時間は Routes API の Compute Route Matrix で求めます。 出発地の配列と目的地の配列を渡すと、それぞれの組み合わせの経路を計算し、要素ごとに originIndex、destinationIndex、duration、distanceMeters、condition を返します。返す項目は X-Goog-FieldMask で指定します。 要素の数(出発地×目的地)は TRANSIT 以外で625まで、TRAFFIC_AWARE_OPTIMAL を指定すると100までです。行程の区間は数個から十数個なので、上限には届きません。
営業時間は Places API の Place Details(New)で取ります。 項目は regularOpeningHours(通常の週の営業時間)と currentOpeningHours(今日を含む7日間の、特別な営業時間を反映したもの)で、フィールドマスクが必須です。 省くとエラーになります。営業時間の項目は Enterprise の SKU、businessStatus(閉業・移転などの営業の状態)は Pro の SKU に入ります。
Gemini API の Google マップによるグラウンディング(Grounding with Google Maps)は使いません。 地図の情報を回答の根拠にできる機能ですが、公式のページでは現時点で英語のプロンプトと回答だけに対応するとされています。また、回答の根拠となった出典を表示する決まりがあります。この構成では時刻を数字として規則で扱いたいので、地図のAPIを直接呼びます。
03どうやって実装するのか
処理の起点を決める
営業担当が依頼シートのメニューから「下書きを作る」を押したときに動かします。 要望の聞き取りは電話や訪問が中心で、書き終わる時点は営業担当にしか分かりません。フォームの送信やシートの編集で自動に動かすと、書きかけの要望で下書きが作られます。
「点検だけ」のメニューも別に用意します。 営業担当が順番や滞在時間を直した後は、行程の案を作り直さず、3番から5番の点検だけを走らせます。直した箇所を、AIが作り直して元に戻すのを防ぐためです。 点検は何度押してもよく、押すたびに行程表の指摘の欄が書き換わります。
旅行日まで7日を切った案件は、点検のときに currentOpeningHours も見ます。 7日より先の旅行では、特別な営業時間がまだ反映されていないので regularOpeningHours だけで見ます。どちらで見たかを行程表に書き、旅行の直前にもう一度点検を走らせる運用にします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 要望 | 日程、人数、出発地と解散地、行きたい場所、食事の希望、宿泊地、予算の目安、参加者の配慮事項(歩く距離・高齢者の割合など) | 依頼シート |
| 訪問先の台帳 | 施設名、place_id、団体の受入れの可否と上限人数、大型バスの駐車の可否、滞在の目安分数、予約の要否、団体の受付の締め、季節の注意 | 訪問先の台帳 |
| 移動時間 | 区間ごとの所要時間と距離 | Routes API |
| 営業時間 | 曜日ごとの営業時間、特別な日、営業の状態 | Places API |
| 自社の規則 | バスの乗降の分数、トイレ休憩の間隔、移動時間に掛ける係数、昼食の時間帯、連続運転の目安 | 規則のシート |
質を決めるのは、訪問先の台帳です。 特に「団体の受付の締め」と「季節の注意」の2列は、ベテランの頭の中にしか無かった情報です。「閉館16時30分、団体は16時まで」「12月〜2月は峠道を避ける」のように書いておくと、点検の規則に乗せられます。台帳は最初から全部をそろえる必要はなく、よく使う施設から埋めます。
参加者の名前や連絡先は渡しません。 行程を組むのに要るのは人数と配慮事項だけです。名簿は手配の段階で別に扱い、この構成には入れません。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 要望の行 | 依頼シートの選んだ行 | 行程の案の材料 |
| 台帳の施設 | 訪問先の台帳(宿泊地の周辺の地域で絞る) | AIが選べる候補 |
| 区間ごとの所要時間 | Compute Route Matrix(travelMode は DRIVE、routingPreference は TRAFFIC_AWARE) | 時刻の計算 |
| 営業時間 | Place Details の regularOpeningHours、currentOpeningHours、businessStatus | 営業時間外の訪問の検出 |
| 自社の規則 | 規則のシート | 係数と目安 |
AIに渡す台帳は、地域で絞ります。 宿泊地と行きたい場所から都道府県や地域を決め、その地域の施設だけを渡します。台帳を全部渡すと、AIは遠い施設を「似ているから」と入れることがあります。
Routes API の呼び出しは、AIが作った順番の区間だけを要素にします。 出発地の配列と目的地の配列を同じ並びにし、originIndex と destinationIndex が隣り合う組だけを使います。結果は順不同で返ることがあるので、添字で区間に当てはめます。 要素ごとにエラーが付くことがあり、condition が経路ありを示さない区間は「経路が見つからない」として人へ回します。
営業時間の periods は、曜日を数字(0が日曜)で持ちます。 旅行日の曜日を数字にして、その日の open と close を引きます。公式の説明では、期間の並びの始まりを日曜と決めつけないこととされているので、並び順ではなく day の値で引きます。
AIへ渡す前に整形する
- 要望の確かめ … 日程・人数・出発地・宿泊地が空でないか。空なら下書きを作らず、営業担当に戻します
- 台帳との照合 … 「行きたい場所」を台帳の施設名と照らし、見つからないものを「台帳外」に分けます
- 台帳の絞り込み … 宿泊地と行きたい場所の地域で施設を絞ります
- 人数での除外 … 団体の上限人数が参加人数より少ない施設、大型バスが停められない施設を候補から外します
- 配慮事項の付け足し … 「歩く距離を短く」なら、滞在の目安に歩きの多い印のある施設を後ろに回すよう指示に足します
- 曜日の準備 … 旅行の各日の曜日と、旅行日まで何日かを計算しておきます
2番の「台帳外」は、AIに渡しません。 顧客が名前を挙げた場所でも、台帳に無い施設は団体の受入れもバスの駐車も分かりません。AIに渡せば行程に入り、時刻まで付いた行程表が顧客に出ます。 台帳外の施設は、営業担当が確かめて台帳に足してから、もう一度下書きを作ります。
4番を前処理に置くのは、AIに判断させないためです。 「80名だから入れない」という判断は、台帳の数字で機械的に決まります。
AIに処理させる
AIを呼ぶのは2回です。1回目は行程の案、2回目は食い違いの説明です。
| 呼び出し | させること | させないこと |
|---|---|---|
| 1回目 | 台帳の候補から訪問先を選び、日ごとの順番と滞在分数、昼食と休憩の位置を決める | 時刻を書く、移動時間を見積もる、台帳に無い施設を足す |
| 2回目 | 規則が拾った食い違いを、営業担当が読める文章にし、直し方の案を2つまで書く | 食い違いを新しく見つける、規則の結果を打ち消す、時刻を計算し直す |
1回目で時刻を書かせない理由は、AIの時刻が「もっともらしい」からです。 「9:00出発、10:15到着」と書かれた行程は、地図で確かめていなくても正しそうに見えます。時刻の列を空のまま受け取り、APIの数字で埋めると決めておけば、根拠の無い時刻が行程表に残りません。
2回目で新しい食い違いを探させない理由も同じです。 AIが「この施設は冬は閉まっているかもしれません」と書くと、根拠のない指摘が規則の指摘と並びます。指摘の根拠は規則とAPIの数字だけにし、AIの役割は説明と案に限ります。
規則で拾う食い違いは次のとおりです。
| 種類 | 規則の例 |
|---|---|
| 営業時間外 | 到着が開館前、または出発が閉館後(団体の受付の締めがあれば、そちらで見る) |
| 定休日 | 旅行日の曜日に periods が無い |
| 昼食の外れ | 昼食の開始が自社の時間帯(例:11時〜13時30分)に入らない |
| 連続運転の目安 | 休憩を挟まない運転の合計が自社の目安を超える。高速道路の区間はおおむね2時間を目安にする |
| 1日の長さ | 出発から解散・宿着までが自社の目安を超える |
| 営業の状態 | businessStatus が閉業・移転を示す |
連続運転の目安は、厚生労働省のバス運転者の改善基準告示に沿って自社で決めます。 告示では連続運転時間は4時間を超えないものとされ、高速バスと貸切バスの高速道路の実車運行区間では、おおむね2時間までとするよう努めることとされています。ただし、運行計画が基準に合うかを決めるのはバス会社で、この点検は「バス会社に組み直しを求められそうな行程」を先に見つけるためのものです。
指示内容を固定する
1回目(行程の案)の指示です。
あなたは旅行会社の法人営業部で、団体旅行の行程の案を作る立場です。
渡した「候補の施設」だけを使って、日ごとの訪問の順番と滞在分数を決めてください。
【要望】{request}
【候補の施設】{candidates}
(各施設:facility_id、施設名、滞在の目安分数、団体の受付の締め、季節の注意、歩きの多さ)
【自社の決まり】昼食は1回、11時〜13時30分の間に入る位置に置く。
2時間に1回はトイレ休憩の位置を置く。
【厳守事項】
- 候補の施設に無い場所を行程に入れないでください。
要望にある場所が候補に無いときは、unlisted_requests に名前を書くだけにしてください。
- 時刻を書かないでください。移動時間を見積もらないでください。
時刻は別の仕組みで計算します。
- 滞在分数は、候補の施設の滞在の目安から前後30分の範囲で決めてください。
- 季節の注意に書かれていることに反する並べ方をしないでください。
- 参加者の配慮事項があるときは、どこにどう反映したかを note に書いてください。
- 営業時間や定休日を推測して書かないでください。
- 行程の良し悪しや、顧客への提案文は書かないでください。
2回目(食い違いの説明)の指示です。
あなたは、行程の点検結果を営業担当に伝える立場です。
渡した「点検の結果」は、地図のAPIの数字と自社の規則で決まったものです。
【行程】{itinerary_with_times}
【点検の結果】{violations}
【自社の規則】{rules}
【やること】
- 点検の結果の1件ごとに、何が起きているかを1〜2文で書いてください。
- 直し方の案を2つまで書いてください(順番の入れ替え、滞在の短縮、施設の差し替えなど)。
差し替えるときは、候補の施設の中から選んでください。
【厳守事項】
- 点検の結果に無い問題を新しく書かないでください。
- 点検の結果の時刻と分数を書き換えないでください。計算し直さないでください。
- 「たぶん大丈夫」など、点検の結果を打ち消す書き方をしないでください。
- 運転者の労働時間の基準に合うかどうかを判断しないでください。
「候補に無い場所は unlisted_requests に書くだけ」を明記しないと、AIは顧客が挙げた名所を行程に入れます。 要望を満たそうとするのは自然な振る舞いで、禁じるだけでなく、書き込む先を用意することで、要望を落とさずに台帳の外へ出せます。
2回目の「打ち消す書き方をしない」も効きます。 AIは食い違いを伝えるときに「多少の余裕があれば問題ない場合もあります」と和らげがちで、読んだ営業担当が直さずに出してしまいます。
出力形式を固定する
1回目は、次の形のJSONで受け取ります。
{
"trip_id": "T2026-118",
"days": [
{ "day": 1,
"stops": [
{ "seq": 1, "facility_id": "F-0412", "kind": "visit | lunch | rest | hotel",
"stay_min": 60, "note": "" }
] }
],
"unlisted_requests": ["顧客が挙げたが候補に無い場所"],
"assumptions": ""
}
時刻の欄が無いのは意図してのことです。 時刻は Apps Script が duration と規則から埋め、次の形で行程表に書きます。
| 日 | 順 | 施設 | 到着 | 出発 | 移動(API) | 移動(係数後) | 指摘 |
|---|---|---|---|---|---|---|---|
| 1 | 2 | 〇〇美術館 | 10:40 | 11:40 | 52分 | 68分 | 団体受付の締め 16:00 は問題なし |
| 1 | 3 | 昼食(〇〇亭) | 12:35 | 13:35 | 40分 | 55分 | 開始 12:35 は時間帯内 |
「移動(API)」と「移動(係数後)」を並べるのが、(a)への答えです。 APIの所要時間に自社の係数と乗降の分数を足した値で時刻を組み、両方を見せることで、営業担当が係数の妥当さを現地の経験と照らせます。
構造化出力は、Gemini API の /v1beta/interactions に送るリクエストの response_format で指定します。 mime_type に application/json を入れ、schema にJSONスキーマを書きます。kind は enum、facility_id と stay_min は required にします。公式のページは、スキーマに合ったJSONでも値が誤っていることがあるので、アプリケーションの側で値を確かめるよう案内しています。 Apps Script で、facility_id が渡した候補にあるか、stay_min が目安の範囲か、昼食が1回だけかを確かめ、外れていれば作り直しを1回だけ行い、それでも外れれば営業担当に回します。
2回目は、指摘ごとに violation_id、explanation、options(2件まで)を返させ、行程表の「指摘」の欄に書き込みます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 依頼シート・訪問先の台帳・規則のシート | Apps Script のスプレッドシートの読み取り | 要望、候補の施設、規則を読む |
| Gemini API | Apps Script からの HTTP 呼び出し | 行程の案と、食い違いの説明 |
| Routes API | Compute Route Matrix(X-Goog-FieldMask で originIndex,destinationIndex,duration,distanceMeters,condition を指定) | 区間ごとの所要時間 |
| Places API | Place Details(フィールドマスクで営業時間と営業の状態を指定) | 施設ごとの営業時間 |
| 行程表の下書き | ひな形のシートを複製して書き込み | 時刻・移動・指摘の列 |
APIキーは、Apps Script のスクリプトのプロパティに置き、コードに書きません。 地図のAPIのキーは、使うAPIを Routes API と Places API に絞る制限をかけておきます。
行程表は下書きとして新しいシートに作り、顧客には直接送りません。 顧客に出すのは営業担当が直し、施設とバス会社に確かめた後の版です。案件の管理表にも、この構成からは書き込みません。
人が確認する
すべての下書きを、営業担当が直してから使います。 そのうえで、見る順番を決めておきます。
- 「台帳外」を最初に見る … 顧客の希望なので、落とせば提案に響きます。施設に電話して受入れとバスの駐車を確かめ、台帳に足します
- 営業時間外・定休日の指摘を直す … 直し方の案から選ぶか、自分で並べ替え、「点検だけ」を押し直します
- 連続運転と1日の長さの指摘を見る … 直せないときは、バス会社に先に相談します
- 「要確認」の施設に電話する … 予約の要る施設、団体の受付の締めが台帳に無い施設です
- ベテランは、指摘が残ったまま出そうとしている行程だけを見る … 全件の見直しはしません
5番が(d)への答えです。 点検の結果が空になった行程は、営業時間と移動の数字の上では食い違いがありません。ベテランが見るのは、指摘が残っているのに出す理由がある行程だけになります。 その理由は行程表の備考に書いてもらいます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 要望の必須の項目が空 | 下書きを作らず、空の項目を営業担当に示す |
| 台帳の候補が少なすぎる | 行程を作らず「候補不足」として、その地域の台帳を埋めるよう知らせる |
| AIの案に候補外の施設がある | 作り直しを1回。再び外れれば営業担当に回す |
| 経路が見つからない区間 | condition が経路ありでない区間を「要確認」にし、時刻を空けておく |
| 営業時間が取れない施設 | 営業時間の項目が無ければ「営業時間不明」とし、台帳の情報だけで見る。電話の確認に回す |
| 閉業・移転の施設 | businessStatus を見て候補から外し、台帳にも印を付けるよう知らせる |
| 旅行日が7日より先 | 特別な営業時間は見ていない旨を行程表に書く |
| APIが一時的に応答しない | 少し待って再試行。続けて失敗したら点検を止め、「点検未完了」と行程表に書く |
「点検未完了」を必ず書くのは、空の指摘欄が「問題なし」と読まれるためです。 点検が途中で止まった行程と、点検して何も見つからなかった行程を、見た目で区別できるようにします。
記録を残す
- 要望の行、AIに渡した候補の施設、1回目の指示と返ってきたJSON
- Routes API と Places API の返却のうち、点検に使った値と取得日時
- 点検の結果(規則ごとの判定)と、2回目のAIの説明
- 営業担当が直した点と、「点検だけ」を押した回数
- 指摘が残ったまま顧客に出した行程と、その理由
- 「台帳外」として出てきた場所と、台帳に足したかどうか
「指摘が残ったまま出した理由」は、規則を育てる材料です。 同じ施設で同じ理由が続くなら、台帳の受付の締めか、規則の係数が実態と合っていません。ベテランの経験が台帳と規則に移っていくのは、この記録を通してです。
地図のAPIから取った値の保存期間は、Google Maps Platform の規約を確かめて決めます。 点検の根拠として残す値と、次の点検で取り直す値を分けておきます。
04実装レベルの3段階
最小構成は、台帳とAIの相性を確かめるための段階です。 時刻を手で入れるので、②の時間はほとんど減りません。 半自動化で、1件90分が50分程度になります。 順番の案と時刻の計算は自動になりますが、営業時間の確認と食い違いの見つけ出しは人に残ります。本格構成で30分になり、この段階が本記事の想定です。 差が大きいのは、③の営業時間の確認と、ベテランが頭の中で行っていた点検が規則に移るからです。 半自動化の段階で、移動の係数を合わせておきます。 APIの所要時間と、実際に走ったバスの所要時間を1か月分並べると、自社の係数が1.2なのか1.4なのかが見えます。 係数が合わないまま本格構成に進むと、点検の指摘が多すぎるか少なすぎるかのどちらかになります。
05工数削減シミュレーション
導入後 60件 × 30分 ÷ 60 = 30 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 社員旅行・招待旅行・視察旅行・自治会や組合の旅行など、法人・団体の貸切バスの旅行を月に数十件組み、営業担当が地図と施設のサイトを見ながら行程表を一から作っている旅行会社。行程の組み方が担当者の経験に頼っていて、新人の作った行程に「移動が間に合わない」「定休日に行く」といった食い違いが残りやすい場合。手配の実績のある訪問先を、団体の受入れの可否とバスの駐車の可否とあわせて台帳にできる場合。
- 扱う旅行が個人の手配旅行やパッケージツアーの販売が中心で、行程を一から組むことが少ない場合。行程が鉄道・航空の時刻に縛られ、バスの移動がほとんど無い場合。修学旅行など生徒・児童の情報を扱う旅行(本記事の構成の対象外です)。なお、施設の団体受入れの確約、貸切バスの運行計画が運転者の労働時間の基準に合うかの判断、旅行の契約条件の説明は、この構成では代替できません。
07最小構成で試す方法
- 先月顧客に出した行程表から10件を選ぶ(現地で遅れた、施設が閉まっていたなど、問題が出たものを数件入れる)
- その10件の要望を、聞き取りの記録から書き出す
- よく使う施設30か所ほどを、団体の可否・バスの駐車・受付の締めとあわせて表にする
- 手元の Gemini アプリ(Google Workspace の Gemini など)に要望と表を貼り、「表の施設だけを使い、時刻を書かずに、日ごとの順番と滞在分数を出してください」と指示する
- 出てきた順番で、地図のサイトで移動時間を見て時刻を入れ、当時の行程と比べる
時刻を自分で入れるところは手作業で構いません。 確かめたいのは、台帳を渡せばAIが無理のない順番を出せるかと、台帳に何が足りないかです。
| 出てきた内容 | 判断 |
|---|---|
| 当時の行程と同じか、より無理のない順番が出た | 地図のAPIと規則の点検に進む |
| 表に無い施設を足してくる | 指示の書き方で直る。構成は有効 |
| 季節や受付の締めを無視した並びが出る | 台帳の列が足りない。 先に台帳を育てる |
3行目は、台帳に書くべきことが見つかったという意味です。 ベテランが無意識に避けていた並び方を、台帳の「季節の注意」に書き足してから次に進んでください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| AIの案に時刻が入ってくる | スキーマに時刻の欄を作らず、指示でも禁じる。時刻はAPIと規則で埋める |
| 顧客が挙げた台帳外の名所を入れてくる | unlisted_requests という書き込み先を用意し、候補外の施設は検査で弾く |
| 地図の所要時間がバスの実態と合わない | 自社の係数と乗降の分数を規則のシートに持ち、実績と比べて合わせる |
| 営業時間の曜日を取り違える | periods の並び順ではなく day の値(0が日曜)で引く |
| 先の日程で特別な営業時間が見えない | currentOpeningHours は7日分だけ。直前にもう一度点検を走らせる |
| 団体の受付の締めが営業時間と違う | 台帳の「団体の受付の締め」があれば、そちらを優先して見る |
| 経路の結果を区間に当てはめ間違える | 結果は順不同のことがある。originIndex と destinationIndex で当てはめる |
| 手直しした行程をAIが作り直してしまう | 「点検だけ」のメニューを分け、手直し後は1回目の呼び出しをしない |
| 食い違いの説明が「問題ない場合も」と和らぐ | 指示で禁じ、指摘の件数と説明の件数が一致するかを確かめる |
| 連続運転の点検を「法令に合う」と読まれる | 行程表に「バス会社の運行計画の確認が要る」と常に書く |
上の2行が、この構成の失敗のほとんどです。 どちらも、AIが要望を満たそうとして「それらしく埋める」ことから起きます。書いてよい欄を、スキーマの段階で分けておくことが要です。
最後の行も早く効いてきます。 点検が通ったことを「運転の基準を満たした」と読むと、バス会社との確認を飛ばします。この点検はバス会社と話す前の下ごしらえで、運行計画の判断ではありません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧客の会社名・団体名、旅行の日程と人数、訪問先、参加者の配慮事項(年齢の傾向、歩く距離など)、自社の訪問先の台帳と規則です。
- 参加者の名簿をAIに渡さない … 行程を組むのに要るのは人数と配慮事項だけです。名前・連絡先・健康の情報は、この構成に入れません
- 有料の利用枠で使う … Gemini API の規約では、無料の枠(Unpaid Services)に送った内容は製品の改善に使われることがあり、人が読むこともあるとされ、機密や個人の情報を送らないよう求めています。 有料の枠(Paid Services)では、プロンプトと回答を製品の改善に使わないとされています
- 生徒・児童の情報を扱う旅行には使わない … Gemini API の規約は、18歳未満が利用する、または利用しうるサービスでの利用を認めていません。修学旅行など生徒の情報を扱う案件は、この構成の対象から外します
- 行程表を顧客へ自動で送らない … 出すのは下書きまでです。施設の受入れとバスの運行の確認が済む前の行程が顧客に渡ると、その時刻が約束として受け取られます
- 点検は運行の判断を代替しない … 運転者の労働時間の基準に合うかを決めるのはバス会社です。この構成が出すのは「組み直しを求められそうな区間」の目安だけです
- 台帳を外部へ出さない … 施設ごとの団体の受付の締めや季節の注意は、自社が経験で集めた情報です。AIに渡すのは、その案件の地域に絞った候補だけにします
誤りが起きた場合のリスクは、現地で施設が閉まっている、移動が間に合わない、バスの運行が組めないの3つです。時刻を地図のAPIと規則に置き、AIには並べ方と説明だけを任せる線を、設計で守ります。
10まず何から始めるか
1週目:よく使う施設の台帳を作る
過去1年の行程表から、3回以上使った施設を書き出し、団体の受入れの上限、バスの駐車、受付の締め、季節の注意を埋めます。まずは30〜50か所で構いません。
2週目:10件で試す
先月の行程から10件を選び、手元の生成AIに要望と台帳を貼って、順番と滞在分数を出させます。表に無い施設を足していないか、季節の注意を守っているかを最優先で見ます。
3週目:移動の係数と規則を決める
ベテランに、地図の所要時間に何割足しているか、トイレ休憩をどの間隔で入れているかを聞き、規則のシートに書きます。連続運転の目安は、取引の多いバス会社と話して決めます。
4週目:Apps Script で時刻の計算までをつなぐ
依頼シートから Gemini API を呼び、Routes API で時刻を埋めた行程表を作るところまで作ります。この時点では点検の指摘を出さず、時刻の列だけを見ます。
2か月目: Places API の営業時間と点検の規則を足し、2回目のAIの説明を加えます。指摘の件数と、営業担当が直した点を毎週数えます。3か月目以降: 1件90分が何分になったかを実測します。「指摘が残ったまま出した理由」を台帳と規則に戻し、ベテランの見直しが指摘の残った行程だけになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
構造化出力を /v1beta/interactions の response_format(mime_type: "application/json" と schema)で指定すること。enum・required が使えること。スキーマに合っていても値が誤りうるのでアプリケーションで確かめるよう案内されていること | Google AI for Developers: Structured outputs | 2026-10-14 |
| Grounding with Google Maps が現時点で英語のプロンプトと回答のみに対応すること。出典の表示の決まりがあること | Google AI for Developers: Grounding with Google Maps | 2026-10-14 |
| 18歳未満が利用する(しうる)サービスでの利用を認めていないこと。無料の枠に機密・個人の情報を送らないよう求め、有料の枠ではプロンプトと回答を製品の改善に使わないこと | Gemini API Additional Terms of Service | 2026-10-14 |
Compute Route Matrix が出発地×目的地の経路を計算し、originIndex・destinationIndex・duration・distanceMeters・condition を返すこと。X-Goog-FieldMask で項目を指定すること。要素数が TRANSIT 以外で625、TRAFFIC_AWARE_OPTIMAL で100までであること。結果が順不同で届きうること、要素ごとのエラーがあること | Google Maps Platform: Compute a route matrix | 2026-10-14 |
Place Details(New)でフィールドマスクが必須なこと。営業時間の項目(regularOpeningHours・currentOpeningHours ほか)が Enterprise、businessStatus が Pro の SKU であること | Google Maps Platform: Place Details (New) | 2026-10-14 |
periods の day が0(日曜)〜6で、並びの始まりを日曜と決めつけないこと。currentOpeningHours が今日を含む7日間で特別な営業時間を反映すること | Places API: REST Resource places | 2026-10-14 |
| バス運転者の連続運転時間は4時間を超えないものとし、高速バス・貸切バスの高速道路の実車運行区間ではおおむね2時間までとするよう努めること。1日の拘束時間が13時間を超えないものとされること | 厚生労働省: バス運転者の改善基準告示 | 2026-10-14 |
貸切バスの運行計画が基準に合うかは、バス会社が判断します。 本記事の点検は、行程表を作る段階で組み直しを求められそうな区間を見つけるための目安です。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1490)についてのご相談はこちらから。
