音楽教室が体験レッスンの申込を Make で受け、AI で希望の楽器・経験・曜日から講師の候補を絞って案内のメールを作る
音楽教室に届く体験レッスンの申込を Make で受け、自由記述から楽器・年齢層・経験・目的を分類します。区分で講師を絞り、講師の予定の空きから日時の候補を出して、案内のメールを下書きします。
- 生成AI
- ChatGPT/Claude
- 連携・自動化
- Make/n8n/Power Automate/Zapier
- 対象業界
- 小売/教育
- 対象部門
- 営業
- 対象業務
- 分類・仕分け/問い合わせ対応
- 主な課題
- 人手が足りない/問い合わせが多い/属人化している
- AIで行う処理
- 分類
- 主な効果
- 対応スピード向上/工数削減/機会損失防止
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- ノーコード連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 事務がフォームの回答のシートを開き、申込を読む
- 楽器・年齢層・経験・目的から、担当できそうな講師を講師の一覧で探す
- 候補の講師のカレンダーを一人ずつ開き、希望の曜日と時間帯の空きを探す
- 迷うときは講師に電話やチャットで「この方を担当できるか」を尋ねる
- 候補の日時を2〜3つ選んで案内のメールを書き、送る
- 返事が来たら講師のカレンダーに体験の予定を入れ、体験の記録のシートに書く
- 自動フォームの新しい回答をきっかけに、Make のシナリオが動く
- 自動体験の記録のシートを引き、同じ申込をすでに扱っていれば止める
- 自動OpenAI API が、申込の選択式の欄と自由記述から、楽器・年齢層・経験・目的を決まった区分に分類する
- 自動区分と教室と希望の曜日で、講師の一覧から担当できる講師を絞り込む
- 自動絞り込んだ講師のカレンダーの空き(Free/Busy)を引き、希望の時間帯に体験の枠が取れる日時を候補にする
- 自動候補を3つまで選び、OpenAI API が候補だけを使って案内のメールを下書きする
- 自動下書きの日時が渡した候補と一致するかを確かめ、ルーターで下書きか担当の確認に分ける
- 人事務が下書きを確かめて送る
- 【人/自動】 返事が来たら、事務が日時を選び、講師のカレンダーに体験の予定を入れる
各工程の詳しい説明を読む
- 事務がフォームの回答のシートを開き、申込を読む
- 楽器・年齢層・経験・目的から、担当できそうな講師を講師の一覧で探す
- 候補の講師のカレンダーを一人ずつ開き、希望の曜日と時間帯の空きを探す
- 迷うときは講師に電話やチャットで「この方を担当できるか」を尋ねる
- 候補の日時を2〜3つ選んで案内のメールを書き、送る
- 返事が来たら講師のカレンダーに体験の予定を入れ、体験の記録のシートに書く
(a)講師の予定を一人ずつ確かめている。 ピアノの申込なら、候補の講師が6名いることもあります。6名のカレンダーを開いて希望の曜日の空きを探すだけで、数分かかります。
(b)講師の選び方が受付の経験に頼っている。 「幼児のピアノはこの先生」「受験の相談ならこの先生」は、長く勤める事務が覚えていることです。新しい事務は講師に尋ねるしかなく、その返事を待つ間、案内が止まります。
(c)案内までに数日かかる。 申込は夜と週末に多く、事務が見るのは翌営業日です。講師への確認が入ると、さらに1〜2日かかります。 近くのほかの教室にも申し込んでいる家庭は、先に返事をくれた教室で体験を受けます。
(d)選択式の欄と自由記述が食い違う。 経験の欄で「はじめて」を選び、自由記述に「子どものころ5年ほど習っていた」と書く人がいます。選択式の欄だけで講師を選ぶと、初心者向けの講師に経験者が回ります。
- 【自動】 フォームの新しい回答をきっかけに、Make のシナリオが動く
- 【自動】 体験の記録のシートを引き、同じ申込をすでに扱っていれば止める
- 【自動】 OpenAI API が、申込の選択式の欄と自由記述から、楽器・年齢層・経験・目的を決まった区分に分類する
- 【自動】 区分と教室と希望の曜日で、講師の一覧から担当できる講師を絞り込む
- 【自動】 絞り込んだ講師のカレンダーの空き(Free/Busy)を引き、希望の時間帯に体験の枠が取れる日時を候補にする
- 【自動】 候補を3つまで選び、OpenAI API が候補だけを使って案内のメールを下書きする
- 【自動】 下書きの日時が渡した候補と一致するかを確かめ、ルーターで下書きか担当の確認に分ける
- 【人】 事務が下書きを確かめて送る
- 【人/自動】 返事が来たら、事務が日時を選び、講師のカレンダーに体験の予定を入れる
4番目と5番目をAIの外に置くのが、この設計の分かれ目です。 AIが返すのは区分のコードだけで、講師を選ぶのは講師の一覧の列との一致、空きを決めるのはカレンダーの予定です。 講師が担当を変えたら、直すのは一覧の行だけです。
3番目で分類と案内の作成を分けるのも、意図してのことです。 1回の呼び出しで分類と案内を両方させると、分類が決まる前に候補の日時まで考え出してしまいます。 分類→絞り込み→候補→案内の順を、呼び出しの分け方で守らせます。
02今回想定するシステム構成
体験レッスンの申込(自社サイトの Google フォーム) ▼【トリガー】Google Forms:Watch Responses Make のシナリオ ├──▶ Google Sheets:Search Rows(体験の記録・講師の一覧) ├──▶ OpenAI(Generate a response、JSON schema):楽器・年齢層・経験・目的の分類 ├──▶ 講師の絞り込み(区分・教室・曜日の一致) ├──▶ Google Calendar:Get Free/Busy Information(候補の講師の空き) ├──▶ 候補の日時を3つまで選ぶ ├──▶ OpenAI(Generate a response、JSON schema):候補だけを使った案内の下書き ├──▶ Router │ ├ 担当の確認(区分が決まらない・講師がいない・候補がない) → 事務へ通知 │ ├ 日時が候補と一致しない → 事務へ通知 │ ├ 通常 → Gmail:Create a draft email │ └ フォールバック → 事務へ └──▶ Google Sheets:Add a Row(体験の記録)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | Make(シナリオ。Google Forms、Google Sheets、Google Calendar、Gmail、ルーター) | Zapier、n8n、Power Automate |
| 生成AI | OpenAI API(Responses API、構造化出力) | Claude API |
| 保管 | Google スプレッドシート(講師の一覧・区分の一覧・体験の記録) | Airtable |
| 予定表 | Google カレンダー(講師ごとのレッスンの予定) | Microsoft Outlook の予定表 |
新しく足すのは、シナリオと、講師の一覧に足す区分の列と、区分の一覧のシートだけです。 フォーム、講師のカレンダー、代表アドレスはそのまま使います。この構成が書き込むのは、体験の記録と Gmail の下書きだけで、講師のカレンダーには書き込みません。
分類と案内は、Make の OpenAI のアプリの Generate a response で行います。 公式のページでは、このモジュールに Output Format として Text・JSON schema・JSON object を選ぶ欄があり、JSON object を選ぶときはプロンプトに json という語を含める必要があるとされています。この構成では JSON schema を選びます。同じモジュールの Store は、生成した応答を後から API で取り出せるように保存するかの設定で、既定は Yes です。 申込の内容を OpenAI の側に残さないために、No にします。
講師の空きは、Google Calendar のアプリの Get Free/Busy Information で引きます。 Google Calendar API の freeBusy は、カレンダーごとに予定の入っている時間帯(busy の開始と終了)だけを返し、予定の件名や中身は返しません。 講師の予定の中身をシナリオに通さずに、空いているかだけを知る方法として向いています。
03どうやって実装するのか
処理の起点を決める
フォームの新しい回答を起点にします。 Make の Google Forms のアプリの Watch Responses で、体験の申込のフォームを見張ります。実行の間隔は15分にします。 申込は夜と週末に多いので、事務が出勤したときには案内の下書きがそろっている状態にします。
日程の変更の連絡は、別の入口にします。 代表アドレスに届く返信は、Gmail の Watch emails で「体験の返信」のラベルを見張り、体験の記録の行に紐づけて事務に知らせるだけにします。 変更の連絡からもう一度候補を作るのは、事務が記録の行の状態を「再案内」に変えたときだけです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 申込 | 楽器(選択式)、生徒の学年または「大人」、経験(選択式)、希望の教室、希望の曜日と時間帯、自由記述、申込者の名前とメールアドレス | フォームの回答 |
| 区分の一覧 | 楽器のコード、年齢層のコード(幼児・小学生・中高生・大人)、経験のコード(はじめて・経験あり・再開)、目的のコード(趣味・発表会・受験・弾き語りなど) | 区分の一覧のシート |
| 講師の一覧 | 講師のコード、担当する楽器・年齢層・経験・目的のコード、教室と曜日、体験の枠の長さ、カレンダーのID、今月の体験の担当数 | 講師の一覧のシート |
| 講師の空き | 講師ごとの予定の入っている時間帯 | Google カレンダー(Free/Busy) |
質を決めるのは、講師の一覧の区分の列です。 「幼児のピアノを持つか」「受験の指導をするか」を、講師ごとに1つずつ「はい/いいえ」で埋めます。 ここが空いている講師は、絞り込みで一度も候補に上がりません。最初は、長く勤める事務の頭の中にある「この先生はこれを持つ」を書き出す作業になります。
今月の体験の担当数は、候補を選ぶ順に使います。 同じ講師ばかりに体験が回ると、その講師の週の予定が体験で埋まり、在籍の生徒のレッスンの振替が取れなくなります。 担当数の少ない講師から候補に並べます。
データの取得方法を決める
| 取るもの | どこから | どうやって |
|---|---|---|
| 申込 | フォーム | Watch Responses(新しい回答) |
| 区分の一覧・講師の一覧 | スプレッドシート | Search Rows(全件を読む) |
| 講師の空き | 講師のカレンダー | Get Free/Busy Information(候補の講師のカレンダーIDと、今日から14日間) |
| これまでの申込 | 体験の記録のシート | Search Rows(メールアドレス) |
Free/Busy の問い合わせには、時刻の幅とタイムゾーンを必ず入れます。 Google Calendar API の公式のページでは、timeZone は応答に使うタイムゾーンで、省略すると UTC になるとされています。日本時間の夕方のレッスンが UTC の朝の時刻として返り、希望の時間帯と比べる段で9時間ずれます。 timeZone に Asia/Tokyo を入れ、timeMin と timeMax も +09:00 を付けた形で渡します。
一度に問い合わせるカレンダーの数には上限があります。 公式のページでは、calendarExpansionMax(情報を返すカレンダーの数の上限)の最大は50です。この教室の講師18名なら1回で足りますが、絞り込みの後の講師だけを問い合わせる形にしておけば、講師が増えても変わりません。
AIへ渡す前に整形する
- 重複の確認 … 送信の時刻とメールアドレスで体験の記録を引き、記録があれば止めます
- 選択式の欄をコードにする … 楽器と経験の選択肢を、区分の一覧のコードに置き換えてから渡します
- 学年を年齢層に直す … 学年の欄から幼児・小学生・中高生・大人を、ワークフローの対応表で決めます。AIに年齢を推し量らせません
- AIに渡す範囲を絞る … 申込者と生徒の名前、メールアドレスは渡しません。分類に要るのは、選択式の欄のコードと自由記述と年齢層だけです
- 希望の曜日と時間帯を時刻の幅にする … 「平日の夕方」を、教室の決まりで「月〜金の16時〜19時」のような幅に直します
3番目をワークフローに置くのは、生徒の多くが子どもだからです。 学年の欄は保護者が選ぶので、その値を対応表で年齢層に直すほうが、自由記述から推し量るより確かです。 自由記述に「小3の息子」とあり、学年の欄が「小学4年」なら、学年の欄を使い、食い違いの印を付けます。
4番目で名前を渡さないのは、分類に名前は要らないからです。 案内のメールの宛名は、下書きを作るときにワークフローが差し込みます。
AIに処理させる
1回目の呼び出しでさせるのは、区分の一覧のコードから選ぶことだけです。
| 項目 | させること | 判断できないときの扱い |
|---|---|---|
| 楽器 | 区分の一覧の楽器のコードから1つ | 「まだ決めていない」「2つで迷う」は undecided、一覧に無い楽器は not_offered |
| 経験 | beginner(はじめて)/experienced(経験あり)/returning(以前習っていて再開) | 自由記述が選択式の欄と食い違えば、自由記述を採って conflict に印 |
| 目的 | 区分の一覧の目的のコードから(複数可) | 書かれていなければ空 |
| 特別な相談 | 受験・発達の特性への配慮・楽器の購入の相談など、講師の割り当て前に事務が見るべきこと | 文のとおりに写す |
| 根拠 | 区分を決めた自由記述の文 | 文が無ければ空 |
returning を experienced と分けるのは、担当できる講師が違うからです。 子どものころに習っていて20年ぶりに再開する大人は、楽譜は読めても指が動かないことが多く、大人の初心者を持つ講師のほうが合うことがあります。どちらを担当させるかは講師の一覧の列で決めますが、分類の段で分けておかないと、選べません。
2回目の呼び出しでさせるのは、渡した候補だけを使って案内を書くことです。 候補の日時、教室の住所、持ち物、体験の長さは、ワークフローが表にして渡します。
| させないこと | 理由 |
|---|---|
| 講師を選ぶ | 講師の一覧の列との一致で決める |
| 日時を考え出す | Free/Busy の空きから選んだ候補だけを使う |
| 年齢を推し量る | 学年の欄から対応表で決める |
| 入会や月謝の割引を約束する | 教室の判断 |
| 生徒の才能や向き不向きを書く | 体験の前に書けることではない |
指示内容を固定する
1回目(分類):
あなたは音楽教室の事務として、体験レッスンの申込を分類します。
下に渡す区分の一覧のコードから選んでください。一覧に無いコードを
作らないでください。講師や日時は決めないでください。
【すること】
1. instrument:楽器のコードを1つ選ぶ。決めていない・2つで迷っている
ときは undecided、一覧に無い楽器は not_offered。
2. experience:beginner/experienced/returning から選ぶ。
選択式の欄と自由記述が食い違うときは、自由記述を採り、
conflict を true にする。
3. purposes:目的のコードを、書かれているものだけ選ぶ。
4. special_requests:受験、配慮の相談、楽器の購入の相談など、
講師を決める前に事務が見るべきことを、文のとおりに写す。
5. evidence:区分を決めた自由記述の文を、そのまま写す。
【厳守事項】
- 年齢層は渡した値をそのまま使う。自由記述から年齢を推し量らない。
- 書かれていない目的を足さない。「楽しく」だけなら purposes は
hobby だけにする。
- 生徒の才能、向き不向き、上達の見込みを書かない。
- 講師の名前、日時、月謝を書かない。
【区分の一覧】{categories}
【年齢層(対応表で決めた値)】{age_band}
【選択式の欄(コード)】{selected}
【自由記述】{free_text}
2回目(案内):
あなたは音楽教室の事務として、体験レッスンの案内のメールを書きます。
下に渡す「候補の日時」だけを使ってください。候補に無い日時、
講師、教室を書かないでください。
【書くこと】申込のお礼/候補の日時(渡した順に、講師の名前と教室を
添えて)/体験の長さと持ち物/都合のよい候補を返信で知らせてほしいこと/
どの候補も合わないときは希望の曜日を知らせてほしいこと
【厳守事項】
- 候補の日時は、渡した文字列をそのまま写す。曜日を書き直さない。
- 入会、月謝、割引について書かない。
- 宛名は {recipient} と書き、名前を入れない。
【候補の日時】{slots}
【教室の情報(住所・持ち物・体験の長さ)】{school_info}
【申込の区分】{classification}
「一覧に無いコードを作らない」を書くのは、楽器の名前がそのまま返るのを防ぐためです。 「エレキギター」と書かれた申込に、guitar ではなく electric_guitar を返すと、講師の一覧のどの列とも一致せず、候補の講師が0人になります。 スキーマの enum で値を縛ったうえで、指示でも縛ります。
「候補の日時は文字列をそのまま写す」は、照合のための1行です。 AIは「11月18日(火)17:00」を「11月18日(火曜日)午後5時」に整えます。整えられると、ワークフローの文字の照合を通らず、すべてが事務の確認に回ります。
出力形式を固定する
1回目は次の形の JSON を返させます。
{
"instrument": "piano | violin | guitar | vocal | drums | flute | sax | ukulele | undecided | not_offered",
"experience": "beginner | experienced | returning",
"conflict": false,
"purposes": ["hobby"],
"special_requests": "",
"evidence": ""
}
2回目は、body(本文)と slots_used(使った候補の文字列の配列)を返させます。 slots_used の各要素が、渡した候補の文字列と一致するかをワークフローが確かめ、本文の中にその文字列が含まれるかも確かめます。
構造化出力にする1つ目の理由は、講師の一覧の列とそのまま突き合わせられることです。 instrument と experience は区分の一覧のコードなので、講師の一覧の列の値と文字で比べるだけで絞り込めます。 OpenAI の構造化出力は、スキーマに合う応答を返す機能で、strict を true にして使います。
2つ目は、値の無い項目の扱いを決めておけることです。 公式のページでは、構造化出力ではすべての項目を required にする必要があり、省略してよい項目は null との組み合わせの型で表すとされています。special_requests は空文字で返させ、欄そのものが返らないことで後段が止まる形にしません。 オブジェクトには additionalProperties: false を付けます。
3つ目は、拒否を見分けられることです。 公式のページでは、安全上の理由で応答を拒んだことをプログラムで見分けられるとされています。拒否が返ったときは分類を使わず、事務の確認に回します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 申込のフォーム | Google Forms の Watch Responses | 申込を受ける |
| 講師の一覧・区分の一覧 | Google Sheets の Search Rows | 区分と講師を引く(読むだけ) |
| 講師のカレンダー | Google Calendar の Get Free/Busy Information | 空きだけを引く(読むだけ) |
| OpenAI API | OpenAI の Generate a response(JSON schema、Store は No) | 分類と案内の下書き |
| Gmail | Create a draft email | 案内の下書きを置く |
| 体験の記録 | Google Sheets の Add a Row/Update a Row | 申込・区分・候補・送った案内の記録 |
ルーターのルートは、担当の確認→日時の不一致→通常→フォールバックの順に並べます。 公式のページでは、ルートは同時ではなく1本ずつ順に処理され、どの条件にも当たらないデータをフォールバックのルートが処理するとされています。担当の確認に回すのは、undecided・not_offered・special_requests があるもの、絞り込みで講師が0人のもの、14日間に候補が1つも無いものです。
この構成は案内を自動では送りません。 体験の案内は、教室と家庭の最初のやり取りです。下書きを事務が見て送る形にし、送るのは人にします。
人が確認する
事務が確かめるのは、下書きの全件と、担当の確認に回ったものです。
- 担当の確認に回ったものを先に見る … 楽器が未定の家庭には、電話で楽器選びの相談を勧めます。受験や配慮の相談は、主任の講師に回します
- 下書きの区分と候補を見る … 区分の根拠の文を読み、候補の講師がその区分に合うかを見ます
conflictの印を見る … 選択式の欄と自由記述が食い違った申込は、採った区分が正しいかを根拠の文で確かめます- 送る … Gmail の画面から送り、体験の記録の状態を「案内済み」にします
返事で日時が決まったら、講師のカレンダーへの予定の登録は事務が行います。 返事が来るまでの間に、候補の時間に講師の別の予定が入ることがあるからです。登録の前に、その講師の空きをもう一度確かめます。
例外に対処する
| 起きること | 対応 |
|---|---|
楽器が undecided | 候補を作らず、楽器選びの相談の案内を事務が送る |
楽器が not_offered | 候補を作らず、教室で扱う楽器を事務が案内する |
| 絞り込みで講師が0人 | 区分の一覧と講師の一覧の列の抜けを疑い、事務へ |
| 14日間に候補が無い | 希望の曜日を広げる問いを入れた下書きにし、事務へ |
| Free/Busy で講師のカレンダーにエラーが返る | その講師を候補から外し、ほかの講師で候補を作る。外したことを記録 |
| 兄弟姉妹で2人分の申込 | 生徒ごとに分類し、同じ日の続きの時間を優先して候補にする |
| 日時が候補と一致しない | 下書きを置かず、事務へ |
| OpenAI API が応答しない | 体験の記録に「未処理」と書き、次の実行で拾い直す |
上の3行が大半を占めます。 どれもAIの誤りではなく、フォームの選択肢と講師の一覧の列の作り方の問題です。 講師が0人になる申込が続く区分は、講師の一覧のその列がまだ埋まっていません。
Free/Busy の応答には、カレンダーごとにエラーが入ることがあります。 公式のページでは、カレンダーの情報を作れなかったときに errors が返り、notFound などの理由が付くとされています。エラーの講師を「空いている」と読まないように、busy が空でも errors があれば候補から外します。
記録を残す
- 申込の元の回答(選択式の欄と自由記述)
- 1回目の JSON の全文(区分・
conflict・根拠) - 絞り込みに使った講師の一覧の版と、絞り込みの結果の講師
- Free/Busy を引いた日時と、候補にした日時
- 2回目の JSON と、日時の照合の結果
- 事務が区分や候補を直した記録と、送った案内の本文
3つ目で講師の一覧の版を残すのは、講師の担当が学期ごとに変わるからです。 「先月は幼児のピアノにこの先生を案内された」と言われたとき、そのときの一覧で選ばれたことが分かります。
最後の行は、区分の一覧を直す材料になります。 事務が同じ区分を何度も直しているなら、区分の分け方か選択式の欄の選択肢が、申込の書き方に合っていません。
04実装レベルの3段階
最小構成では件数がさばけません。 月120件を1件ずつ貼るのは続きません。区分で講師を絞り込めるかを確かめるための段階です。 半自動化で、1件15分が5分になり、この段階が本記事の想定です。 講師探しと予定探しが自動になり、人に残るのは、下書きの確認と、楽器が未定の家庭や受験の相談への対応です。 本格構成で講師のカレンダーに書き込むのは、半自動化を学期1つ分回してからにします。 書き込みを足すと、読み違えた返事が講師の予定を押さえてしまいます。
05工数削減シミュレーション
導入後 120件 × 5分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 複数の楽器のコースと十数名以上の講師を持ち、体験レッスンの申込が Web のフォームで月に百件前後届く音楽教室・楽器店の教室。講師ごとに担当できる楽器・年齢層・曜日が違い、受付が講師の予定を一人ずつ確かめて候補の日時を返しているため、申込から案内までに数日かかっている場合。
- 講師が数名で、楽器も1〜2種類に限られ、受付が講師の予定を覚えていられる教室。講師の予定が紙の手帳にしかなく、カレンダーで共有されていない場合(先に予定の共有が要ります)。体験レッスンを予約サイトで枠ごとに売っていて、申込の時点で日時が決まっている場合。なお、入会の勧め方、月謝の割引、講師の配置の最終判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の申込から30件を選ぶ(楽器が未定、再開の大人、兄弟姉妹、選択式と自由記述の食い違いを混ぜる)
- 30件について、事務が当時どの講師を案内したかを書き出す
- 区分の一覧と第7章の1回目の指示を、手元の ChatGPT の画面に貼る
- 30件の選択式の欄と自由記述を1件ずつ貼り、区分を書かせる(名前は貼らない)
- 区分を講師の一覧に当て、当時の講師が候補に含まれるかを見る
30件は必ずやってください。 シナリオを組む前に、区分だけで当時と同じ講師に絞り込めるかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時の講師が候補に含まれた | シナリオの組み立てに進む |
| 区分は合っているのに講師が候補に入らない | 講師の一覧の列が先。 AIの問題ではない |
returning と experienced が入れ替わる | 指示に例を足す。構成は有効 |
2行目が出ることは珍しくありません。 失敗ではなく、事務が覚えていた講師の選び方が、一覧にまだ書かれていないということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 楽器の名前がそのまま返り、講師が0人になる | enum と指示の両方でコードに縛る |
| 夕方の空きが9時間ずれる | Free/Busy に timeZone を入れ、時刻に +09:00 を付ける |
| エラーの講師を空いていると読む | errors があれば候補から外す |
| 案内に候補に無い日時が入る | 文字列の照合で止め、事務へ |
| 同じ講師ばかりに体験が回る | 今月の担当数の少ない順に候補を並べる |
returning が experienced に混ざる | 例を指示に足す。講師の一覧の列も分ける |
| 選択式の欄だけで分類する | 自由記述を採り、食い違いに印を付ける |
| 申込の内容が OpenAI の側に残る | Generate a response の Store を No にする |
| 返事を待つ間に候補の時間が埋まる | 登録の前に空きを確かめ直す |
| 子どもの名前がAIに渡る | 名前は渡さず、宛名は後で差し込む |
上の2行が、この構成の失敗のほとんどです。 前者は分類と講師の一覧の言葉の不一致、後者は時刻の表し方の不一致で、どちらも案内が出ない・ずれた候補が出るという形で表れます。
3行目も見落としやすい点です。 Free/Busy は予定が無いカレンダーにも、読めなかったカレンダーにも、busy を空で返しうるからです。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 申込者(保護者)と生徒の名前、メールアドレス、生徒の学年、経験と目的の自由記述、講師の予定の空きです。生徒の多くは子どもです。
- AIに渡すのは区分に要るものだけにする … 選択式の欄のコード、年齢層、自由記述です。名前とメールアドレスは渡しません。 自由記述に子どもの名前が書かれていることがあるので、名前らしき文字を伏せる前処理も検討してください
- 生成AIの選び方で、利用者の年齢の決まりを確かめる … 生成AIのサービスには、18歳未満が使うサービスへの組み込みを規約で制限しているものがあります。この構成は事務だけが使い、子どもが直接触れる画面はありませんが、製品を替えるときは規約を確かめてください
- 講師の予定の中身をシナリオに通さない … Free/Busy は空きだけを返します。講師の私用の予定の件名が、申込の処理に流れることはありません
- 生徒の才能や向き不向きを書かせない … 体験の前の案内に書くことではなく、保護者に誤った期待や不安を持たせます
- 入会の勧誘や月謝の約束を自動の文に入れない … 送るのは人で、条件の約束は教室が決めます
誤りが起きた場合のリスクは、区分に合わない講師を案内することと、空いていない日時を案内することの2つです。 前者は区分のコードと講師の一覧の一致で、後者はタイムゾーンとエラーの扱いで防ぎます。どちらもAIの賢さではなく、ワークフローの照合で守ります。
10まず何から始めるか
1週目:講師の一覧に区分の列を足す
講師18名の担当の範囲を、楽器・年齢層・経験・目的・教室・曜日の列で埋めます。長く勤める事務と主任の講師で、「この先生はこれを持つ」を書き出します。
2週目:30件で試す
先月の申込から30件を選び、手元の ChatGPT の画面で区分を書かせます。区分を講師の一覧に当て、当時の講師が候補に含まれるかを最優先で見ます。
3週目:区分の一覧とフォームを合わせる
フォームの選択肢と区分の一覧のコードを1対1にそろえます。学年から年齢層への対応表も作ります。 経験の選択肢に「以前習っていて再開」を足します。
4週目:申込から下書きまでをつなぐ
Make で申込を受け、分類し、講師を絞り、Free/Busy で候補を出して下書きを置くところまで作ります。timeZone が Asia/Tokyo になっているかを、夕方の枠で確かめます。
2か月目: 下書きを事務が直した件数を毎週数え、区分の一覧と講師の一覧を直します。3か月目以降: 1件15分が何分になったかを実測し、新しい事務だけで1週間の申込を案内できたら、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Google Forms のアプリに Watch Responses・List Responses・Get a Response などがあること | Make: Google Forms | 2026-10-15 |
| Google Calendar のアプリに Search Events・Create an Event・Get Free/Busy Information などがあること | Make: Google Calendar | 2026-10-15 |
| Google Sheets のアプリに Search Rows・Add a Row・Update a Row などがあること | Make: Google Sheets modules | 2026-10-15 |
| Gmail のアプリに Watch emails・Create a draft email があること。Watch emails がラベルを見張れること | Make: Gmail modules | 2026-10-15 |
| ルーターのルートが同時ではなく1本ずつ順に処理され、どの条件にも当たらないデータをフォールバックのルートが処理すること | Make: Router | 2026-10-15 |
| OpenAI のアプリの Generate a response に Output Format(Text・JSON schema・JSON object)があり、JSON object ではプロンプトに json の語が要ること。Store の既定が Yes であること | Make: OpenAI modules | 2026-10-15 |
構造化出力ではすべての項目を required にする必要があり、省略してよい項目は null との組み合わせの型で表すこと。オブジェクトに additionalProperties: false を付けること。安全上の拒否をプログラムで見分けられること | OpenAI: Structured model outputs | 2026-10-15 |
freeBusy がカレンダーごとの busy(開始と終了)を返すこと。timeZone の既定が UTC であること。calendarExpansionMax の最大が50であること。カレンダーごとに errors(notFound など)が返りうること | Google Calendar API: Freebusy: query | 2026-10-15 |
講師の配置、入会の案内、月謝の扱いは、教室の判断で決めてください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1727)についてのご相談はこちらから。
