ホテルの予約データと過去の喫食の実績から翌日の朝食の人数を見込み、食材の発注量と仕込みの量の案を調理の担当に届ける
宿泊予約の翌日分のデータと、朝食会場で数えた過去の喫食の人数から、翌朝の朝食の人数を幅で見込みます。団体の手配書や予約の備考に書かれた朝食の変更を反映し、品目ごとの食材の発注量と前日の仕込みの量の案を調理の担当に届けます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate/Python
- 対象業界
- 宿泊/飲食
- 対象部門
- 購買
- 対象業務
- 書類作成/集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 毎日15時ごろ、調理の責任者が宿泊予約システムで翌日の朝食付きの人数を確かめる
- 団体の予約があれば、営業から届いた手配書を開き、朝食の時間と形を確かめる
- 個人の予約の備考を一覧で流し見て、朝食に関わる書き込みを拾う
- 曜日と客層から「今日は8割くらい来る」と見込み、人数を決める
- 品目ごとに、見込んだ人数から発注量と仕込みの量を計算する
- 仕入先に発注し、調理の担当に仕込みの量を伝える
- 夜に団体の人数の変更が入ると、夜勤のフロントから連絡を受けて量を直す
- 人毎日14時半に、フロントの担当が翌日の予約データを宿泊予約システムから書き出し、決まったフォルダに置く
- 自動15時、スクリプトがCSVを読み、館ごとに朝食付きの人数を客層・プラン別に数える
- 自動直近8週の同じ曜日・同じ客層の喫食率から、翌朝の来場の人数を下限・中央・上限で計算する
- 自動団体の手配書の朝食の欄と、朝食に関わる語を含む予約の備考を Gemini API に渡し、朝食の変更を読み取らせる
- 自動読み取った変更(弁当への切り替え、朝食なし、時間の変更、アレルギー)を人数に反映する
- 自動品目ごとの1人あたりの使用量と在庫から、発注量と仕込みの量の案を計算する
- 自動Gemini API に、案の根拠と確かめる点を調理の担当向けの文面にさせ、シートとメールで届ける
- 人調理の責任者が案を確かめ、量を直して発注し、仕込みを指示する
- 自動20時、予約データの書き出しがもう一度あれば、人数が1割以上動いた館だけ知らせる
各工程の詳しい説明を読む
- 毎日15時ごろ、調理の責任者が宿泊予約システムで翌日の朝食付きの人数を確かめる
- 団体の予約があれば、営業から届いた手配書を開き、朝食の時間と形を確かめる
- 個人の予約の備考を一覧で流し見て、朝食に関わる書き込みを拾う
- 曜日と客層から「今日は8割くらい来る」と見込み、人数を決める
- 品目ごとに、見込んだ人数から発注量と仕込みの量を計算する
- 仕入先に発注し、調理の担当に仕込みの量を伝える
- 夜に団体の人数の変更が入ると、夜勤のフロントから連絡を受けて量を直す
(a)見込みの根拠が責任者の頭の中にある。 「8割」は長年の経験から出た数字で、当たることも多いのですが、責任者が休みの日は代わりの担当者が決められません。 代わりの担当者は欠品を恐れて多めに見込み、その日の廃棄が増えます。
(b)団体の朝食の変更が埋もれる。 手配書は営業が作る文書で、朝食の記載は何ページ目かの備考の欄にあります。「2日目の朝食は弁当に変更」を見落とすと、会場の分と弁当の分の両方を仕込むか、どちらも足りないかになります。
(c)備考の書き込みを拾い切れない。 1館で毎日100件を超える予約の備考を流し見ると、「朝食不要」と「朝食券は2名分のみ」の区別がつかないまま人数に入ります。 アレルギーの書き込みは、調理の担当に伝わらないことがあります。
(d)3館で見込み方がばらばら。 館ごとに責任者の流儀があり、同じ客層の日でも見込みの割合が違います。本社の購買から見ると、どの館の廃棄が見込みの外れから来ているのかが分かりません。
- 【人】 毎日14時半に、フロントの担当が翌日の予約データを宿泊予約システムから書き出し、決まったフォルダに置く
- 【自動】 15時、スクリプトがCSVを読み、館ごとに朝食付きの人数を客層・プラン別に数える
- 【自動】 直近8週の同じ曜日・同じ客層の喫食率から、翌朝の来場の人数を下限・中央・上限で計算する
- 【自動】 団体の手配書の朝食の欄と、朝食に関わる語を含む予約の備考を Gemini API に渡し、朝食の変更を読み取らせる
- 【自動】 読み取った変更(弁当への切り替え、朝食なし、時間の変更、アレルギー)を人数に反映する
- 【自動】 品目ごとの1人あたりの使用量と在庫から、発注量と仕込みの量の案を計算する
- 【自動】 Gemini API に、案の根拠と確かめる点を調理の担当向けの文面にさせ、シートとメールで届ける
- 【人】 調理の責任者が案を確かめ、量を直して発注し、仕込みを指示する
- 【自動】 20時、予約データの書き出しがもう一度あれば、人数が1割以上動いた館だけ知らせる
8番目が人の仕事として残る部分です。 翌日の地元の行事や、会場の席の数、仕入先の欠品は、責任者しか知りません。案は経験の代わりではなく、経験の出発点をそろえるものです。
3番目を式で決めているのは、根拠を説明できるようにするためです。 「直近8週の火曜のビジネス客は、朝食付きの人数の71%から78%が来た」と書けば、代わりの担当者でも同じ見込みを立てられます。AIに人数を当てさせると、その説明ができません。
02今回想定するシステム構成
宿泊予約システム ── 翌日の予約データ(CSV) ▼ 決まったフォルダに置く 【トリガー】時間主導型(毎日15時、20時) Google Apps Script ├──▶ 館ごと・客層ごとの朝食付きの人数の集計 ├──▶ 直近8週の喫食率から来場の人数の幅を計算 ▼ Gemini API(有料の枠、構造化出力) │ ① 団体の手配書・予約の備考から朝食の変更を読み取る ▼ Google Apps Script ── 変更を人数に反映、品目ごとの発注量と仕込みの量を計算 ▼ Gemini API ── 調理の担当向けの案の文面(根拠と確かめる点) ▼ Google Apps Script ── 案のシート、調理の責任者へのメール ▼ 【調理の責任者が確かめて発注し、仕込みを指示する】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make、Python |
| 生成AI | Gemini API(有料の枠、構造化出力) | Claude API、OpenAI API |
| シート | Google スプレッドシート(喫食の記録・品目の設定・在庫・案の一覧) | Microsoft 365 のブック |
| メール | Gmail(調理の責任者への案の送付) | Outlook |
新しく足すのは、スクリプトと Gemini API の契約、品目の設定のシートです。 宿泊予約システムには書き込みません。仕入先への発注も、この構成からは出しません。
土台になるのは、Google Apps Script の時間主導型のトリガーです。 毎分から毎月までの間隔で関数を動かせますが、決まった時刻を指定しても、その時刻から1時間の間のどこかで動くことがあるとされています。15時ちょうどに動く前提にせず、14時台に置いたトリガーが、CSVが置かれるまで待つ作りにします。インストール型トリガーは作成した人のアカウントで実行されるので、料飲部の共有のアカウントで作ります。
スクリプトの実行時間には上限があります。 1回の実行は6分まで、トリガーの合計の実行時間は Google Workspace のアカウントで1日6時間、外部へのURLの呼び出しは1日100,000回までとされています。館ごとに区切って動かせば、1館分は1回の実行に収まります。
CSVは Utilities の parseCsv で2次元の配列にします。 調理の責任者へのメールは MailApp の sendEmail で送り、htmlBody に案の表を入れます。
Gemini API は有料の枠で使います。 規約では、有料のサービスではプロンプトと応答を製品の改善に使わないとされ、無料のサービスには機密や個人の情報を送らないよう書かれています。 予約の備考には宿泊客の事情が書かれるので、無料の枠では使いません。
構造化出力は、いまの公式の書き方に合わせます。 /v1beta/interactions に response_format を付け、mime_type を application/json、schema にJSONスキーマを入れます。区分は enum で列挙し、人数には minimum を付けます。値の正しさはアプリケーションで確かめるよう公式にも書かれているので、返ってきた人数は予約データと照らします。
03どうやって実装するのか
処理の起点を決める
時間主導型のトリガーを、毎日14時台に1つ置きます。 動いたら決まったフォルダを見て、翌日の日付の名前のCSVがあれば処理を始めます。無ければ10分後に置き直したトリガーで見直し、15時半を過ぎても無ければ、フロントと調理の責任者に「予約データがまだありません」と知らせます。 仕入先の発注の締切が17時なので、16時には案が届いている必要があります。
処理は館ごとに区切ります。 1館分の集計・見込み・読み取り・計算・文面までを1まとまりにし、どの館まで終わったかをスクリプト プロパティに残します。
20時にもう1つトリガーを置きます。 フロントが夜の予約データを書き出していれば読み直し、中央の人数が15時の案から1割以上動いた館だけ、調理の責任者と夜勤の調理の担当に知らせます。翌朝の納品の追加は間に合わないことが多いので、知らせるのは仕込みの量の直しと、当日の朝に調理で吸収できる品目の量です。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 翌日の予約データ | 予約番号、館、宿泊日、大人・子どもの人数、プラン(朝食付き/なし)、客層の区分(個人・ビジネス・団体・海外の旅行会社)、備考 | 宿泊予約システムのCSV |
| 団体の手配書 | 団体名、人数、朝食の時間と形(会場・弁当・なし)、日ごとの変更 | 手配書のシート(営業が書く) |
| 喫食の記録 | 館、日付、朝食会場に来た人数、弁当の数、記録した担当 | 喫食の記録のシート |
| 過去の朝食付きの人数 | 館、日付、客層ごとの朝食付きの人数 | 毎日の予約データから積んだシート |
| 品目の設定 | 品目、1人あたりの使用量、単位、発注の単位、仕入先、発注の締切、前日に仕込むか、当日の追加ができるか | 品目の設定のシート |
| 在庫 | 品目ごとの今日の夕方の残り | 在庫のシート(調理の担当が書く) |
AIに渡すのは、団体の手配書の朝食の欄と、朝食に関わる語を含む予約の備考だけです。 氏名・電話番号・メールアドレスはCSVの段階で書き出しの項目から外します。予約番号も、スクリプトの中で通し番号に置き換えてから渡します。
質を決めるのは、喫食の記録と過去の朝食付きの人数が同じ日で並んでいることです。 喫食率は「その日に朝食会場に来た人数」を「その日の朝の朝食付きの人数」で割って出します。どちらかが欠けた日は、計算から外します。
データの取得方法を決める
予約データは、決まったフォルダから翌日の日付の名前のファイルを探して読みます。読み込んだ直後に館ごとの予約の件数と人数の合計を数え、ログに残します。 予約システムの画面の数字と照らせるようにするためです。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 翌日の朝食付きの人数(館・客層別) | 予約データ | 見込みの元 |
| 直近8週の同じ曜日の喫食率(館・客層別) | 喫食の記録と過去の朝食付きの人数 | 来場の割合の幅 |
| 朝食に関わる備考 | 予約データの備考 | 変更の読み取り |
| 団体の朝食の欄 | 手配書のシート | 変更の読み取り |
| 品目の使用量・単位・締切 | 品目の設定 | 発注量と仕込みの量 |
| 今日の夕方の在庫 | 在庫のシート | 発注量から引く |
団体の喫食率は、過去の値を使いません。 団体は朝食の時間と形が手配書で決まっているので、手配書の人数をそのまま見込みに入れます。 喫食率を掛けるのは個人・ビジネス・海外の旅行会社の予約だけです。
Gemini API の鍵はスクリプト プロパティに置き、UrlFetchApp で呼びます。 muteHttpExceptions を true にして、失敗の状態コードでも応答を受け取り、送り直すかを決めます。
AIへ渡す前に整形する
- 朝食付きの人数の集計 … 館・客層ごとに、朝食付きのプランの大人と子どもの人数を数えます。未就学の子どもは別に数え、品目の量の計算で係数を変えます
- 喫食率の計算 … 直近8週の同じ曜日について、客層ごとに「来た人数÷朝食付きの人数」を出します。祝日と大型連休は、曜日ではなく「休日」の区分で並べます
- 幅の計算 … 8つの喫食率のうち、低いほうから2番目を下限、中央の2つの平均を中央、高いほうから2番目を上限とします。記録が5日に満たない区分は、館の全体の値を使い、その旨を印にします
- 備考の絞り込み … 備考に「朝食」「朝ごはん」「弁当」「アレルギー」「breakfast」などの語を含む予約だけを選びます
- 伏せる処理 … 備考の中の氏名・電話番号を伏せます
- 品目の量の計算 … 前日に仕込む品目と当日の追加ができない品目は上限の人数で、当日に追加で作れる品目は中央の人数で、1人あたりの使用量を掛けます
- 発注量の計算 … 品目ごとの量から在庫を引き、発注の単位に切り上げます
3番目で幅を出すのは、1つの数字だと外れたときに次の手が無いからです。 下限と上限の差が大きい日は、当日の朝に追加で作れる品目を厚めに用意し、前日に仕込む品目は上限に寄せる、という使い分けが責任者にできます。
6番目の使い分けが、廃棄と欠品の両方に効きます。 焼き魚の切り身やサラダの下ごしらえは当日に増やせないので上限で、卵料理やトーストは会場の様子を見て作れるので中央で量を決めます。どの品目をどちらにするかは、品目の設定のシートで責任者が決めます。
AIに処理させる
させるのは2つです。 1つ目は、団体の手配書と予約の備考から、朝食の人数に関わる変更を決まった区分で読み取ること。2つ目は、スクリプトが計算した人数の幅と品目の量について、調理の担当向けに根拠と確かめる点を書くことです。
| 読み取る区分 | 中身 | 判断できないときの扱い |
|---|---|---|
no_breakfast | 朝食付きのプランだが朝食を取らない | 人数が書かれていなければ予約の全員 |
boxed | 会場ではなく弁当に替える | 時刻と人数を写す |
time_change | 会場の開始より早い・遅い時刻の希望 | 時刻を写す |
allergy | 食物アレルギーの申し出 | 食品名と人数を写す。分からなければ unclear |
add_breakfast | 朝食なしのプランから朝食を足す | 人数を写す |
unclear | 朝食に関わるが意味が決められない | 原文を写して人に回す |
allergy は人数の調整ではなく、調理の担当への知らせとして扱います。 見込みの人数は変えず、案の文面に「卵アレルギー2名(302号室の予約)」のように並べます。アレルギーの対応の可否を判断させることはしません。
| させないこと | 理由 |
|---|---|
| 来場の人数や品目の量の計算 | 式で出した数字を変えさせない。説明できなくなる |
| 入力に無い事情(天気、地元の行事)の推測 | 確かめようのない理由で量が動く |
| アレルギーへの対応の可否の判断 | 調理の担当が決める |
| 発注の確定 | 責任者が決める |
| 宿泊客の属性からの推測(国籍で朝食を取る割合など) | 根拠にならず、偏りを生む |
いちばん起きやすい失敗は2行目です。 「週末は観光客が多いため、朝食の利用が増えると考えられます」のような一般論で、AIは案の文面を埋めたがります。喫食率は過去の実績からすでに出ているので、一般論を足すと二重に数えることになります。
指示内容を固定する
1つ目の指示(朝食の変更の読み取り)は次のとおりです。
あなたはホテルの料飲部で、翌朝の朝食の準備のために予約の書き込みを整理する立場です。
団体の手配書の朝食の欄と、個人の予約の備考を読み、朝食に関わる変更を次の区分で答えてください。
【区分】
- no_breakfast .. 朝食付きのプランだが朝食を取らない
- boxed ......... 会場ではなく弁当に替える
- time_change ... 会場の開始(6:30)より早い、または終了(9:30)より遅い時刻の希望
- allergy ....... 食物アレルギーの申し出
- add_breakfast . 朝食なしのプランから朝食を足す
- unclear ....... 朝食に関わるが、上のどれか決められない
【厳守事項】
- 書かれていることだけを根拠にしてください。人数や時刻を推測で補わないでください。
- 人数が書かれていなければ persons を null にしてください。
- 1つの書き込みに複数の変更があれば、別々の行に分けてください。
- 宿泊日が翌日でない変更(2日目、最終日など)は、翌朝に当てはまるかを applies_tomorrow で答えてください。分からなければ null です。
- evidence には、区分を決めた語句を原文からそのまま写してください。
- アレルギーへの対応ができるかどうかを書かないでください。
- 入力の row_id をそのまま返してください。
【翌日の日付】{date}
【団体の手配書の朝食の欄(row_id、団体の人数、宿泊日、記載)】{group_rows}
【個人の予約の備考(row_id、人数、プラン、記載)】{remark_rows}
2つ目の指示(案の文面)は次のとおりです。
あなたはホテルの料飲部で、調理の責任者に翌朝の朝食の見込みを伝える文面を書く立場です。
人数と量は、すでに決まった式で計算されています。
来場の人数は「朝食付きの人数 × 直近8週の同じ曜日・同じ客層の喫食率」の下限・中央・上限です。
【書くこと】
1. 来場の人数の下限・中央・上限と、客層ごとの内訳(渡した数字をそのまま)
2. 団体の朝食の形(会場・弁当)と人数、弁当の時刻
3. アレルギーの申し出の一覧
4. 上限と下限の差が大きい客層と、その日の量の決め方で確かめる点(質問の形で)
5. unclear の書き込みの原文
【厳守事項】
- 数字は入力の値をそのまま書いてください。丸めたり計算し直したりしないでください。
- 入力に無い事情(天気、行事、季節の傾向、客の国籍)を理由として書かないでください。
- 発注を決めつけず、「案は○○です。いかがでしょうか」の形にしてください。
【館と翌日の日付】{hotel} {date}
【人数の幅と内訳】{forecast}
【読み取った変更】{changes}
【品目ごとの量の案】{items}
2つ目の指示の冒頭に式を書いておくのが要点です。 式を知らないと、AIは人数を「AIの予測」と言い換えます。式を渡せば、責任者が自分の記憶と照らせる言い方で書きます。
出力形式を固定する
朝食の変更は次の形で受け取ります。 type は6つの区分を enum で列挙し、persons には minimum を0で付けます。
{
"changes": [
{ "row_id": "G-03", "type": "boxed", "persons": 42,
"time": "06:00", "applies_tomorrow": true,
"evidence": "2日目朝食 6:00 お弁当にて(42名)" },
{ "row_id": "R-118", "type": "allergy", "persons": 1,
"time": null, "applies_tomorrow": true,
"evidence": "子ども1名 卵アレルギー" }
]
}
1つ目の理由は、row_id と persons を予約データと照らせることです。 persons が、その予約や団体の人数を超えていれば、その行は使わず unclear に回します。読み取った人数で、予約の人数より多く減らすことはさせません。
2つ目は、applies_tomorrow で日付の取り違えを止められることです。 3泊の団体の「2日目は朝食なし」を、翌朝の分と取り違えると、40名分の朝食が丸ごと消えます。null のものは人数に反映せず、案の文面の確かめる点に回します。
3つ目は、evidence を原文と照らせることです。 スクリプトは evidence の文字列が渡した原文に含まれているかを確かめ、含まれていなければその行を使いません。
案の一覧のシートには、館と翌日の日付ごとに次の列を並べます。
| 列 | 中身 | 書く主体 |
|---|---|---|
| 朝食付きの人数と客層ごとの喫食率の幅 | 下限・中央・上限 | スクリプト |
| 読み取った変更と反映後の人数 | 区分ごとの人数 | スクリプト(区分はAI) |
| 品目ごとの量の案と発注量 | 上限・中央の使い分けで計算 | スクリプト |
| 根拠と確かめる点 | 案の文面 | AI |
| 責任者が決めた量と発注した量 | 品目ごと | 人 |
| 翌朝の実際の来場の人数 | 喫食の記録から | スクリプト |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 予約データのフォルダ | 読み取りのみ | 翌日のCSV |
| 手配書・喫食の記録・品目の設定・在庫のシート | 読み取りのみ | 団体の朝食、過去の実績、使用量、残り |
| Gemini API | UrlFetchApp で呼び出し | 変更の読み取りと案の文面 |
| 案の一覧のシート | 書き込み | 計算・文面・責任者の欄 |
| Gmail | MailApp の sendEmail | 調理の責任者への案 |
仕入先への発注は、今までどおり責任者が出します。 案の発注量をそのまま送る仕組みにすると、在庫のシートの書き忘れがそのまま過剰な発注になります。宿泊予約システムにも書き込みません。
人が確認する
unclearとapplies_tomorrowがnullのものを先に見る … 団体の手配書なら営業に、個人の予約ならフロントに確かめます- アレルギーの一覧を調理の担当に渡す … 対応の可否は調理の担当が決めます
- 人数の幅を見る … 翌日の地元の行事や会場の事情と照らし、中央と上限のどちらに寄せるかを決めます
- 品目の量を直して発注する … 在庫のシートが今日の夕方の値かを確かめてから発注します
- 決めた量をシートに書く … 案と違う量にした品目は、理由を1行書きます
5番目を省かないでください。 責任者が案から量を変えた理由が、翌月に喫食率の決め方を見直す材料になります。理由の無い直しは、次の日の案に生かせません。
目標は、90件をならして1件8分です。 案を読み、確かめる点を片づけ、発注するまでの時間です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 15時半を過ぎてもCSVが無い | フロントと責任者に知らせ、今までの手順で決めてもらう |
| 予約の件数がシステムの画面と合わない | 処理を止め、書き出しのやり直しを頼む |
| 喫食の記録が5日に満たない区分 | 館の全体の喫食率を使い、印を付ける |
| 読み取った人数が予約の人数を超える | その行を使わず unclear に回す |
| 在庫のシートが今日の値でない | 発注量を出さず、品目の量だけを出す |
| API が失敗の状態コードを返す | 最大2回送り直し、だめなら読み取り無しの人数と量だけを送る |
| 20時に人数が1割以上動いた | その館だけ知らせ、仕込みの量の直しを促す |
6行目で、AIが使えなくても案は届きます。 人数の幅と品目の量はスクリプトの式で出るので、変更の読み取りが無い分を「手配書と備考は未確認」と書いて送ります。 発注の締切に間に合うことを優先します。
記録を残す
- 処理した日、読み込んだCSVのファイル名と館ごとの件数・人数
- 客層ごとの喫食率の幅と、そのとき使った幅の決め方
- 読み取った変更(
row_id、type、persons、evidence) - 品目ごとの量の案と、責任者が決めた量と理由
- 翌朝の実際の来場の人数と、下限・中央・上限のどこに入ったか
- 品目ごとの廃棄と欠品の記録
最後の2行を並べて残すのが、この構成を育てる材料です。 実際の人数が上限を超えた日が続く客層は、幅の決め方が低すぎます。下限を下回る日が続くなら、朝食付きのプランの売り方が変わった可能性があります。 販売の担当に、プランの構成を変えていないかを聞きます。
幅の決め方を変えたら、変えた日を記録します。 「高いほうから2番目」を「最大」に変えると、同じ記録から違う上限が出ます。どの日がどの決め方だったかが残っていないと、廃棄や欠品の増減の理由が追えません。
04実装レベルの3段階
本記事が想定するのは半自動化です。 発注するのは責任者、仕込みを指示するのも責任者です。1件30分が8分になるのはこの段階です。 本格構成に進むのは、実際の人数と廃棄・欠品の記録が3か月ほどたまってからにしてください。 幅を狭めて廃棄を減らす方向に寄せると、欠品が増えることがあります。欠品の記録が無いうちに幅を変えないでください。
05工数削減シミュレーション
導入後 90件 × 8分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 客室が100〜300室ほどのシティホテル・ビジネスホテル・リゾートホテルを数館持つ事業者で、朝食をビュッフェや定食で出し、翌朝の人数を調理の責任者が前日の夕方に予約の一覧と経験で決めている場合。宿泊予約システムから予約データをCSVで書き出せ、朝食会場で毎朝の喫食の人数を数えて記録している場合。Google Workspace を使っている場合。
- 客室が数十室で、朝食の人数を予約の一覧から数えれば足りる場合。朝食を外部の飲食店に委託していて、人数の見込みを委託先が行っている場合。朝食会場で喫食の人数を記録しておらず、過去の実績が無い場合(先に記録を2か月ほど続ける必要があります)。AIに発注を確定させたい場合や、発注を仕入先へ自動で送りたい場合。
07最小構成で試す方法
- 1館を選び、直近8週の喫食の記録と、同じ日の朝食付きの人数をシートに並べる
- 曜日と客層ごとに喫食率を関数で出し、下限・中央・上限を計算する
- 翌日の団体の手配書の朝食の欄と、朝食に関わる備考を、社内で使ってよいAIサービスの画面に貼り、第7章の区分で読み取らせる
- 責任者がいつもどおりに決めた人数と、計算した幅を並べる
- 翌朝の実際の来場の人数と比べる。これを2週間続ける
2週間で十分です。 ここで確かめたいのは、計算した幅に実際の人数が入るかと、責任者の見込みと比べてどちらが近いかです。
| 出てきた内容 | 判断 |
|---|---|
| 実際の人数がほとんど幅に入る | スクリプトでの自動化に進む |
| 団体の変更の読み取りで外れた日がある | 手配書の朝食の欄の書き方を営業とそろえる。構成は有効 |
| 喫食の記録が欠けて幅が出ない | 記録が先。 AIの問題ではない |
3行目が出ることは珍しくありません。 朝食の終わりは片づけで忙しく、記録が後回しになります。入口で数える人数を、その場でシートに書ける形にするほうが先に効きます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| トリガーが決まった時刻に動かない | 14時台に置き、CSVが置かれるまで待つ作りにする |
| 団体の「2日目は朝食なし」を翌朝と取り違える | applies_tomorrow を答えさせ、null は人数に反映しない |
| 団体に喫食率を掛けて二重に減らす | 団体は手配書の人数をそのまま使う |
| 喫食の記録が欠けた日で幅が振れる | 欠けた日を外し、5日に満たない区分は館の全体の値を使う |
| AIが一般論で量を増やす理由を書く | 入力に無い事情を禁じ、数字は式の値だけを書かせる |
| 前日に仕込む品目を中央の人数で作り欠品する | 品目ごとに上限と中央の使い分けを設定する |
| 在庫のシートが古く、発注が多すぎる | 今日の値でなければ発注量を出さない |
| 夜の予約の変更に追いつかない | 20時に読み直し、1割以上動いた館だけ知らせる |
上の3行が、案が信用されるかどうかを決めます。 団体の朝食を1回でも取り違えると、責任者は手配書を自分で読み直すようになり、①の12分が戻ってきます。
下の2行は、運用が回り始めてから崩れやすい点です。 在庫のシートは調理の担当が夕方に書くもので、忙しい日ほど書き忘れます。在庫が古いまま発注量を出さない作りにしておけば、書き忘れは「発注量が出ていない」という形ですぐ分かります。 夜の変更の知らせも、知らせる館を絞らないと、夜勤の担当が読まなくなります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 翌日の予約の人数・プラン・客層の区分・備考、団体の手配書、朝食会場の喫食の人数です。氏名や連絡先はCSVの段階で外しますが、備考には宿泊客の事情や健康に関わる書き込みがあります。
- 有料の枠で使う … Gemini API の規約では、有料のサービスではプロンプトと応答を製品の改善に使わないとされ、無料のサービスには機密や個人の情報を送らないよう書かれています。アレルギーの申し出は健康に関わる情報なので、無料の枠では使いません
- 渡す範囲を絞る … 渡すのは朝食に関わる語を含む備考と、手配書の朝食の欄だけです。氏名・電話番号は伏せ、予約番号は通し番号に置き換えます
- アレルギーの判断をさせない … 読み取った申し出は一覧にして調理の担当に渡すだけです。対応できるかどうか、代わりの料理をどうするかは調理の担当が決め、宿泊客への連絡はフロントが行います
- 国籍や属性で推測させない … 「海外のお客様は朝食を取る割合が高い」のような推測は、根拠にならず偏りを生みます。客層の区分は予約の経路と団体の有無で分け、喫食率は実績から出します
- 食品ロスの取り組みと合わせる … 農林水産省は、年間の食品廃棄物等の発生量が100トン以上の事業者に毎年6月末までの定期報告を求めています。該当する事業者なら、廃棄の記録はその材料にもなります
誤りが起きた場合のリスクは、朝食が足りなくなることと、作りすぎて捨てることの2つです。 前者は上限で仕込む品目の設定と責任者の確認で、後者は幅の記録と月次の見直しで防ぎます。
10まず何から始めるか
1週目:喫食の記録と予約データを並べる
1館の直近8週の喫食の人数と、同じ日の朝食付きの人数を1つのシートに並べます。記録の欠けた日を洗い出し、朝食会場の入口で数えた人数をその場で書ける形にします。
2週目:幅を出して2週間比べる
曜日と客層ごとの喫食率の幅を関数で出し、責任者の見込みと並べて、翌朝の実際の人数と比べます。手配書と備考は、社内で使ってよいAIサービスで読み取らせます。
3週目:品目の設定を作る
よく使う20品目から、1人あたりの使用量、発注の単位、上限で仕込むか中央で作るかを責任者と決めます。 営業と、手配書の朝食の欄の書き方をそろえます。
4週目:スクリプトで人数の幅までをつなぐ
毎日14時台に動くトリガーを置き、1館の人数の幅を案の一覧のシートに書くところまで作ります。この時点では発注量を出さず、責任者が幅を見て決めた人数と翌朝の実績を並べます。
2か月目: 変更の読み取り、品目の量、案の文面とメールを足し、3館に広げます。3か月目以降: 責任者が量を直した理由と、廃棄と欠品の記録を見て、1件30分が何分になったかを実測します。責任者が休みの日も、代わりの担当者が同じ案から量を決められるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 時間主導型のトリガーが毎分から毎月までの間隔で動かせること。指定した時刻から1時間の間で動く時刻が選ばれること。インストール型トリガーは作成した人のアカウントで実行されること | Google: Installable triggers | 2026-10-08 |
| 1回の実行が6分まで、トリガーの合計実行時間が Workspace のアカウントで1日6時間、URLの呼び出しが1日100,000回であること | Google: Quotas for Google Services | 2026-10-08 |
UrlFetchApp の fetch、muteHttpExceptions を true にすると失敗の応答でも例外にならず応答が返ること | Google: Class UrlFetchApp | 2026-10-08 |
Utilities の parseCsv がCSVの文字列を2次元の配列にすること | Google: Class Utilities | 2026-10-08 |
MailApp の sendEmail と、htmlBody・cc・name のオプション | Google: Class MailApp | 2026-10-08 |
構造化出力が /v1beta/interactions の response_format(mime_type に application/json、schema)で指定できること。enum、minimum などが使えること。値はアプリケーションで確かめるよう書かれていること | Google: Structured outputs(Gemini API) | 2026-10-08 |
| 有料のサービスではプロンプトと応答を製品の改善に使わないこと。無料のサービスには機密や個人の情報を送らないよう書かれていること | Google: Gemini API Additional Terms of Service | 2026-10-08 |
| 2024年度の事業系食品ロス量が237万トンと公表されていること。年間発生量100トン以上の食品廃棄物等多量発生事業者は毎年6月末までの定期報告が必要とされていること | 農林水産省: 食品ロス・食品リサイクル | 2026-10-08 |
発注の量と、アレルギーへの対応は、調理の責任者と担当で決めてください。 本記事は公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1008)についてのご相談はこちらから。
