造花・観葉植物のレンタル会社が交換の予定表から、お客様ごとの交換の日の案内のメールを Apps Script と Gemini で作り、入館の申請と休業日の食い違いを先に拾う
観葉植物・造花のレンタルの会社で、翌週の交換の予定表から、お客様ごとの交換の日の案内のメールを Apps Script と Gemini が作ります。事務の担当は確認の一覧を見て、気になる点が無いものはまとめて送ります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Zapier
- 対象業界
- その他/小売
- 対象部門
- カスタマーサポート/物流
- 対象業務
- 内容確認・チェック/書類作成
- 主な課題
- 人手が足りない/書類作成に時間がかかる/期限・対応漏れが起きる
- AIで行う処理
- 生成
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 木曜の朝、事務の担当が交換の予定表の翌週分を開く
- お客様ごとに台帳を開き、担当者の名前とメールアドレス、ビルの入館の決まりを確かめる
- 前回の案内のメールを Gmail で探して写し、交換の日・時間帯・スタッフの名前を書き換える
- 入れ替える植物があれば、品種の表から説明を写して書き足す
- 入館の申請が要るお客様には、スタッフの名前と車両の番号を書き足す
- 送ったことを予定表の備考に書く
- 人配送の担当が水曜までに翌週の交換の予定表を作り、「確定」の印を付ける
- 自動木曜の朝、Apps Script が翌週の確定した予定を読み、お客様の台帳とビルの決まりの表とつなぐ
- 自動予定ごとに、休業日との重なり、入館の申請の締切、作業できる時間帯を規則で判定する。引っかかった予定は案内を作らず「配送へ戻す」に入れる
- 自動引っかからなかった予定について、交換の事実と品種の表の説明を束ね、名前と日付を記号に置き換えて Gemini API に渡す
- 自動Gemini が記号を残した件名と本文を JSON で返す。Apps Script が記号を値に置き換え、検査して Gmail の下書きを作る
- 自動確認の一覧に、お客様・交換の日・判定の結果・検査の結果を1行ずつ書く
- 人事務の担当が「要確認」の下書きを開いて直す。「配送へ戻す」の予定は配送の担当に返す
- 人一覧を見て問題の無い下書きに「送る」の印を付け、メニューの「印の付いた下書きを送る」を押す
各工程の詳しい説明を読む
- 木曜の朝、事務の担当が交換の予定表の翌週分を開く
- お客様ごとに台帳を開き、担当者の名前とメールアドレス、ビルの入館の決まりを確かめる
- 前回の案内のメールを Gmail で探して写し、交換の日・時間帯・スタッフの名前を書き換える
- 入れ替える植物があれば、品種の表から説明を写して書き足す
- 入館の申請が要るお客様には、スタッフの名前と車両の番号を書き足す
- 送ったことを予定表の備考に書く
(a)休業日に交換を入れてしまう。 配送の担当は順路を優先して予定表を作るので、お客様の定休日や臨時の休みを見落とすことがあります。 業務課の担当が案内を書くときに気づけばよいのですが、台帳の休業日の欄を見ないまま書くと、当日、閉まった店の前で車が止まります。
(b)入館の申請が間に合わない。 「3営業日前までに申請」のビルで、案内を金曜に送ると、翌週の月曜や火曜の交換は、お客様が申請を出す前に締切が過ぎています。 当日、搬入口で入館を断られ、その日の順路が崩れます。
(c)前回のメールを写すので、古い値が残る。 3番目で写すと、前回のスタッフの名前や車両の番号が残ります。入館の申請に古い名前が使われると、当日、入館の受付で名前が合いません。
(d)植物の説明が人によって違う。 4番目で品種の表から写す担当もいれば、自分の言葉で書く担当もいます。「日当たりのよい場所に置いてください」と書いた鉢が、実は直射日光で葉が焼ける品種だった、ということが起きます。
- 【人】 配送の担当が水曜までに翌週の交換の予定表を作り、「確定」の印を付ける
- 【自動】 木曜の朝、Apps Script が翌週の確定した予定を読み、お客様の台帳とビルの決まりの表とつなぐ
- 【自動】 予定ごとに、休業日との重なり、入館の申請の締切、作業できる時間帯を規則で判定する。引っかかった予定は案内を作らず「配送へ戻す」に入れる
- 【自動】 引っかからなかった予定について、交換の事実と品種の表の説明を束ね、名前と日付を記号に置き換えて Gemini API に渡す
- 【自動】 Gemini が記号を残した件名と本文を JSON で返す。Apps Script が記号を値に置き換え、検査して Gmail の下書きを作る
- 【自動】 確認の一覧に、お客様・交換の日・判定の結果・検査の結果を1行ずつ書く
- 【人】 事務の担当が「要確認」の下書きを開いて直す。「配送へ戻す」の予定は配送の担当に返す
- 【人】 一覧を見て問題の無い下書きに「送る」の印を付け、メニューの「印の付いた下書きを送る」を押す
3番目を案内の前に置いているのが、この設計の土台です。 これまでは案内を書きながら気づいていた食い違いを、案内を作る前に機械で拾います。 休業日に当たった予定に丁寧な案内を作っても、送ればお客様に「その日は休みです」と返されるだけです。
8番目で、人がすべての下書きを開くわけではありません。 検査に引っかからなかった下書きは、確認の一覧で交換の日と植物を流し見て送ります。開くのは「要確認」だけです。 ただし、送る印を付けるのは必ず人です。
02今回想定するシステム構成
交換の予定表(お客様・交換の日・時間帯・スタッフ・車両・持っていく鉢・確定の印) + お客様の台帳(担当者・宛先・休業日・ビル)+ ビルの決まりの表 + 品種の表(植物の説明)(Google スプレッドシート) │ ▼【トリガー】毎週木曜の朝 Google Apps Script ├──▶ 休業日・入館の締切・作業の時間帯を判定 ──▶ 引っかかれば「配送へ戻す」 ├──▶ 交換の事実と植物の説明を束ね、名前と日付を記号に置き換える ▼ Gemini API(Interactions、構造化出力、store=false)── 記号入りの件名と本文 ▼ Google Apps Script ── 記号を値に置き換えて検査 ──▶ Gmail の下書き・確認の一覧 ▼ 【人】要確認を直し、送る印を付けて、メニューから送る
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Make、Zapier |
| 生成AI | Gemini API(Interactions、構造化出力) | Claude API、OpenAI API |
| 保管 | Google スプレッドシート(予定表、お客様の台帳、ビルの決まり、品種の表、確認の一覧) | - |
| メール | Gmail(業務課の共用のアカウント。下書きを作り、送る印の付いたものだけを送る) | - |
新しく足すのは、Apps Script と、ビルの決まりの表と確認の一覧の2つのシートです。 予定表とお客様の台帳と品種の表は、これまでどおり担当が入れます。
Apps Script を実行環境にしているのは、予定表もメールも Google の中にあるからです。 時間主導型のトリガーで週1回の処理を組め、スプレッドシートに結び付けたスクリプトなら、独自のメニューを足して「送る」の操作を担当の手元に置けます。
生成AIに渡すのは、記号に置き換えた事実と、品種の表の説明だけです。 お客様の会社名、担当者の名前、ビルの名前と住所、スタッフの名前、車両の番号はAIに渡しません。
03どうやって実装するのか
処理の起点を決める
毎週木曜の朝に1回動かします。 時間主導型のトリガーで onWeekDay(ScriptApp.WeekDay.THURSDAY) と atHour(7) を指定します。公式の説明では、atHour() の例は「5時〜6時の間に動く」と書かれ、nearMinute() を指定しないと分はランダムに決まります。 7時台のどこかで動き、担当が出勤する9時までに終わっていればよい作りにします。
木曜にしているのは、入館の申請の締切から逆算したためです。 「3営業日前まで」のビルで翌週の月曜に交換するなら、お客様は前の週の水曜までに申請を出す必要があり、木曜の案内ではもう間に合いません。 そうした予定は判定で「要電話」に回ります。月曜と火曜の交換が多いビルのお客様が増えたら、配送の担当に予定表の確定を前の週の月曜に早めてもらい、トリガーも火曜に移します。
水曜に予定表の確定が遅れた週のために、メニューからも動かせるようにします。 スプレッドシートに結び付けたスクリプトの onOpen で、SpreadsheetApp.getUi().createMenu() に「翌週の案内を作る」と「印の付いた下書きを送る」の2つを足します。公式は、メニューを作れるのは結び付けたスクリプトだけとしています。
トリガーは、業務課の共用のアカウントで作ります。 インストール型のトリガーは作った人のアカウントで動くとされ、担当個人のアカウントで作ると、下書きがその担当の Gmail に入ります。 失敗すると所有者に「Summary of failures for Apps Script」のメールが届くので、受信箱を見る当番を決めます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 交換の予定表 | 予定番号、お客様番号、交換の日、時間帯(午前/午後)、担当のスタッフ、車両、持っていく鉢(品種コードと数)、作業の種類(定期の交換/季節の入れ替え)、確定の印 | スプレッドシート |
| お客様の台帳 | お客様番号、会社名、担当者の名前、メールアドレス、定休日、臨時の休みの日、ビルのコード、作業できない時間帯(医院の診療の時間など) | スプレッドシート |
| ビルの決まりの表 | ビルのコード、入館の申請の締切(何営業日前)、搬入口を使える時間、申請に要る事項(入館者の名前・車両の番号・台車の有無) | スプレッドシート(新しく作る) |
| 品種の表 | 品種コード、品種の名前、案内に添える説明(特徴と置き場所の注意)、造花か生きた植物か | スプレッドシート |
質を決めるのは、ビルの決まりの表とお客様の台帳の休業日です。 ビルの決まりが無ければ、入館の申請の締切を計算できません。臨時の休みの日が台帳に入っていなければ、年末年始や改装の休みに交換を入れてしまいます。 お客様から休みの連絡を受けた担当が、その場で台帳に入れる決まりにします。
品種の表の説明は、会社の植物の担当が書いた文だけにします。 1品種につき2文ほどで、「明るい日陰を好みます。エアコンの風が直接当たらない場所に置いてください」のように書きます。AIはこの文の言い回しを整えるだけで、中身を足しません。
データの取得方法を決める
すべて同じスプレッドシートの中にあるので、Apps Script のスプレッドシートのサービスで読むだけです。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 翌週の確定した予定 | 交換の予定表 | 案内を作る対象 |
| 定休日・臨時の休み・作業できない時間帯 | お客様の台帳 | 休業日と時間帯の判定 |
| 申請の締切と申請に要る事項 | ビルの決まりの表(ビルのコードで引く) | 入館の締切の判定と、案内に書く依頼 |
| 植物の説明 | 品種の表(品種コードで引く) | 季節の入れ替えの説明 |
判定は次の規則で行います。
| 判定 | 条件 | 引っかかったとき |
|---|---|---|
| 休業日 | 交換の日がお客様の定休日・臨時の休みに当たる | 案内を作らず「配送へ戻す」 |
| 時間帯 | 午前・午後の時間帯が、作業できない時間帯と重なる | 案内を作らず「配送へ戻す」 |
| 入館の締切 | 案内を送る日から交換の日までの営業日の数が、ビルの申請の締切より少ない | 案内を作らず「要電話」 |
| 搬入口の時間 | 時間帯が、ビルの搬入口を使える時間の外にかかる | 下書きは作り「要確認」 |
入館の締切に間に合わない予定は、メールにしません。 締切を過ぎてからメールで頼むと、お客様は申請を出せないまま当日を迎えます。担当がお客様に電話し、申請が間に合うか、日を変えるかを決めます。
営業日の数え方は、会社の休日の表で決めます。 土日と祝日を除いて数え、ビルによって土曜を営業日とするところは、ビルの決まりの表に印を持たせます。
AIへ渡す前に整形する
- 確定の印で絞る … 確定の印が無い予定は外し、確認の一覧に「予定未確定」と出します
- 判定する … 上の表の4つの判定を順に当て、引っかかった予定を分けます
- お客様ごとに束ねる … 同じお客様の同じ週の予定(観葉植物と造花の両方など)は1通にまとめます
- 日付を整える … 交換の日を
M月d日(曜日)、時間帯を「午前(9時〜12時)」のような会社の決まりの言い方にします。曜日は Apps Script が日付から計算します - 申請に要る事項をそろえる … ビルの決まりの表から、そのビルで要る事項(入館者の名前・車両の番号など)を並べます
- 記号に置き換える … 会社名を
{{会社名}}、担当者を{{担当者}}、交換の日を{{交換日}}、時間帯を{{時間帯}}、スタッフを{{スタッフ}}、車両を{{車両番号}}に置き換えます
2番目を案内の作成より前に置くことが大事です。 案内を作ってから判定すると、引っかかった予定の下書きが Gmail に残り、誤って送られることがあります。引っかかった予定は、そもそも下書きを作りません。
3番目で1通にまとめるのは、同じ週に2回訪問するお客様のためです。 観葉植物の定期の交換と造花の季節の入れ替えが別の日になることがあり、2通に分けるとお客様が入館の申請を片方しか出さないことがあります。 1通に2つの日を箇条で書き、記号に _1 _2 の番号を付けます。
AIに処理させる
させるのは、記号の入った交換の事実と植物の説明から、案内のメールの件名と本文を作ることだけです。
| させること | 中身 |
|---|---|
| 件名を作る | 交換の日の記号と作業の種類が分かる件名 |
| 交換の日と時間帯を伝える | 記号で箇条にする。訪問が2つあれば番号の順に分ける |
| 入館の申請のお願いを書く | ビルで要る事項の名前を並べ、値は記号で置く |
| 入れ替える植物を紹介する | 品種の表の説明を、意味を変えずに案内の文に整える |
| 気になる点を挙げる | 事実の束で食い違って見える点(例:季節の入れ替えなのに品種が空) |
| させないこと | 理由 |
|---|---|
| 日付・曜日・時刻を数字で書く | 計算と値は Apps Script。数字の日付が本文にあれば検査で止める |
| 品種の表に無い育て方の助言を足す | 置き場所や水やりの注意は、会社の植物の担当が決める |
| 料金・追加の費用を書く | 契約の内容は営業の担当が扱う |
| 日を変えてよいかを請け合う | 日の変更は配送の順路しだいで、配送の担当が決める |
造花と生きた植物で、紹介の書き方を分けます。 品種の表の「造花か生きた植物か」の列を事実の束に入れ、造花なら季節の飾りの趣旨を、生きた植物なら品種の表の置き場所の注意を書かせます。造花に「日当たりのよい場所に」と書くと、お客様は本物の植物だと思って水をかけます。
2行目がいちばん起きやすい失敗です。 AIは親切に「週に1回、土の表面が乾いたら水をあげてください」と書き足します。レンタルの観葉植物は会社のスタッフが手入れするので、お客様に水やりを頼むと、水のやり過ぎで根が傷みます。 書いてよいのは品種の表の文だけです。
指示内容を固定する
あなたは観葉植物・造花のレンタル会社の業務課の担当として、
お客様に送る交換の日の案内のメールを書きます。
渡す「事実の束」だけを使って書いてください。
【書き方】
- 宛名は {{会社名}} {{担当者}} 様 と書いてください。
- 日付・曜日・時間帯は、事実の束の記号({{交換日_1}} {{時間帯_1}} など)をそのまま置いてください。
数字で日付や時刻を書かないでください。曜日も書かないでください。
- 訪問が2つ以上あるときは、番号の順に箇条を分け、箇条1には _1 の記号だけを使ってください。
- entry_items が空でないときは、「入館のお手続きのお願い」の段落を置き、
entry_items にある事項を並べ、値は {{スタッフ_1}} {{車両番号_1}} の記号で書いてください。
- plants にある植物は、description の文を意味を変えずに整えて紹介してください。
description に無いことは書かないでください。
- 作業の種類が regular のときは「定期のお手入れと交換」、seasonal のときは「季節の入れ替え」と書いてください。
- 最後に、ご都合が悪いときは返信か電話でお知らせいただくよう、一文でお願いしてください。
【書かないこと】
- 水やり・肥料・日当たりなど、description に無い育て方の助言
- 料金・追加の費用
- 「日の変更はいつでも承ります」のような請け合い
【notes】
事実の束の中で食い違って見えるもの、文面を書くのに足りないものがあれば、
notes に短く書いてください。無ければ空の配列にしてください。
【事実の束】{facts_json}
「水やりを書かない」を具体的に名指ししないと、植物の紹介の流れで必ずと言ってよいほど書かれます。 「description に無いことは書かない」だけでは、AIは水やりを一般的な常識と受け取って足します。
出力形式を固定する
Gemini API の Interactions の構造化出力で、次の形の JSON を受け取ります。 公式の説明では、/v1beta/interactions への要求で response_format に type: "text"、mime_type: "application/json" と schema を指定します。
{
"subject": "観葉植物の交換のご案内({{交換日_1}})",
"body": "{{会社名}}\n{{担当者}} 様\n\nいつもご利用いただきありがとうございます。…\n\n1. {{交換日_1}} {{時間帯_1}} 定期のお手入れと交換\n\n入館のお手続きのお願い\n・入館者:{{スタッフ_1}}\n・車両の番号:{{車両番号_1}}\n…",
"placeholders_used": ["{{会社名}}", "{{担当者}}", "{{交換日_1}}", "{{時間帯_1}}", "{{スタッフ_1}}", "{{車両番号_1}}"],
"notes": []
}
構造化出力を使う理由は、件名と本文と使った記号を別の項目で受け取り、placeholders_used を事実の束の記号と突き合わせられることです。 入館の申請の段落で {{車両番号_1}} が抜けていれば、検査で止まります。
文字数の制約は、スキーマに書いても効きません。 公式は、minLength・maxLength は制約として守られず、エラーにならずに要求の段階で外されるとしています。本文の長さは Apps Script で見ます。
入出力を保存させないため、要求に store: false を入れます。 公式は、Interactions の既定では入出力を保存し、有料の枠で55日、無料の枠で1日保持するとしています。会話を続ける機能は要らないので、保存を止めても困りません。
Apps Script の検査は次のとおりです。
| 検査 | 引っかかったとき |
|---|---|
| 事実の束の記号が本文にすべてあるか | 「要確認」 |
| 事実の束に無い記号が本文にあるか | 「要確認」 |
| 置き換えた後の本文に、事実の束に無い日付が出ていないか | 赤の「要確認」 |
| 「水」「肥料」「日光」などの言葉が、品種の表の説明に無いのに本文にある | 「要確認」(助言の書き足しの恐れ) |
notes が空でない | 「要確認」 |
| 本文が1,200字を超える | 「要確認」 |
4行目が、育て方の書き足しの網です。 品種の表の説明にある言葉を除いて、育て方に関わる言葉が本文に出たら止めます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 予定表・台帳・決まりの表・品種の表 | スプレッドシートのサービスで読む | 判定と事実の束の材料 |
| Gemini API | UrlFetchApp で Interactions を呼ぶ | 件名と本文の JSON |
| Gmail | GmailApp.createDraft() で下書き、GmailDraft.send() で送る | お客様ごとの案内 |
| 確認の一覧 | スプレッドシートのサービスで書く | 判定と検査の結果、下書きの ID、送る印 |
下書きを作ったら、その ID を確認の一覧に書きます。 公式の説明では、GmailDraft は getId() で ID を返し、send() で送れます。メニューの「印の付いた下書きを送る」は、送る印のある行の ID の下書きだけを送ります。 送った行には送った日時を書き、同じ下書きを二度送らないようにします。
送る数は1日に数十通です。 メールの宛先の数には1日の上限(個人のアカウントで100、Workspace で1,500)がありますが、この構成の数では届きません。 気をつけるのは1回の実行が6分までという上限のほうで、処理した予定に印を付け、止まったら続きから動く作りにします。Gemini API の鍵はスクリプトのプロパティに置きます。
人が確認する
- 「配送へ戻す」と「要電話」から片付ける … 休業日・時間帯に当たった予定は配送の担当へ、入館の締切に間に合わない予定はお客様へ電話します
- 「要確認」の下書きを開いて直す … 記号の抜け、日付の食い違い、育て方の書き足し、
notesのあるもの - 確認の一覧を流し見る … 引っかからなかった下書きは、お客様・交換の日・植物の名前を一覧で見ます
- 送る印を付けて、メニューから送る
3番目を省かないでください。 検査は記号と言葉を見ていますが、予定表のお客様番号そのものを入れ違えていれば、正しく置き換えた別のお客様の交換の日が届きます。 一覧でお客様と交換の日の組み合わせに見覚えがあるかを見ます。
目標は、480件をならして1件2分です。 引っかからなかった下書きは一覧で数十秒、「要確認」は数分かかります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 休業日・作業できない時間帯に当たる | 案内を作らず「配送へ戻す」。配送の担当が日を組み直す |
| 入館の申請の締切に間に合わない | 案内を作らず「要電話」 |
| ビルのコードが決まりの表に無い | 案内は作らず「ビル未登録」。決まりの表に足してから作り直す |
| 品種コードが品種の表に無い | 植物の紹介を入れずに下書きを作り、「要確認」 |
| お客様のメールアドレスが無い | 下書きを作らず「電話で案内」 |
| Gemini API がエラーを返す | 1回だけやり直し、だめなら「生成失敗」。その予定に印を付けない |
| 送った後に予定が変わった | 変わった予定の行に印を付け、担当が変更の連絡を電話かメールで送る |
| 1回の実行が6分を超えそう | 処理した予定に印を付けて終わり、続きはメニューから |
3行目を軽く見ないでください。 決まりの表に無いビルを「申請不要」と扱うと、申請の要るビルで当日に入れません。 分からないものは案内を止めます。
記録を残す
- 実行の日時、読んだ予定の数、判定で引っかかった予定と理由、作った下書きの数
- お客様ごとの事実の束(記号に置き換えた後のもの)と、Gemini が返した JSON
- 検査の結果と、下書きの ID、送る印を付けた人、送った日時
- 担当が下書きを直したかどうかと、直した箇所の種類
- 交換の当日に入れなかった訪問と、その理由(休業・入館・時間)
4つ目の直した箇所は、プロンプトと品種の表を直す材料になります。 担当が同じ品種の紹介の言い回しを毎回直しているなら、品種の表の説明の文そのものを書き直す合図です。
最後の行が、判定の規則を直す材料になります。 判定を通ったのに当日に入れなかった訪問があれば、台帳の休業日かビルの決まりの表に、足りない決まりがあります。
04実装レベルの3段階
本記事の想定は半自動化です。 判定と下書きが自動になれば、木曜と金曜の2日がかりの作業が、一覧の確認と電話に変わります。 半自動化で、1件8分が2分になります。 差が大きいのは、予定表と台帳とビルの決まりを行き来して確かめる作業と、前回のメールを写して書き換える作業が、ともに機械に移るからです。 本格構成は、返信の読み取りが入るので一段難しくなります。 「その日は会議室が使えない」のような返信から日の変更が要るかを見分け、組み直せるかを配送の担当が判断する必要があります。半自動化を半年回してから考えれば十分です。
05工数削減シミュレーション
導入後 480件 × 2分 ÷ 60 = 16 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 事務所・店舗・医院などに観葉植物や造花を貸し出し、月に数百件の交換に回っているグリーンレンタルの会社。交換の予定表を Google スプレッドシートで作り、お客様への交換の日の案内を事務の担当が1通ずつ Gmail で書いている場合。オフィスビルの入館の申請の締切や、お客様の休業日と交換の日が重なって、当日に入れなかったことがある場合。
- お客様が数十件で、交換の日を担当者が電話で伝えれば足りる会社。交換の日を案内せず、決まった曜日に回ることでお客様と合意している場合。配送の予定が専用の配送管理システムの中にあり、スプレッドシートに書き出せない場合。なお、交換の日の決め方、配送の順路、植物の枯れの原因の判断は、この構成の対象外です。
07最小構成で試す方法
- 先週の予定表から、オフィスビル・店舗・医院の予定を合わせて20件選ぶ(季節の入れ替えを数件入れる)
- それぞれについて、交換の日・時間帯・入館の申請に要る事項・植物の説明を手で書き出す(名前と日付は記号にする)
- 手元の Gemini の画面に、第7章のプロンプトと記号に置き換えた事実を1件ずつ貼る
- 返ってきた文面に数字の日付が混ざっていないか、水やりなどの助言が足されていないかを見る
- あわせて、20件の予定を台帳の休業日とビルの申請の締切で手で判定し、引っかかる予定が何件あったかを数える
確かめたいのは、文面の出来より5番目です。 20件のうち1件でも休業日や入館の締切に当たる予定があれば、案内の前に判定を置く意味がはっきりします。
| 出てきた内容 | 判断 |
|---|---|
| 記号のまま返り、少し直せば送れる | Apps Script で予定表から事実の束を作る段階に進む |
| 水やりの助言を書き足す | 書かないことを具体的に足す。構成は有効 |
| 判定で引っかかる予定が見つかった | 台帳の休業日とビルの決まりの整備を先に進める |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 休業日に交換の案内が届く | 案内の前に判定し、引っかかった予定は下書きを作らない |
| 入館の申請が間に合わない | 営業日で締切を数え、間に合わない予定は電話にする |
| 決まりの表に無いビルを申請不要と扱う | 分からないビルは「ビル未登録」で止める |
| AIが水やりの助言を書き足す | 書かないことに名指しし、育て方の言葉を検査で拾う |
| AIが日付を数字で書き直す | 記号のまま返させ、置き換えた後の日付を事実の束と照らす |
| 文字数の制約が効かない | スキーマの maxLength は外される。Apps Script で長さを見る |
| 同じ週の2回の訪問で申請が片方だけになる | 1通にまとめ、番号付きの記号で分ける |
| 同じ下書きを二度送る | 送った行に日時を書き、送る処理はその行を飛ばす |
| Gemini の既定で入出力が保存される | 要求に store: false を入れる |
| 担当個人のアカウントでトリガーを作る | 共用のアカウントで作る |
上の3行が、この構成の失敗のほとんどです。 どれも「交換の日がお客様の都合に合っているか」を、案内を書く人の注意に頼っていたところから起きます。判定を規則にして、案内より前に置けば、残りは文面の注意で足ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: お客様の会社名と担当者の名前、メールアドレス、ビルの名前と住所、休業日、交換の日、スタッフの名前と車両の番号です。スタッフの名前と車両の番号は、入館の申請のためにお客様へ伝える個人の情報です。
- AIにお客様とスタッフを特定できる情報を渡さない … 会社名・担当者・スタッフの名前・車両の番号は記号にして渡し、値は下書きを作るときに Apps Script が差し込みます
- 入出力を保存させない … Gemini API の Interactions は既定で入出力を保存するので、
store: falseを入れます - 送るのは人が印を付けたものだけ … 宛先や予定の入れ違いは、一覧の確認で拾います
- スタッフの名前は入館の申請に要る範囲で伝える … 要らないビルのお客様には、スタッフの名前と車両の番号を書きません
- 鍵とアカウントを共用で持つ … API の鍵はスクリプトのプロパティに置き、トリガーは共用のアカウントで作ります
- 利用規約を確かめる … 生成AIの製品を替えるときは、その製品の利用規約とデータの扱いを先に確かめてください
誤りが起きた場合のリスクは、お客様の都合に合わない日の案内が届くことと、別のお客様の予定が届くことの2つです。 前者は案内の前の判定で、後者は記号の置き換えの検査と一覧の確認で防ぎます。
10まず何から始めるか
1週目:ビルの決まりの表を作る
オフィスビルのお客様について、入館の申請の締切、搬入口の時間、申請に要る事項を表にします。分からないビルは、次の訪問のときにお客様に聞きます。あわせて、台帳の休業日の欄に臨時の休みを入れる決まりを作ります。
2週目:20件で試す
第8章のとおり、記号に置き換えた事実を手元の Gemini の画面に貼り、数字の日付と水やりの助言が出ないかを見ます。同じ20件を手で判定し、引っかかる予定を数えます。
3週目:判定を Apps Script で組む
休業日・時間帯・入館の締切・搬入口の時間の4つの判定を作り、先月の予定表で当てて、当日に入れなかった訪問を拾えるかを確かめます。
4週目:下書きと送る操作をつなぐ
Gemini を呼び、Gmail の下書きと確認の一覧を作り、メニューの「印の付いた下書きを送る」を足します。最初の月は担当が全件の下書きを開き、直した箇所を記録します。
2か月目以降: 当日に入れなかった訪問の理由を毎月数え、決まりの表と台帳を直します。木曜の朝に確認の一覧を開き、電話と印付けだけで翌週の案内が終わるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| インストール型のトリガーは作成した人のアカウントで実行されること。時間主導型のトリガーが毎分から月1回まで動かせること。失敗すると「Summary of failures for Apps Script」のメールが届くこと | Google for Developers: Installable triggers | 2026-10-29 |
atHour() の例が「5時〜6時の間に動く」と書かれていること。nearMinute() を指定しないと分がランダムになること | Google for Developers: ClockTriggerBuilder | 2026-10-29 |
| 1回の実行が6分まで、メールの宛先の数が個人のアカウントで1日100・Workspace で1日1,500であること | Google for Developers: Quotas for Google Services | 2026-10-29 |
GmailApp.createDraft(recipient, subject, body, options) で下書きを作れること。https://mail.google.com/ の権限が要ること | Google for Developers: Class GmailApp | 2026-10-29 |
GmailDraft の getId() で下書きの ID を取り、send() で送れること | Google for Developers: Class GmailDraft | 2026-10-29 |
onOpen で SpreadsheetApp.getUi().createMenu() からメニューを足せること。メニューを作れるのは結び付けたスクリプトだけであること | Google for Developers: Custom Menus | 2026-10-29 |
Interactions の /v1beta/interactions で response_format に type: "text"・mime_type: "application/json"・schema を指定すること。minLength・maxLength は守られず、エラーにならずに外されること | Gemini API: Structured outputs | 2026-10-29 |
Interactions は既定で入出力を保存し(store=true)、有料の枠で55日・無料の枠で1日保持すること。store=false で止められること | Gemini API: Interactions | 2026-10-29 |
入館の手続きはビルの管理会社ごとに違います。 ビルの決まりの表は、お客様とビルの管理会社に確かめて作ってください。本記事は公開されている仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2299)についてのご相談はこちらから。
