店舗の日次売上から月の途中で月末の着地を店舗ごとに見込み、予算との差と理由の候補を経営企画に出す
店舗ごとの日次売上から、月の途中で月末の売上の着地と見込みの幅を計算します。予算との差が大きい店舗には、客数・客単価・部門別の数字から理由の候補と、店長に確かめる点を付けて経営企画に出します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate/Python
- 対象業界
- 小売/飲食
- 対象部門
- 経営企画
- 対象業務
- 集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 朝、POSから前日までの店舗別・日別のCSVを出し、集計のスプレッドシートに貼り付ける
- 店舗ごとに当月の実績の累計を出す
- 担当者のやり方で、月末までの残りの日の売上を見込み、累計に足す
- 予算と比べ、差の大きい店舗に色を付ける
- 差の大きい店舗について、客数・客単価・部門別の前年比を開いて見る
- 販促の予定と店舗からの報告を見比べ、理由のコメントを書く
- 一覧を地区の責任者と営業部長にメールで送る
- 自動毎朝、POSのCSVが共有ドライブのフォルダに置かれる(POSの仕組みの夜間の出力)
- 自動スクリプトがCSVを読み、店舗別・日別の売上・客数・部門別売上を蓄積のシートに足す
- 自動10日・15日・20日・25日の朝は、店舗ごとに着地の見込みを決まった式で計算する
- 自動過去12か月の同じ時点での見込みのずれから、店舗ごとの見込みの幅を計算する
- 自動予算との差と幅から、店舗を「予算が幅の外で下」「幅の中」「幅の外で上」に分ける
- 自動「幅の外」の店舗について、客数・客単価・部門別の前年比と販促の予定を Gemini API に渡す
- 自動理由の候補(数字の根拠付き)と、店長に確かめる点が返る
- 自動見込みの一覧のシートに書き出し、経営企画の Google Chat のスペースに知らせる
- 人経営企画の担当者が一覧を確かめ、理由の候補を直したり消したりする
- 人地区の責任者と営業部長に一覧を送る
- 自動月末に、各時点の見込みと実際の着地を並べて、見込みのずれを記録する
各工程の詳しい説明を読む
- 朝、POSから前日までの店舗別・日別のCSVを出し、集計のスプレッドシートに貼り付ける
- 店舗ごとに当月の実績の累計を出す
- 担当者のやり方で、月末までの残りの日の売上を見込み、累計に足す
- 予算と比べ、差の大きい店舗に色を付ける
- 差の大きい店舗について、客数・客単価・部門別の前年比を開いて見る
- 販促の予定と店舗からの報告を見比べ、理由のコメントを書く
- 一覧を地区の責任者と営業部長にメールで送る
(a)計算の仕方が担当者ごとに違う。 「前年比 × 前年の月」と「1日平均 × 日数」では、曜日の並びの違いを拾えるかが違います。月の中で土日が1日多いだけで、食品スーパーの月の売上は目に見えて変わります。 担当者が替わると、見込みの癖も変わります。
(b)見込みに幅が無い。 「着地は予算比98%」とだけ出すと、その98%がどのくらい確かなのかが分かりません。 毎月ぶれが大きい店舗と、15日時点でほぼ着地が読める店舗が、同じ1つの数字で並びます。
(c)理由を探すのが差の大きい店舗だけになる。 75店舗すべての部門別の数字を開く時間は無く、理由のコメントが付くのは上位の数店舗です。 差は小さいが毎月じわじわ下がっている店舗は、月末まで話題になりません。
(d)月末近くにならないと動けない。 25日の一覧で初めて理由が分かっても、残りの5日で打てる手はほとんどありません。 10日や15日の時点で理由の候補が出ていれば、店長と話す時間が取れます。
- 【自動】 毎朝、POSのCSVが共有ドライブのフォルダに置かれる(POSの仕組みの夜間の出力)
- 【自動】 スクリプトがCSVを読み、店舗別・日別の売上・客数・部門別売上を蓄積のシートに足す
- 【自動】 10日・15日・20日・25日の朝は、店舗ごとに着地の見込みを決まった式で計算する
- 【自動】 過去12か月の同じ時点での見込みのずれから、店舗ごとの見込みの幅を計算する
- 【自動】 予算との差と幅から、店舗を「予算が幅の外で下」「幅の中」「幅の外で上」に分ける
- 【自動】 「幅の外」の店舗について、客数・客単価・部門別の前年比と販促の予定を Gemini API に渡す
- 【自動】 理由の候補(数字の根拠付き)と、店長に確かめる点が返る
- 【自動】 見込みの一覧のシートに書き出し、経営企画の Google Chat のスペースに知らせる
- 【人】 経営企画の担当者が一覧を確かめ、理由の候補を直したり消したりする
- 【人】 地区の責任者と営業部長に一覧を送る
- 【自動】 月末に、各時点の見込みと実際の着地を並べて、見込みのずれを記録する
3番目と4番目をスクリプトの式で行うのが、この設計の土台です。 見込みの金額が毎回同じ式で出るので、担当者が替わっても見込みの癖は変わりません。 式を変えるときは、変えた日と内容を記録します。
9番目で経営企画が見るのは、理由の候補が数字に合っているかです。 理由の候補は、店舗の事情を知らないAIが数字から並べたものです。店長に聞く前の仮説として扱い、確定した理由として地区へ出しません。
02今回想定するシステム構成
POSの仕組み(夜間に店舗別・日別のCSVを出力) ▼ 共有ドライブのフォルダ 【トリガー】時間主導型(毎朝7時台) Google Apps Script ├──▶ CSVを読み、蓄積のシートに足す ├──▶(10日・15日・20日・25日)着地の見込みと幅を計算 ├──▶ 予算と比べ、幅の外の店舗を選ぶ ▼ Gemini API(構造化出力) │ 幅の外の店舗について、理由の候補と確かめる点 ▼ Google Apps Script ── 見込みの一覧のシートへ書き出す └──▶ Google Chat のスペースへ知らせる(Webhook) ▼ 【経営企画が確かめて、地区の責任者へ送る】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make、Python |
| 生成AI | Gemini API(有料の枠、構造化出力) | Claude API、OpenAI API |
| シート | Google スプレッドシート(蓄積・予算・販促の予定・見込みの一覧) | Microsoft 365 のブック |
| 通知 | Google Chat(経営企画のスペースへの Webhook) | Gmail |
新しく足すのは、スクリプトと Gemini API の契約だけです。 POSの仕組みも、予算のスプレッドシートも、今あるものを使います。POSの仕組みには書き込みません。 スクリプトが書き込むのは、蓄積のシートと見込みの一覧のシートだけです。
土台になるのは、Google Apps Script の時間主導型のトリガーです。 毎分から毎月までの間隔で関数を動かせ、インストール型トリガーは作成した人のアカウントで実行されます。 共有ドライブとスプレッドシートは、そのアカウントの権限で読み書きします。
スクリプトの実行時間には上限があります。 1回の実行は6分まで、トリガーの合計の実行時間は Google Workspace のアカウントで1日6時間まで、外部の API の呼び出しは1日100,000回までとされています。75店舗の見込みの計算と、幅の外の店舗についての Gemini API の呼び出しを1回の実行に詰めると、6分に近づく日があります。 第7章で処理を分ける方法を書きます。
知らせには、Google Chat の受信 Webhook を使います。 外部からスペースへ一方向に投稿する仕組みで、投稿はスペースあたり毎秒1回までの上限があります。知らせは1回の処理で1件にまとめます。
03どうやって実装するのか
処理の起点を決める
時間主導型のトリガーを毎朝7時台に1つ置きます。 POSの夜間の出力が終わったあとに動くよう、出力の終わる時刻を確かめて決めます。時間主導型のトリガーは、指定した時間帯の中で動く時刻が少しずれます。
毎朝やるのは、CSVの取り込みだけです。 見込みの計算と Gemini API の呼び出しは、10日・15日・20日・25日の朝だけ行います。その4日が土日に当たる場合も、曜日にかかわらず同じ日に動かします。 地区の責任者が週明けに一覧を見る運用でも、計算の時点はそろえておきます。
見込みを出す日は、処理を3つに分けます。 7時台に取り込み、7時半からの実行で75店舗の見込みと幅を計算し、8時からの実行で幅の外の店舗について Gemini API を呼びます。どこまで終わったかをスクリプト プロパティに残し、6分を超えそうなら次の実行で続きから始めます。
CSVが届いていない朝は、見込みを出しません。 前日分が欠けたまま計算すると、累計が1日分少なくなり、全店舗が予算に届かない側に振れます。 届いていなければ、Chat に「CSV未着」とだけ知らせて止まります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 日次の実績 | 店舗コード、日付、売上、客数、部門別売上(青果・精肉・鮮魚・惣菜・日配・一般食品・日用品) | POSのCSV(共有ドライブ) |
| 前年の日次の実績 | 同じ項目の前年分 | 蓄積のシート |
| 予算 | 店舗別・月別の売上予算 | 予算のスプレッドシート |
| 販促の予定 | 日付、店舗または地区、チラシ・ポイント倍の日・特売の別 | 販促の予定のシート |
| 店舗の事情 | 改装による休業、営業時間の変更、近くの競合の出店などのメモ | 地区の責任者が書く店舗メモのシート |
AIに渡すのは、幅の外の店舗の数字と、販促の予定と、店舗メモだけです。 生の日次の実績をすべて渡すことはしません。スクリプトが前年比や構成比に計算し直したものを渡します。
店舗メモが、理由の候補の質を決めます。 「15日から近くにドラッグストアが開店」と書いてあれば、AIは日用品の前年比の落ち込みと結び付けられます。メモが無ければ、AIは数字の動きしか言えません。 メモに無い外の事情を、AIに推測させることはしません。
データの取得方法を決める
POSのCSVは、共有ドライブのフォルダから読みます。フォルダの中のファイルを一覧にし、未処理のものを開いて中身を文字列として取り出します。POSの仕組みが出すCSVの文字コードがUTF-8でない場合は、文字コードを指定して取り出します。 Blob から文字列を取り出すときに文字コードを指定できます。取り出した文字列は、CSVを2次元の配列にする関数(Utilities.parseCsv)で表の形にします。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 前日分の実績 | POSのCSV | 蓄積のシートに足す |
| 今月の実績の累計 | 蓄積のシート | 着地の見込みの土台 |
| 前年の同じ曜日並びの日の実績 | 蓄積のシート(364日前) | 残りの日の見込み |
| 過去12か月の各時点の見込みと実際 | 見込みの記録のシート | 見込みの幅 |
| 予算・販促・店舗メモ | 各シート | 比較と、AIへの文脈 |
前年の日は「364日前」で取ります。 364日はちょうど52週なので、曜日が必ずそろいます。 前年の同じ日付で取ると曜日がずれ、土日の数の違いがそのまま見込みの誤差になります。
取り込んだCSVは、処理済みのフォルダへ移します。 移すのは蓄積のシートへの書き込みが終わったときだけにします。フォルダに残っているファイルの数が、そのまま未処理の数になります。
AIへ渡す前に整形する
- 取り込みの確認 … 前日分が全75店舗そろっているかを数えます。欠けた店舗は「未着」とし、その店舗の見込みは出しません
- 異常値の確認 … 売上が0の日、前年比が10倍を超える日に印を付けます。休業日か、POSの不具合かを店舗メモで確かめます
- 着地の見込みの計算 … 今月の実績の累計に、残りの日ごとの「364日前の売上 × 補正率」を足します。補正率は、直近14日の実績を、その364日前の14日の実績で割ったものです
- 販促のずれの調整 … 前年の364日前がチラシの日で、今年の同じ日がチラシでない場合(またはその逆)は、前年の通常の同じ曜日の平均で置き換えます
- 新店・改装店の扱い … 前年の実績が無い店舗は、直近4週の同じ曜日の平均で見込みます。この店舗には「前年なし」の印を付けます
- 見込みの幅の計算 … 過去12か月の同じ日付の時点での、見込みと実際の着地のずれの率を店舗ごとに並べ、その中央値と最大を幅にします
- 店舗の区分け … 予算が幅の下限より上なら「幅の外で下」、幅の中なら「幅の中」、上限より下なら「幅の外で上」とします
- AIへ渡す数字の計算 … 幅の外の店舗について、客数・客単価・部門別売上の前年比と、月の前半と後半の前年比の違いを計算します
3番目から7番目は、すべてスクリプトの式です。 この記事が「予測」と呼んでいるのは、この式で出す着地と幅のことです。式は単純ですが、毎回同じ答えが出ること、過去のずれで確かさを示せることが、担当者の手計算との違いです。
6番目の幅は、運用を始めてから育ちます。 最初の月は過去の見込みの記録が無いため、過去12か月の実績から「その時点で同じ式を使っていたら」の見込みを計算し直して作ります。 蓄積のシートに前年分があれば、さかのぼって計算できます。
AIに処理させる
させるのは、幅の外の店舗について、予算との差の理由の候補を数字の根拠付きで並べ、店長に確かめる点を書くことです。
| させること | 中身 | 判断できないときの扱い |
|---|---|---|
| 差の分解の読み取り | 客数と客単価のどちらの前年比が予算の前提から外れているか | 両方が小さく動いているだけなら「分解できない」 |
| 部門の特定 | 差に効いている部門を前年比と構成比から挙げる | 部門の動きがそろっていれば「全体的」 |
| 時期の特定 | 月の前半と後半で前年比が変わったか | 変化が無ければ書かない |
| 理由の候補 | 販促の予定と店舗メモに照らした候補を最大3つ | メモに手がかりが無ければ「数字の動きのみ」 |
| 確かめる点 | 店長に聞くべきことを2〜3個 | — |
理由の候補には、必ず根拠にした数字の項目名を付けさせます。 「日用品の前年比が15日以降 82%に落ちた(部門別前年比・後半)」のように、入力のどの数字から言っているかを1つずつ書かせます。 根拠の無い候補は、スクリプトの側で一覧から外します。
| させないこと | 理由 |
|---|---|
| 着地の金額や幅の計算・修正 | 式で出した数字を変えさせない |
| 天候・景気・競合など、入力に無い事情の推測 | 確かめようのない理由が一覧に並ぶ |
| 予算の修正の提案 | 予算は経営の判断事項 |
| 店舗や店長の評価 | 見込みの一覧の目的と違う |
| 打ち手の決定 | 店長と地区の責任者が決める |
2行目がいちばん起きやすい失敗です。 客数が落ちている店舗について、AIは「天候不順の影響と考えられる」と書きがちです。入力に天候の情報が無い以上、それは確かめようのない推測で、一覧に並ぶと事実のように読まれます。 店舗メモに無い外の事情は、「確かめる点」の側に質問として書かせます。
指示内容を固定する
あなたは小売チェーンの経営企画部で、月の途中の店舗の売上を分析する立場です。
着地の見込みと幅は、すでに決まった式で計算されています。
あなたの役割は、予算との差について、理由の候補と、店長に確かめる点を出すことです。
【入力(店舗ごと)】
- 着地の見込み、見込みの幅、予算、予算との差、区分(幅の外で下/上)
- 客数・客単価の前年比(月の累計、前半、後半)
- 部門別売上の前年比と構成比(月の累計、前半、後半)
- この店舗と地区の販促の予定(今年と前年)
- 店舗メモ(休業、営業時間の変更、近くの出店など)
【してほしいこと】
1. 差が客数と客単価のどちらから来ていそうかを書いてください。
2. 差に効いている部門を、最大3つ挙げてください。
3. 理由の候補を最大3つ、根拠にした入力の項目名と数字を付けて書いてください。
4. 店長に確かめる点を2〜3個、質問の形で書いてください。
【厳守事項】
- 着地の見込み、幅、予算、差の金額を計算し直したり、修正したりしないでください。
- 入力に無い事情(天候、景気、競合の動き、地域の行事など)を、
理由の候補として書かないでください。必要なら「確かめる点」に質問として書いてください。
- 理由の候補には、必ず evidence に入力の項目名と数字を書いてください。
evidence を書けない候補は出さないでください。
- 店舗メモに書かれた事情を使うときは、source を "store_memo" にしてください。
- 予算を変えるべきか、店長の対応が良いか悪いかを書かないでください。
- 打ち手を決めないでください。
- 数字の動きが小さく、理由を絞れないときは "no_clear_driver" を true にしてください。
【店舗ごとの入力】{stores}
「入力に無い事情を書かない」と「確かめる点に質問として書く」を対にしているのが要点です。 禁じるだけだと、AIは天候の話を言い換えて別の欄に入れてきます。出口を用意すると、推測は質問の形に落ち着きます。 店長が「その週は大雨でした」と答えれば、それが確かめられた理由になります。
出力形式を固定する
次の形のJSONで受け取ります。 Gemini API の構造化出力を使い、response_format に mime_type を application/json、schema に下の形のスキーマを入れて渡します。
{
"store_code": "S041",
"driver_split": "customers | basket | both | unclear",
"key_departments": ["日用品", "一般食品"],
"reason_candidates": [
{
"text": "",
"evidence": [{ "field": "dept_yoy_second_half.日用品", "value": "0.82" }],
"source": "numbers | store_memo | promo_calendar"
}
],
"questions_for_store": ["", ""],
"no_clear_driver": false
}
1つ目の理由は、evidence をスクリプトで照合できることです。 field に書かれた項目名が入力に本当にあり、value が入力の数字と一致するかをスクリプトが確かめます。一致しない候補は一覧から外し、「根拠不一致」として記録します。 構造化出力は JSON の形を守りますが、値の正しさはアプリケーションで確かめるよう、公式の説明にもあります。
2つ目は、source で理由の出どころを分けられることです。 数字の動きだけから言っている候補と、店舗メモや販促の予定に基づく候補では、地区の責任者が受け取る重さが違います。 一覧では source ごとに印を変えます。
3つ目は、no_clear_driver で「分からない」を正式な答えにできることです。 幅の外でも、客数・客単価・部門のどれも小さく動いているだけの店舗があります。無理に理由を作らせず、「はっきりした要因なし」と一覧に出し、店長への質問だけを残します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有ドライブのフォルダ | フォルダのファイルを一覧にして読む | POSのCSV |
| 蓄積・予算・販促・店舗メモのシート | 読み書き(蓄積のシートだけ書く) | 実績の蓄積と、計算の材料 |
| Gemini API | UrlFetchApp.fetch() で POST | 理由の候補と確かめる点 |
| 見込みの一覧のシート | 書き込み | 見込み・幅・区分・理由の候補・確かめる点 |
| Google Chat | 受信 Webhook に POST | 「一覧ができた」と件数の知らせ |
UrlFetchApp.fetch() は、method に post、contentType に JSON、headers に API キー、payload に要求の本文を入れて呼びます。muteHttpExceptions を true にすると、失敗の応答でも例外を投げずに応答を返します。 状態コードを見て、その店舗を次の実行で再試行するかを決めます。
API キーと Webhook の URL は、コードに書かずスクリプト プロパティに置きます。 スクリプト プロパティはスクリプトのすべての利用者で共有されます。スクリプトの編集権限は経営企画の担当者に限ります。 Webhook の URL を知っていれば誰でもスペースに投稿できるため、外へ出さないようにします。
Chat に送るのは、件数と一覧へのリンクだけです。 「幅の外で下 9店舗、幅の外で上 4店舗、CSV未着 0店舗」のように書き、店舗ごとの金額は載せません。 スペースの参加者が増えても、数字が広がらないようにします。
人が確認する
経営企画の担当者が見るのは、見込みの一覧の「幅の外」の行です。 幅の中の店舗は、件数と見込みの合計を確かめるだけにします。
- 取り込みの状態を見る … 未着の店舗、異常値の印が付いた店舗がないか。ここがおかしければ、見込みを送りません
- 幅の外の店舗の理由の候補を読む … 根拠の数字が一覧の数字と合っているか、候補が店舗メモと矛盾していないかを見ます
- 候補を直す・消す … 担当者が知っている事情(本部の販促の変更など)があれば足し、当たっていない候補は消します
- 確かめる点を地区の責任者向けに整える … 店長に聞く質問を、地区の言葉に直します
- 送る … 地区の責任者と営業部長に一覧を送ります
理由の候補は「候補」の見出しのまま送ります。 地区の責任者が店長に確かめて、初めて理由になります。確かめた結果は、店舗メモのシートに地区の責任者が書き足します。 次の時点の見込みでは、その事情がAIの入力に入ります。
目標は、75店舗をならして1店舗2分です。 幅の外の店舗は1回に10〜15店舗という想定で、それより多い回は、式の補正率が外れているか、全社的な販促の変更が反映されていないかを先に疑います。
例外に対処する
| 起きること | 対応 |
|---|---|
| CSVが届いていない | 見込みを出さず、Chat に「CSV未着」と知らせる |
| 一部の店舗の行が欠けている | その店舗は「未着」とし、見込みを出さない |
| 売上が0の日がある | 店舗メモで休業を確かめる。メモが無ければ異常値として人へ |
| 前年の実績が無い(新店) | 直近4週の同じ曜日の平均で見込み、「前年なし」の印 |
| 前年の同じ時期に改装休業があった | 店舗メモの休業期間を前年の通常の同じ曜日の平均で置き換える |
| 処理が6分で終わらない | どこまで終わったかをプロパティに残し、次の実行で続きから |
| Gemini API がエラーを返す | 見込みと区分は先に一覧へ出し、理由の候補は「未取得」とする |
evidence が入力と一致しない | 候補を一覧から外し、「根拠不一致」として記録 |
| Chat への投稿が失敗する | 経営企画の担当者へメールで知らせる |
7行目の扱いが大事です。 Gemini API が止まった朝でも、見込みの数字と幅は式で出ているので、一覧は予定どおり出せます。 理由の候補が無い一覧でも、地区の責任者は幅の外の店舗を知ることができます。
記録を残す
- 取り込んだCSVのファイル名と取り込んだ日時、店舗ごとの行数
- 各時点(10日・15日・20日・25日)の店舗ごとの見込み・幅・区分と、そのとき使った式の版
- 月末の実際の着地と、各時点の見込みとのずれ
- AIに渡した入力と、返ってきたJSONの全文
- 根拠不一致で外した候補
- 経営企画が直した・消した候補と、地区の責任者が店舗メモに書き足した確かめた結果
3つ目が、次の月の幅になります。 各時点の見込みと実際のずれを店舗ごとに積み上げ、過去12か月分を使って幅を計算します。 ずれが毎月同じ向きに出る店舗があれば、式の補正率の取り方を見直す材料にもなります。
最後の行は、理由の候補の当たり外れを振り返る材料です。 経営企画が消した候補が多い型(たとえば「客単価の下落」ばかりが外れる)があれば、指示か入力の数字の作り方を直します。
04実装レベルの3段階
本記事の想定は半自動化です。 1店舗6分が2分になる計算は、この段階で置いています。経営企画が一覧を確かめて送る作業は残します。 本格構成で足すのは、確かめた理由を次の見込みに戻す流れです。 地区の責任者が店長から聞いた事情を店舗メモに書けば、次の時点で AI の入力に入り、同じ質問が繰り返されなくなります。 ここは地区の運用が絡むので、半自動化で数か月回してから作ります。
05工数削減シミュレーション
導入後 300件 × 2分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 数十〜百店舗ほどを持つスーパー・ドラッグストア・専門店・飲食のチェーンで、経営企画が月の途中に店舗ごとの売上の着地を見込み、予算に届かない店舗を営業部門と話し合っている場合。POSから店舗別・日別の売上・客数・部門別売上をCSVで出せる場合。着地の見込みの計算が担当者の手元のスプレッドシートにあり、担当者によって計算の仕方が違う場合。
- 店舗が数店で、店長と本部が毎日直接話して着地を把握できている場合。POSから日別の数字を出せず、月末にならないと売上が分からない場合。来店客数が天候や大型の催事で大きく振れ、前年の並びがほとんど参考にならない業態の場合。AIに予算の修正や店舗の評価を決めさせたい場合(この構成が出すのは見込みの数字と理由の候補までです)。
07最小構成で試す方法
- 先月の5店舗を選ぶ(予算に大きく届かなかった店舗と、ほぼ予算どおりの店舗を混ぜる)
- 先月15日時点の実績の累計と、前年の同じ月の日別の実績をスプレッドシートに並べる
- 残りの日を「364日前の売上 × 直近14日の前年比」で手で見込み、実際の着地と比べる
- 予算に届かなかった店舗の客数・客単価・部門別の前年比を、会社が契約しているAIサービスに貼る
- 「予算との差の理由の候補を、根拠にした数字の項目名付きで最大3つ出してください。入力に無い事情は書かず、店長に確かめる点として質問にしてください」と指示する
3番目は、AIを使わずにまず式だけを確かめる手順です。 式で出した見込みが、担当者の手計算より実際の着地に近いかを先に見ます。
| 出てきた内容 | 判断 |
|---|---|
| 式の見込みが手計算より実際に近く、理由の候補が当時の店長の説明と重なった | スクリプトとの連携に進む |
| 式の見込みは良いが、理由の候補に天候などの推測が混ざった | 指示の書き方で直る。構成は有効 |
| 式の見込みが手計算より実際から遠い | 販促のずれと休業の調整が先。 AIの前に式を直す |
3行目が出ても、構成をやめる理由にはなりません。 多くは、前年の大型の販促や改装休業が364日前の日に入っていたためです。店舗メモと販促の予定を整えると、式のずれは小さくなります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 前年の同じ日付で取って曜日がずれる | 364日前(52週前)で取る |
| CSVが1日欠けて全店舗が下振れする | 取り込みの件数を数え、欠けていれば見込みを出さない |
| 前年のチラシの日が見込みを押し上げる | 販促の予定で今年と前年を照らし、ずれた日を置き換える |
| 新店に前年の実績が無い | 直近4週の同じ曜日の平均で見込み、印を付ける |
| AIが天候や景気を理由に挙げる | 入力に無い事情は質問の形にさせる |
| AIが着地の金額を計算し直してくる | 指示で禁じ、スキーマに金額の欄を作らない |
| 理由の候補の根拠の数字が入力と違う | evidence をスクリプトで照合し、一致しない候補を外す |
| 処理が6分で終わらない | 取り込み・計算・AIの呼び出しを別の実行に分ける |
| POSのCSVの文字が化ける | 文字コードを指定して取り出す |
| Webhook の URL が外に出る | スクリプト プロパティに置き、編集権限を限る |
| 理由の候補が確定した理由として広まる | 「候補」の見出しのまま送り、確かめた結果は店舗メモへ |
上の3行が、見込みの数字の失敗のほとんどです。 どれもAIとは関係がなく、前年の並びをどう今年に当てはめるかの問題です。ここを直すほうが、理由の候補の精度を上げるより効きます。
下の2行は、運用の約束で防ぎます。 一覧が便利になるほど、理由の候補がそのまま会議で使われがちです。地区の責任者が店長に確かめるまでは、候補のままです。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 店舗ごとの売上・客数・部門別売上・予算と、地区の責任者が書いた店舗の事情のメモです。個人の情報は含みませんが、店舗別の予算と実績は社外に出せない経営の情報です。
- 有料の枠で使う … Gemini API の追加の利用規約では、無料の枠に送った内容は製品の改善に使われ、人が読むことがあるとされ、機密の情報を送らないよう求められています。 有料の枠では、プロンプトと応答を製品の改善に使わないとされています。店舗の数字を扱う以上、有料の枠で使います
- 渡す範囲を絞る … AIに渡すのは、幅の外の店舗の前年比と構成比、販促の予定、店舗メモです。売上の金額そのものより、比率を中心に渡します
- 店舗メモに個人のことを書かない … 店長や従業員の個人的な事情は、メモに書かないルールにします。AIの入力に入るためです
- 知らせに数字を載せない … Chat には件数とリンクだけを送ります
- AIに判断させない … 予算の修正、店舗の評価、打ち手の決定は、経営企画・地区の責任者・営業部長が行います。 この構成が出すのは、見込みの数字と理由の候補までです
- 式を変えたら記録する … 見込みの式は経営の数字に関わります。誰がいつ何を変えたかを残し、変える前と後の見込みを並べて確かめます
誤りが起きた場合のリスクは、見込みが外れて手を打つのが遅れることと、根拠の無い理由の候補で店長に的外れな指示が出ることの2つです。 前者は幅を示すことで、後者は evidence の照合と「候補」の扱いで防ぎます。
10まず何から始めるか
1週目:式を決めて5店舗で確かめる
364日前の売上と直近14日の前年比で見込む式を、先月の5店舗で手で計算し、実際の着地と比べます。担当者の今の計算の仕方と、どちらが実際に近いかを見ます。
2週目:販促の予定と店舗メモを整える
前年と今年の販促の予定を1つのシートに並べ、改装休業や新店の情報を店舗メモに書きます。ここが整わないと、式の見込みが前年の特殊な日に引っ張られます。
3週目:取り込みと見込みの計算を作る
POSのCSVを共有ドライブから取り込み、全店舗の見込みと幅、区分を一覧に出すところまで作ります。この時点ではAIを呼びません。 幅の外の店舗が毎回何店舗になるかを数えます。
4週目:理由の候補を足す
幅の外の店舗について Gemini API を呼び、理由の候補と確かめる点を一覧に出します。最初の1か月は、経営企画が自分で探した理由と並べて比べます。
2か月目: 一覧を地区の責任者に送る運用に切り替え、確かめた結果を店舗メモに書いてもらいます。3か月目以降: 各時点の見込みと実際の着地のずれを月ごとに見て、式の調整を続けます。1店舗6分が何分になったかと、幅の外の店舗に月の前半で理由が付いた割合を実測した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 時間主導型のトリガーが毎分から毎月までの間隔で動き、動く時刻が少しずれること。インストール型トリガーは作成した人のアカウントで実行されること | Google for Developers: Installable triggers | 2026-10-07 |
| 1回の実行が6分まで。トリガーの合計実行時間が Google Workspace で1日6時間。URL の取得が Google Workspace で1日100,000回 | Google for Developers: Quotas for Google Services | 2026-10-07 |
Blob の getDataAsString(charset) で文字コードを指定して文字列を取り出せること | Google for Developers: Blob | 2026-10-07 |
Utilities.parseCsv() が CSV の文字列を2次元の配列にすること | Google for Developers: Utilities | 2026-10-07 |
UrlFetchApp.fetch() の method・contentType・payload・headers・muteHttpExceptions | Google for Developers: UrlFetchApp | 2026-10-07 |
| スクリプト プロパティがスクリプトのすべての利用者で共有されること | Google for Developers: Properties Service | 2026-10-07 |
| Google Chat の受信 Webhook が外部からスペースへの一方向の知らせであること。スペースあたり毎秒1回の上限を Webhook で共有すること。組織が Webhook の利用を許可している必要があること | Google for Developers: Send Google Chat messages with incoming webhooks | 2026-10-07 |
Gemini API の構造化出力が /v1beta/interactions の response_format(mime_type と schema)で指定でき、値の正しさはアプリケーションで確かめるべきこと | Google AI for Developers: Structured output | 2026-10-07 |
| 無料の枠に送った内容が製品の改善に使われ人が読むことがあり、機密・個人の情報を送らないよう求められていること。有料の枠ではプロンプトと応答を製品の改善に使わないこと | Google AI for Developers: Gemini API Additional Terms of Service | 2026-10-07 |
見込みの式の調整(販促のずれ、休業、新店の扱い)と、どの幅を「外」とするかは、自社の店舗の実情に合わせて決めてください。 本記事は Google for Developers と Google AI for Developers で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0636)についてのご相談はこちらから。
