Tripport 予約自動転記システム 機能説明
Tripport 予約自動転記システム
機能説明
Viator / GetYourGuide の予約メールを読み取り,Claude API で予約内容を抽出し,受付台帳とカレンダーへ反映する Apps Script の全体像を平易に整理した図解である.
1. 全体像
このスクリプトは,予約メールを入口として,台帳更新とカレンダー連携までを半自動化する. 人間が確認すべきものは承認待ちとして残し,明確な予約は自動で登録する.
2. 対象メール
SENDERS に登録された送信元だけを処理する.
それ以外のメールは,予約メールに見えても処理対象外になる.
| 送信元 | 内部表記 | 意味 |
|---|---|---|
booking@t1.viator.com |
VIA |
Viator 経由の予約 |
do-not-reply@notification.getyourguide.com |
GYG |
GetYourGuide 経由の予約 |
3. メール分類
classifyEvent_() は件名からメール種別を判定する.
ここで処理ルートが分かれる.
- new
- 新規予約.Claude で抽出し,台帳に新しい行を追加する.
- cancel
- キャンセル通知.予約番号で既存行を探し,無料/有料キャンセルを判定する.
- amend
- 変更通知.明記された項目だけ上書きし,変更内容は備考に残す.
- review / other
- レビュー通知や不明なメール.予約処理からは除外する.
4. 新規予約の処理
| 抽出項目 | 意味 |
|---|---|
booking_id | 予約番号.重複判定やキャンセル・変更の紐付けに使う. |
tour_name | 内部ツアー名.TOUR_NAMES から選ぶ. |
travel_date / travel_time | 実施日と開始時刻. |
num_people | 参加人数. |
lead_traveler | 代表者名. |
country | 参加者の国. |
net_rate | 売上. |
confidence / concerns | 自動処理してよいか,人間確認が必要かを判断する情報. |
5. ツアー名とカテゴリ
メール内の外部表記を,内部で使うツアー名に変換する.
その後,CATEGORY_BY_TOUR によりカテゴリを決める.
例: Asakusa Walking Tour
浅草2h
Guide
| カテゴリ | 例 |
|---|---|
| Guide | 皇居1.5h,浅草2h,築地2h,秋葉原2h,渋谷1.5h など |
| JCE | 書道1h,茶道1h |
| 協業 | ダルマ1h,サンドブラスト2h |
| TPC | cy皇居3h,es秋葉原2h,es東京タワー2h など |
| Asappy | AS浅草2h,ASスカイツリー2h |
6. 台帳の列構造
buildBookingRecord_() は,抽出結果を18列の行データに変換する.
7. 信頼度と色
- high
- 台帳に追記し,カレンダーにも自動登録する.
- medium
- 行を黄色にし,備考に
承認待ちと要確認理由を残す. - low
- 行を赤色にし,ツアー名不明などの強い要確認として残す.
8. 承認と承認学習
人間が承認した結果は,次回以降の Claude プロンプトに反映される. これにより,同じような表記ゆれを次回から高信頼度で処理しやすくなる.
補足ルール生成
に保存
に反映
| 関数 | 役割 |
|---|---|
approveSelectedRows() | 選択行の承認待ちを承認済みに変更し,色をクリアする. |
generateApprovalRule_() | 承認された内容から,次回用の補足ルールを Claude に生成させる. |
saveLearnedRule_() | 生成されたルールを保存する. |
learnedRulesPrompt_() | 保存済みルールを抽出プロンプトに差し込む. |
9. キャンセル処理
キャンセル判定
予定削除
受信日時を基準にする.
台帳または抽出結果の実施日・時刻から Date を作る.
実施日時 − キャンセル受信日時を時間単位で計算する.
CANCEL_FREE_THRESHOLD_HOURS 以上なら無料キャンセルとする.
10. 変更処理
変更通知は「変更後の全情報」ではなく「差分」だけを含むことがある. そのため,明記された項目だけを更新し,推測による上書きは避ける.
| メール本文の例 | 処理 | 理由 |
|---|---|---|
| Changed to 4 travelers | 人数を4に更新 | 変更後の合計人数が明記されているため. |
| One traveler has been removed | 人数は更新しない | 元人数が不明だと合計人数を確定できないため. |
| Start time changed to 14:00 | 時刻だけ更新 | 新しい時刻が明記されているため. |
11. 重複防止
台帳の1列目にある予約番号を読み込み,既存予約番号と照合する. すでに存在する予約は再追加しない.
予約番号
12. デバッグ・テスト関数
| 関数 | 確認できること | 書き込み |
|---|---|---|
debugSearch() | Gmail検索,シート情報,既存IDを確認する. | なし |
debugEvents() | メール分類が正しいか確認する. | なし |
dryRunCancelAmend() | キャンセル・変更処理の予定内容を確認する. | なし |
liveTestCancelAmend() | 実際に1件ずつ処理し,before/after を見る. | あり |
insertApprovalSamples() | 承認待ちのサンプル行を追加する. | あり |
deleteSampleRows() | SAMPLE- で始まるサンプル行を削除する. | あり |
13. まとめ
このコードは,予約業務の単純な転記を減らしつつ,曖昧な判断は人間に残す構造になっている. さらに,人間の承認を学習材料として使うため,運用するほど自動処理できる範囲が広がる.