社用車の予約をフォームで受け、Apps Script と AI で車の重なりと運転者の条件を確かめ、行き先と時間に合わせた注意事項を運転者に返す
社員が Google フォームで出す社用車の予約を、Apps Script が車両のカレンダーと台帳に照らし、AI が備考と選択の食い違いと当てはまる注意事項を判定します。総務が見るのは、印の付いた予約だけになります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate
- 対象業界
- 不動産/介護/建設/製造
- 対象部門
- 総務
- 対象業務
- 内容確認・チェック/台帳・マスタ管理
- 主な課題
- 人手が足りない/属人化している/確認ミスが多い
- AIで行う処理
- 判定
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 社員が共有のスプレッドシートに行を足し、日時・車番・運転者・行き先・備考を書く
- 総務の担当者が朝と夕方にシートを開き、同じ車番で時間が重なる行がないかを目で探す
- 運転者が社内の運転の許可を持っているか、免許の期限が切れていないかを、運転者の一覧と見比べる
- 車の車検と定期点検の期限、スタッドレスタイヤの装着を、車両の一覧と見比べる
- 備考を読み、荷物や人数や帰りの時間が選んだ車と合っているかを考える
- 問題があれば本人に電話かチャットで聞き直し、シートを直す
- 遠い現場や夜の運行は、安全運転管理者に口頭で伝える
- 確定した予約を、紙の配車表に書き写して事務所に貼る
- 人社員が Google フォームで予約を出す(車の種類、日時、運転者、同乗者の人数、行き先、荷物、備考)
- 自動フォームの送信をきっかけに Apps Script が動き、予約番号を振って予約台帳に記録する
- 自動車両のカレンダーを引き、時間の重なりを確かめる。重なれば、同じ種類の空いている車を候補に挙げる
- 自動運転者の台帳と車両の台帳に照らし、運転の許可・免許の期限・車検と点検の期限・定員を確かめる
- 自動行き先を現場の台帳に照らし、片道の距離の目安と、山間部・積雪のおそれのある地域かを付ける
- 自動備考・行き先・荷物の文と、3〜5番目の結果を Gemini API に渡し、食い違いと当てはまる注意事項を JSON で受け取る
- 自動結果から「そのまま確定」「総務が確認」「安全運転管理者へ」の3つに振り分ける
- 人総務の担当者が「総務が確認」の予約だけを開き、聞き直すか、車を替えるか、確定するかを決める
- 人安全運転管理者が「安全運転管理者へ」の予約を見て、交替の運転者や出発時刻の見直しを決める
- 自動確定した予約を車両のカレンダーに入れ、運転者に予約の内容と注意事項をメールで送る
各工程の詳しい説明を読む
- 社員が共有のスプレッドシートに行を足し、日時・車番・運転者・行き先・備考を書く
- 総務の担当者が朝と夕方にシートを開き、同じ車番で時間が重なる行がないかを目で探す
- 運転者が社内の運転の許可を持っているか、免許の期限が切れていないかを、運転者の一覧と見比べる
- 車の車検と定期点検の期限、スタッドレスタイヤの装着を、車両の一覧と見比べる
- 備考を読み、荷物や人数や帰りの時間が選んだ車と合っているかを考える
- 問題があれば本人に電話かチャットで聞き直し、シートを直す
- 遠い現場や夜の運行は、安全運転管理者に口頭で伝える
- 確定した予約を、紙の配車表に書き写して事務所に貼る
(a)重なりは、行が離れていると見落とす。 同じ車の同じ日の予約が数十行離れていることがあり、並べ替えると書いている最中の行がずれるので目で追うしかありません。月に数回、現場から「車が無い」と電話が入ります。
(b)備考の事情は、読む人によって拾い方が違う。 「足場材を少し」「帰りは状況次第」のような書き方は、総務の2名で聞き直すかどうかが分かれます。
(c)注意事項の伝え方が決まっていない。 山間部の現場に向かう冬の朝、片道100kmを超える日帰り、夜に戻る運行。安全運転管理者が伝えておきたいことはありますが、誰に何を伝えたかが残っていません。 しかも全件を朝夕に見る確認は、繁忙期ほど省かれます。
- 【人】 社員が Google フォームで予約を出す(車の種類、日時、運転者、同乗者の人数、行き先、荷物、備考)
- 【自動】 フォームの送信をきっかけに Apps Script が動き、予約番号を振って予約台帳に記録する
- 【自動】 車両のカレンダーを引き、時間の重なりを確かめる。重なれば、同じ種類の空いている車を候補に挙げる
- 【自動】 運転者の台帳と車両の台帳に照らし、運転の許可・免許の期限・車検と点検の期限・定員を確かめる
- 【自動】 行き先を現場の台帳に照らし、片道の距離の目安と、山間部・積雪のおそれのある地域かを付ける
- 【自動】 備考・行き先・荷物の文と、3〜5番目の結果を Gemini API に渡し、食い違いと当てはまる注意事項を JSON で受け取る
- 【自動】 結果から「そのまま確定」「総務が確認」「安全運転管理者へ」の3つに振り分ける
- 【人】 総務の担当者が「総務が確認」の予約だけを開き、聞き直すか、車を替えるか、確定するかを決める
- 【人】 安全運転管理者が「安全運転管理者へ」の予約を見て、交替の運転者や出発時刻の見直しを決める
- 【自動】 確定した予約を車両のカレンダーに入れ、運転者に予約の内容と注意事項をメールで送る
7番目で「そのまま確定」になる予約は、人が開きません。全件を人が承認する設計にすると、36.0時間はほとんど減りません。
9番目を AI に任せないのは、法令で安全運転管理者の業務とされているからです。 道路交通法施行規則は、運転者が長距離の運転や夜間の運転に従事する場合で、疲労等により安全な運転を継続できないおそれがあるときは、あらかじめ交替するための運転者を配置することを、安全運転管理者の業務に挙げています。この構成が出すのは「長距離・夜間に当たりそうだ」という印までです。
02今回想定するシステム構成
社員のパソコン・スマートフォン │ Google フォーム(車の種類・日時・運転者・同乗者・行き先・荷物・備考) ▼【トリガー】フォームの送信(回答をスプレッドシートに記録) Google Apps Script(送信のたび) ├──▶ 予約番号を振って予約台帳へ(ロックで1件ずつ) ├──▶ 車両のカレンダーで時間の重なりを確認、空いている同種の車を候補に ├──▶ 運転者の台帳・車両の台帳・現場の台帳と照合 ▼ Gemini API ── 備考と選択の食い違い、当てはまる注意事項の番号を JSON で返す ▼ 振り分け(そのまま確定 / 総務が確認 / 安全運転管理者へ) ▼ 【人が印の付いた予約だけ確認】── 確認の一覧のシートで承認の印を付ける ▼【トリガー】承認の印の編集 Google Apps Script ── 車両のカレンダーへ登録、運転者へ注意事項付きのメール
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make |
| 生成AI | Gemini API(Interactions API、構造化出力) | Claude API、OpenAI API |
| 受付 | Google フォーム(回答をスプレッドシートに記録) | - |
| 予定 | Google カレンダー(車両ごとに1つのカレンダー) | - |
| 保管 | Google スプレッドシート(予約台帳、車両・運転者・現場の台帳、注意事項の一覧、確認の一覧、処理ログ) | - |
新しく足すのは、フォームと Apps Script と、車両ごとのカレンダーだけです。 予約の入口はフォームに1本化します。直接の書き込みを残すと、重なりの確認から漏れる予約が出ます。
車両ごとにカレンダーを1つ作るのが、重なりの確認の土台です。 Apps Script の Calendar のクラスの getEvents(startTime, endTime) は、指定した時間の範囲に始まる予定、範囲の中で終わる予定、範囲を包む予定を返すとされています。予約の出発から戻りまでを範囲にして呼べば、1件でも返ってきた時点で重なりです。 範囲の終わりは含まれない(non-inclusive)とされているので、前の予約の戻りと次の出発が同じ時刻の場合は重なりになりません。
生成AIは Gemini API を想定します。 Gemini API の規約は18歳以上を利用の条件とし、18歳未満が利用しうるサービスでの利用を禁じています。この構成を使うのは運転免許を持つ社員だけなので、この条件に収まります。
03どうやって実装するのか
処理の起点を決める
フォームの送信を起点にします。 Apps Script のインストール型のトリガーには、Google フォーム側の送信のトリガーと、回答先のスプレッドシート側の送信のトリガーの2種類があります。この構成ではスプレッドシート側を使います。 回答の行がシートに書かれた後で動くので、その行の位置をそのまま予約台帳の行として扱えます。
2つ目の起点は、確認の一覧のシートでの承認の印です。 スプレッドシートにはインストール型の編集のトリガーがあり、総務や安全運転管理者がチェックボックスに印を付けたことで動かせます。印が付いた行だけを、カレンダーへの登録とメールの送信に回します。
3つ目は、毎朝の時間主導型のトリガーです。 当日と翌日の予約を見直し、期限が切れた車や運転者の予約が残っていないかを確かめます。時間主導型のトリガーの時刻は少しずれることがあり、9時の設定なら9時から10時のあいだに動くとされています。朝礼の前に見たいなら6時台にします。
インストール型のトリガーは、作った人のアカウントで動くとされています。 担当者個人で作ると異動で止まるので、総務の共用のアカウントで作ります。 失敗したときは、まとめのメールがそのアカウントに届きます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 予約の回答 | 車の種類、出発と戻りの日時、運転者の社員番号、同乗者の人数、行き先(現場名か住所)、荷物(選択と自由記述)、備考 | フォームの回答のシート |
| 車両の予定 | 車ごとの確定した予約 | 車両ごとの Google カレンダー |
| 車両の台帳 | 車番、種類、乗車定員、最大積載量、荷台の長さ、車検と定期点検の期限、スタッドレスの装着の有無、カレンダーのID | 車両の台帳のシート |
| 運転者の台帳 | 社員番号、社内の運転の許可の有無、免許の種類と有効期限、運転できる車の種類、入社や許可から6か月以内か | 運転者の台帳のシート |
| 現場の台帳 | 現場名、本社と営業所からの片道の距離の目安、山間部・積雪のおそれの印、駐車の注意 | 現場の台帳のシート |
| 注意事項の一覧 | 番号、当てはまる条件の説明、運転者に送る文 | 注意事項の一覧のシート |
質を決めるのは、下の2つです。 現場の台帳に片道の距離が無ければ、長距離かどうかの印が付けられません。注意事項の一覧が無ければ、AI に文を作らせることになり、運転者に届く文が毎回変わります。
注意事項の一覧は、安全運転管理者と総務で作ります。 「片道100kmを超える日帰り」「戻りが20時を過ぎる」「冬に積雪のおそれのある地域へ行く」「長さのある資材を積む」などの条件と送る文を1行ずつ書きます。閾値は会社が決めるもので、ここの数字は例です。
データの取得方法を決める
フォームの回答は、送信のイベントから受け取ります。公式のページでは、スプレッドシート側の送信のイベントは、質問の名前と値をまとめた namedValues、書き込まれた範囲を表す range、シートの並びどおりの values などを持つとされています。質問の名前で値を取る namedValues を使い、列の並びに頼らないようにします。 フォームに質問を足しても、列の位置のずれで値を取り違えません。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 予約の回答 | 送信のイベントの namedValues | 予約の中身 |
| 重なる予定 | 車両のカレンダーの getEvents(出発, 戻り) | 重なりの有無と相手の予約番号 |
| 同じ種類の空いている車 | 同じ種類の車のカレンダーを順に getEvents | 重なったときの候補 |
| 運転者と車両の条件 | 台帳のシート | 許可・期限・定員・積載 |
| 行き先の距離と地域 | 現場の台帳のシート | 長距離・山間部の印 |
同時の送信に備えて、処理を1件ずつにします。 LockService はコードの一部への同時のアクセスを防ぐもので、getScriptLock() は利用者にかかわらず同時の実行を止めるとされています。月曜の朝は、同じ車に同時に2件入ってどちらも「空いている」と判定されることがあります。 カレンダーを引いてから仮の予定を入れるまでをロックで囲みます。ロックは waitLock か tryLock を呼んで初めて取れるとされています。
getEvents は、タイムゾーンを指定しないと時刻をスクリプトのタイムゾーンで解釈するとされています。 スクリプトの設定を Asia/Tokyo にしてから作ります。
AIへ渡す前に整形する
- 予約番号を振る … 日付と連番で振り、フォームの回答の行に書き戻します
- 日時を確かめる … 戻りが出発より前、出発が過去、30日より先の予約は、AI に渡さず本人に戻します
- 運転者を引く … 社員番号で運転者の台帳を引きます。見つからなければ、その時点で「総務が確認」にします
- 台帳の条件を確かめる … 社内の運転の許可、免許の有効期限が戻りの日より後か、運転できる車の種類、乗車の定員と同乗者の人数を数で比べます
- 車の期限を確かめる … 車検と定期点検の期限が戻りの日より後か、11月から3月の山間部行きでスタッドレスが付いているかを見ます
- 重なりを確かめる … 選んだ種類の車のカレンダーを順に引き、空いている車を割り当てます。全部埋まっていれば「空きなし」とし、空いている時間帯を添えます
- 行き先を引く … 現場名で現場の台帳を引き、片道の距離と地域の印を付けます。台帳に無い行き先は「距離不明」とします
- 名前を外す … AI に渡す前に、運転者の氏名と社員番号を外し、予約番号だけにします
4番目から6番目は、すべて Apps Script が数で決めます。 AI に渡すのは、この結果を「事実」として添えるためで、判断させるためではありません。
AIに処理させる
させるのは、文で書かれた部分を読んで、選択した項目や台帳の事実との食い違いを見つけることと、注意事項の一覧から当てはまる番号を選ぶことです。
| 見るもの | 判定の仕方 | 判断できないときの扱い |
|---|---|---|
| 荷物と車の種類 | 荷物の記載(長さ・量・種類)が、割り当てた車の荷台と積載で運べそうか | 量が書かれていなければ unclear |
| 人数 | 備考に書かれた人数と、同乗者の人数の欄が合っているか | 人数が文に無ければ確認しない |
| 時間 | 備考の「翌朝」「直帰」「現場で待機」などと、出発・戻りの日時が合っているか | 読み方が2通りあれば unclear |
| 行き先 | 備考の行き先と、行き先の欄が同じ場所を指しているか | 地名が台帳に無ければ unclear |
| 注意事項 | 一覧の条件の説明に、予約の中身が当てはまる番号を選ぶ | 当てはまるか迷う番号は maybe で返す |
右端の unclear と maybe は、総務の確認に回すための印です。 AI が迷ったものを「問題なし」に寄せると、そのまま確定して運転者に届きます。迷ったときは人に回す、を出力の形で決めておきます。
| させないこと | 理由 |
|---|---|
| 時間の重なりの判定 | カレンダーを引けば機械的に決まる。AI の読み違いを混ぜない |
| 免許・車検の期限の比較 | 日付の比較は Apps Script が行う |
| 予約を断る・確定する判断 | 総務と安全運転管理者が決める |
| 交替の運転者が要るかの判断 | 安全運転管理者の業務 |
| 注意事項の文の作成 | 一覧の文をそのまま送る。番号を選ぶだけ |
| 運転者の体調や適性の推測 | 予約の文から読み取るべきものではない |
5行目が最も効く制約です。 番号で選ばせれば、運転者に届く文は安全運転管理者が書いた文だけになります。
指示内容を固定する
あなたは建設会社の総務部で、社用車の予約の中身を確かめる立場です。
渡された予約の文と、すでに確かめた事実だけを見て判定してください。
推測で埋めないでください。
【あなたがすること】
1. 荷物・人数・時間・行き先の4つについて、備考などの文と、
選択した項目・割り当てた車の事実が食い違っていないかを判定する
2. 注意事項の一覧から、この予約に当てはまる番号を選ぶ
【判定の選び方】
- ok ......... 文と選択・事実が合っている。または文にその話題が無い
- mismatch ... 文と選択・事実が明らかに食い違っている
- unclear .... 文の読み方が2通り以上あり、合っているか決められない
迷ったときに ok を選ばないでください。
【注意事項の選び方】
- 一覧の「条件の説明」に予約が当てはまる番号だけを applies に入れる
- 当てはまるか迷う番号は maybe に入れる
- 一覧に無い注意事項を作らないでください。文を書き換えないでください
【厳守事項】
- 時間の重なり、免許・車検の期限、定員は確かめ済みです。判定し直さないでください。
- 予約を断る、確定する、といった結論を書かないでください。
- 交替の運転者が要るかどうかを判断しないでください。
- 運転者の体調、経験、性格について書かないでください。
- 荷物の長さや重さが文に書かれていなければ、推測せず unclear にしてください。
- evidence には、判定の根拠にした文をそのまま写してください。
- question には、総務が本人に聞き直すときの短い質問を1文で書いてください。
食い違いが無いときは空にしてください。
【予約】{booking}
【割り当てた車の事実】{vehicle_facts}
【確かめ済みの結果】{checked_facts}
【行き先の情報】{destination_facts}
【注意事項の一覧】{notice_list}
「確かめ済みです。判定し直さないでください」を書かないと、AI は定員や期限にも意見を言います。 その意見が Apps Script の結果と食い違うと、どちらを信じるかを総務が迷うことになります。役割を分けたことを、指示の文でも念を押します。
「体調、経験、性格について書かない」は、備考に「寝不足ですが」と書く社員がいるためです。 本人の状態を AI が評価した形にせず、そうした記載は総務が原文を読んで直接話します。
出力形式を固定する
Gemini API の構造化出力で、次の形の JSON を受け取ります。 公式のページでは、/v1beta/interactions に送る要求に response_format を付け、mime_type に application/json を、schema に受け取る形を書くとされています。
{
"booking_id": "",
"checks": [
{ "topic": "cargo | passengers | time | destination",
"status": "ok | mismatch | unclear",
"evidence": "",
"question": "" }
],
"notices": {
"applies": [""],
"maybe": [""]
}
}
checks には topic の4つを1つずつ並べます。notices の applies と maybe には、注意事項の一覧の番号(「N-03」など)だけを入れます。
1つ目の理由は、振り分けを規則で決められることです。 AI が返すのは食い違いの有無と番号までで、「そのまま確定」「総務が確認」「安全運転管理者へ」は Apps Script が規則で決めます。
| 振り分け | 条件 |
|---|---|
| 安全運転管理者へ | 長距離・夜間・積雪の印の付く注意事項が applies か maybe にある |
| 総務が確認 | mismatch か unclear が1つでもある。台帳の確認で問題が出た。maybe がある。空きなし |
| そのまま確定 | 上のどれにも当たらない |
2つ目は、status に列挙の値だけを許せることです。 公式のページでは、文字列に enum を付けられるとされています。status を ok/mismatch/unclear に限れば、「たぶん大丈夫」のような値で振り分けが止まりません。 注意事項の番号も、一覧の番号を enum に並べておけば、一覧に無い番号は返りません。
応答は、保存しない設定で呼びます。 公式のページでは、Interactions API は既定で要求を保存し、store=false にすると保存しない動きになるとされています。予約の文は、会話を続ける必要の無い1回ごとの判定なので、store=false を付けます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| フォームの回答のシート | スプレッドシート側の送信のトリガー | 予約を受け取る |
| 車両のカレンダー | Calendar のクラス(getEvents、createEvent) | 重なりの確認と、確定した予約の登録 |
| 台帳のシート | スプレッドシートの読み取り | 運転者・車両・現場・注意事項 |
| Gemini API | UrlFetchApp.fetch | 食い違いと注意事項の番号を受け取る |
| 確認の一覧のシート | 書き込みと、編集のトリガー | 印の付いた予約と承認の印 |
| 運転者へのメール | MailApp | 確定した予約の内容と注意事項の文 |
カレンダーへの登録は、承認の後か「そのまま確定」の後だけです。 createEvent には説明と場所を付けられるとされているので、予定の説明に予約番号と運転者の社員番号を入れ、場所に行き先を入れます。 招待のメールは既定で送らないとされているので、運転者への連絡はメールで別に送ります。
Gemini API の呼び出しは、失敗の応答でも止まらないようにします。 UrlFetchApp.fetch の muteHttpExceptions を true にすると、失敗の応答でも例外を投げないとされています。応答の番号を見て、失敗なら「総務が確認」に回し、AI の結果欄を空にしておきます。 API のキーはスクリプトのプロパティに置き、コードに書きません。
運転者へのメールは、確定した予約にだけ送ります。 本文は予約の内容と注意事項の文で、AI の question や evidence は入れません。
人が確認する
総務が開くのは「総務が確認」の予約だけです。 「そのまま確定」の予約は、確認の一覧で件数と車と行き先を流し見るだけにします。全件を開く設計にすると、第10章の12.0時間には収まりません。
mismatchを先に見る …evidenceとquestionを読み、本人に聞き直すか、車を替えるかを決めますunclearとmaybeを見る … 備考の原文を読み、自分で判断がつけば確定し、つかなければ聞き直します- 台帳の問題を見る … 免許の期限切れ、車検の期限、空きなしは、本人と上長に連絡します
- 確定の印を付ける … 印を付けた時点でカレンダーに入り、運転者にメールが届きます
安全運転管理者は「安全運転管理者へ」の予約を見ます。 長距離・夜間・積雪の印が付いたもので、交替の運転者を付けるか、出発の時刻を早めるか、別の日にするかを決め、決めた内容を確認の一覧の欄に書いてから印を付けます。
AI の判定を覆したら、その理由を1行残します。 たまった記録は、注意事項の一覧と車の事実の書き方を直す材料になります。 総務が開くのは2割前後が目標で、超える月はフォームの選択肢か現場の台帳が足りていません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 運転者が台帳に無い | AI に渡さず「総務が確認」。新しく入った社員なら台帳に足す |
| 免許・運転の許可・車検の期限が切れる | 予約を受けず、本人と上長に知らせる。AI の判定は呼ばない |
| 同じ種類の車がすべて埋まっている | 「空きなし」として、空いている時間帯と他の種類の空き車を添えて本人に返す |
| 2件の予約がほぼ同時に入る | ロックで1件ずつ処理し、後の1件はカレンダーを引き直して判定する |
| 行き先が現場の台帳に無い | 「距離不明」とし、長距離の印の代わりに maybe を付けて総務に回す |
| Gemini API が失敗・時間切れ | 「総務が確認」に回し、AI の欄を空にする。夜間にもう一度呼ぶ |
| JSON の形が崩れて返る | 読み取りに失敗したら「総務が確認」。AI の結果で確定しない |
| 予約の取り消し・変更 | フォームの「取り消し・変更」の質問で予約番号を書いて送る。カレンダーの予定を消し、変更は新しい予約として受ける |
取り消しと変更をフォームの外で受けないでください。 カレンダーの予定を直接消すと、予約台帳と食い違ったまま残ります。
上限は、公式の表で実行時間が1回6分、トリガーの合計が Workspace で1日6時間、予定の作成が1日1万件、MailApp の宛先が1日1,500です。 1日十数件の予約なら遠く届きません。
記録を残す
- 予約番号ごとの、フォームの回答の原文と受け付けた日時
- Apps Script が確かめた結果(重なりの相手の予約番号、台帳の照合の結果、距離と地域の印)
- AI に渡した入力(名前を外した後のもの)と、返ってきた JSON の全文
- 振り分けの結果と、そのときの注意事項の一覧の版
- 人が判定を覆した記録 … どの項目を、どう変えたか、その理由
- 安全運転管理者が決めた内容(交替の運転者、出発時刻の見直し)
- 運転者に送ったメールの本文と送信の日時
4つ目で「注意事項の一覧の版」を残すのは、一覧が季節や事故の後に書き換わるためです。 同じ番号の文が変わっても、後から「何を伝えたか」を当時の文で確かめられます。 運転日誌やアルコールチェックの記録とも、同じ予約番号で突き合わせられる形にしておきます。
04実装レベルの3段階
最小構成は、AI が備考を読めるかを確かめるための段階です。半自動化で1件6分が2分程度になり、この段階が本記事の想定です。 差が大きいのは、第4章の①と②がシートの中を探す時間だったからです。 本格構成は、予約の仕組みが定着してからにします。 予約と運転日誌がつながると、使わなかった予約や予約の無い運行が分かり、台数の見直しの材料になります。 ただし運転日誌は安全運転管理者の業務に関わる記録で、記録の仕組みそのものを変える話になります。
05工数削減シミュレーション
導入後 360件 × 2分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 社用車を十数台から数十台持ち、現場や取引先への移動に社員が交代で使っている建設業・不動産業・製造業・介護事業所など。予約を共有のスプレッドシートやホワイトボードで受け、総務の担当者が重なりと運転者の条件を目で確かめている場合。Google Workspace を使っており、車両ごとの予定を Google カレンダーで持てる場合。
- 社用車が数台で、予約が口頭で足りる事業所。車両管理の専用の仕組み(予約・点検・運転日誌が一体のもの)をすでに使えている場合。車を特定の社員に専属で割り当てていて、予約そのものが無い場合。なお、運転者の適性の判断、安全運転管理者の業務そのもの(酒気帯びの確認や運転日誌の管理)、事故時の対応はこの構成の対象外です。
07最小構成で試す方法
- 先月のスプレッドシートの予約から、備考が書かれた30件を選ぶ(うち数件は、実際に聞き直したり車を替えたりしたものを入れる)
- 車両の一覧から、その30件に割り当てた車の種類・荷台の長さ・定員を書き出す
- 安全運転管理者と、注意事項の一覧の最初の10項目ほどを書く
- 手元の Gemini の画面に、第7章のプロンプトと、1件ずつ予約の文・車の事実・注意事項の一覧を貼る
- 出てきた食い違いと番号を、当時の総務の対応と突き合わせる
30件で見るのは、備考の事情を拾えるかと、一覧に無い注意事項を作らないかの2つです。 重なりや期限は機械で決まるので、ここでは試しません。
| 出てきた内容 | 判断 |
|---|---|
当時聞き直した予約に mismatch が付いた | フォームと Apps Script の連携に進む |
| 一覧に無い注意事項を書いた | 指示と番号の enum で直る。構成は有効 |
| 備考が短すぎて何も判定できない | フォームの荷物と人数の質問を増やすのが先 |
3行目は、AI ではなく入力の問題です。 フォームに「長さ(m)」と「おおよその量」の欄を足してから、もう一度試します。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 共有のシートへの直接の書き込みが残る | 入口をフォームに1本化する。 シートは閲覧のみにする |
| 同時の送信で同じ車に2件入る | カレンダーを引いてから仮の予定を入れるまでをロックで囲む |
| 前の予約の戻りと次の出発が同じ時刻で重なりになる | getEvents の範囲の終わりは含まれない。片付けの時間を足すなら、戻りに30分を足して引く |
| 時刻が1時間・9時間ずれる | スクリプトのタイムゾーンを Asia/Tokyo にする |
| AI が注意事項を自分で書き足す | 番号を enum で縛り、文は一覧から差し込む |
| AI が定員や期限に意見を言う | 「確かめ済み。判定し直さない」と指示に書く |
| 備考が短くて判定にならない | フォームに長さと量の欄を足す |
| トリガーを作った担当者が異動して止まる | 総務の共用のアカウントで作る |
| 現場の台帳に無い行き先が多い | 新しい現場を受注した時点で台帳に足す流れを、工事部と決める |
上の2行が、この構成の失敗のほとんどです。入口を1つにし、1件ずつ通すことを最初に決めます。
現場の台帳が古いと、長距離の印が付かずに「そのまま確定」になります。 台帳の更新を工事部の受注の手順に入れておきます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 社員の氏名・社員番号・免許の種類と有効期限、行き先の現場名と住所、出発と戻りの時刻、備考に書かれた事情です。行き先と時刻の組み合わせは、社員の動きそのものです。
- 外部へ渡す範囲を、判定に必要なものまでに限る … Gemini API に渡すのは、予約番号、荷物・人数・時間・行き先の文、車の事実、確かめ済みの結果、注意事項の一覧だけです。氏名・社員番号・免許の情報は渡しません
- 有料の利用で組む … Gemini API の規約では、無料の枠で送った内容は製品の改善に使われ、人が読むことがあるとされ、機密の情報や個人の情報を無料の枠に送らないよう書かれています
- 応答を保存しない設定で呼ぶ … Interactions API は既定で要求を保存するとされています。
store=falseを付けて呼びます - 運転者の状態を AI に評価させない … 酒気帯びや過労の確認は、安全運転管理者が行う業務です
- 安全運転管理者の判断を代替しない … 長距離・夜間の運行で交替の運転者を置くか、異常な気象のときにどう指示するかは、道路交通法施行規則が安全運転管理者の業務に挙げているものです。この構成が出すのは、その判断に回すための印までです
誤りが起きた場合のリスクは、重なりの見落としと、長距離・夜間の運行が安全運転管理者に届かないことの2つです。 後者のほうが重く、迷ったときは安全運転管理者へ回す側に倒します。
10まず何から始めるか
1週目:車両ごとのカレンダーと台帳を作る
18台それぞれに Google カレンダーを作り、来月の予約を移します。車両の台帳に荷台の長さと定員と期限を、運転者の台帳に許可と免許の期限を書きます。現場の台帳は、予約の多い上位20現場から片道の距離を書きます。
2週目:30件で試す
先月の予約から備考のある30件を選び、手元の Gemini の画面で判定させます。一覧に無い注意事項を書かないか、聞き直した予約に mismatch が付くかを最優先で見ます。
3週目:注意事項の一覧と閾値を決める
安全運転管理者と、長距離・夜間・積雪の閾値と、注意事項の文を決めます。 ここが決まらないうちにつなぐと、振り分けは出るのに誰も使えない状態になります。
4週目:フォームから振り分けまでをつなぐ
フォームと Apps Script をつなぎ、重なりと台帳の照合と Gemini API の判定を確認の一覧に書き出すところまで作ります。この時点では「そのまま確定」も人が見て、振り分けが妥当かを確かめます。
2か月目: 承認の印でカレンダーへの登録とメールが動くようにし、「そのまま確定」を人が開かない運用に切り替えます。3か月目以降: 1件6分が何分になったかを実測します。総務が開く予約が2割前後に落ち着き、安全運転管理者への回付が漏れなく届いた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 送信のトリガーに Google フォーム用とスプレッドシート用があること。スプレッドシートにインストール型の編集のトリガーがあること。時間主導型のトリガーの時刻がずれうること(9時の設定が9〜10時)。インストール型のトリガーが作成者のアカウントで動くこと。失敗時にまとめのメールが届くこと | Google: Installable triggers | 2026-10-15 |
スプレッドシートの送信のイベントが namedValues・range・triggerUid・values を持つこと | Google: Event objects | 2026-10-15 |
getEvents が範囲内に始まる・終わる・範囲を包む予定を返すこと。範囲の終わりが含まれないこと。タイムゾーンの指定が無いとスクリプトのタイムゾーンで解釈されること。createEvent の options に説明・場所・ゲスト・招待の送信(既定 false)があること | Google: Class Calendar | 2026-10-15 |
LockService がコードの一部への同時のアクセスを防ぐこと。getScriptLock() が利用者にかかわらず同時の実行を止めること。ロックが tryLock/waitLock で取れること | Google: Class LockService | 2026-10-15 |
| 実行時間が1回6分、トリガーの合計実行時間が Workspace で1日6時間、カレンダーの予定の作成が Workspace で1日1万件、MailApp の宛先が Workspace で1日1,500であること | Google: Quotas for Google Services | 2026-10-15 |
muteHttpExceptions を true にすると失敗の応答でも例外を投げないこと | Google: Class UrlFetchApp | 2026-10-15 |
構造化出力を /v1beta/interactions の response_format(mime_type: application/json と schema)で指定すること。文字列の enum に対応すること | Google: Structured outputs | 2026-10-15 |
Interactions API が既定で要求を保存し、store=false で保存しない動きになること | Google: Interactions API | 2026-10-15 |
| 18歳以上が利用の条件で、18歳未満が利用しうるサービスでの利用を禁じること。無料の枠の内容が製品の改善に使われ人が読みうること。機密・個人の情報を無料の枠に送らないこと | Google: Gemini API Additional Terms of Service | 2026-10-15 |
| 第9条の8(安全運転管理者の選任を要する台数:乗車定員11人以上は1台、その他は5台)、第9条の10(運行計画の作成、長距離・夜間の運転での交替の運転者の配置、異常な気象のときの指示、酒気帯びの確認と記録の1年保存、運転日誌) | e-Gov 法令API: 道路交通法施行規則 | 2026-10-15 |
安全運転管理者の選任と業務、長距離・夜間の運行の扱いは、所轄の警察署と自社の安全運転管理者に確かめてください。 本記事は、社用車の予約を受けて確かめる部分に絞って、公式のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1742)についてのご相談はこちらから。
