道の駅の農産物直売所が、出荷者ごとの売上と手数料を Apps Script で集計し、売れ筋と残品の傾向を添えた月次のお知らせを出荷者へ届ける
レジの売上とラベル発行の記録から、出荷者ごとの前月の売上・手数料・残品を Apps Script で集計し、その数字をもとに「よく売れた品目」「残りやすかった曜日と品目」を伝えるお知らせを出荷者ごとに下書きします。精算書と一緒に届けます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate
- 対象業界
- その他/小売/自治体
- 対象部門
- 経理
- 対象業務
- 書類作成/集計・分析
- 主な課題
- 人手が足りない/属人化している/書類作成に時間がかかる
- AIで行う処理
- 生成
- 主な効果
- 品質標準化/属人化解消/工数削減
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 月初に、レジの仕組みから前月の売上の明細と出荷者ごとの精算書を出力する
- ラベル発行機から前月のラベルの発行記録を書き出す
- 出荷者ごとに、売上の明細を品目・曜日で並べ替え、よく売れた品目を探す
- 発行したラベルの枚数と売れた点数を見比べ、残品の多かった品目と曜日を探す
- 精算書の売上・手数料・振込額が、明細の合計と合っているかを確かめる
- 精算書の余白か別紙に、売れ筋と残品の様子を数行で書く
- メールの人には精算書と一言を送り、紙の人には封筒に入れて連絡箱に置く
- 人月初に、レジの売上の明細とラベルの発行記録を CSV で書き出し、スプレッドシートの取り込み用のシートに貼る。状態の欄を「取込済み」にする
- 自動毎月3日の朝に Apps Script が動き、取り込みの状態と、明細の件数・期間を確かめる
- 自動出荷者ごと・品目ごと・曜日ごとに、売上の点数と金額、ラベルの発行枚数、残品の数を集計する
- 自動出荷者ごとに、売上・手数料・ラベル代・振込額を計算し、レジの精算書の値と突き合わせる
- 自動突き合わせが合わない出荷者と、出荷の少ない出荷者を確認待ちに回す
- 自動出荷者ごとに、集計の結果を「事実の表」にして Claude API に渡し、お知らせの文面を JSON で受け取る
- 自動文面の差し込み記号を、事実の表の値に置き換える
- 自動メールの人には Gmail の下書きを、紙の人には印刷用のシートに1人1枠で書き出す
- 人担当が確認の一覧から下書きを読み、直して送る。紙の分は印刷して精算書と一緒に封入する
各工程の詳しい説明を読む
- 月初に、レジの仕組みから前月の売上の明細と出荷者ごとの精算書を出力する
- ラベル発行機から前月のラベルの発行記録を書き出す
- 出荷者ごとに、売上の明細を品目・曜日で並べ替え、よく売れた品目を探す
- 発行したラベルの枚数と売れた点数を見比べ、残品の多かった品目と曜日を探す
- 精算書の売上・手数料・振込額が、明細の合計と合っているかを確かめる
- 精算書の余白か別紙に、売れ筋と残品の様子を数行で書く
- メールの人には精算書と一言を送り、紙の人には封筒に入れて連絡箱に置く
(a)全員分は書けない。 180人について3番から6番をやると、1人12分でも月36時間です。事務所の3名は、売場の応援や催事の準備も持っています。 結果として一言が添えられるのは、出荷の多い人と、担当が顔を知っている人に偏ります。出荷を始めたばかりで、いちばん売場の様子を知りたい人ほど、何も届きません。
(b)書く人で中身が変わる。 ベテランの担当は曜日ごとの売れ方まで見て書き、もう1人の担当は「先月もありがとうございました」で終わることが多い。 出荷者どうしは顔見知りなので、この差はすぐに伝わります。
(c)数字を書き写し間違える。 6番で「トマトが120袋売れました」と書くとき、明細の数字を目で拾って手で書いています。精算書の数字と、一言に書いた数字が食い違ったことが過去にあり、出荷者から「どちらが正しいのか」と電話が入りました。
(d)残品は数字になっていない。 レジには売れた記録しか残らず、持ち込んだ数はラベルの発行記録にしかありません。 両方を突き合わせないと残品の数は出ないので、4番は手間がかかり、忙しい月には省かれます。
- 【人】 月初に、レジの売上の明細とラベルの発行記録を CSV で書き出し、スプレッドシートの取り込み用のシートに貼る。状態の欄を「取込済み」にする
- 【自動】 毎月3日の朝に Apps Script が動き、取り込みの状態と、明細の件数・期間を確かめる
- 【自動】 出荷者ごと・品目ごと・曜日ごとに、売上の点数と金額、ラベルの発行枚数、残品の数を集計する
- 【自動】 出荷者ごとに、売上・手数料・ラベル代・振込額を計算し、レジの精算書の値と突き合わせる
- 【自動】 突き合わせが合わない出荷者と、出荷の少ない出荷者を確認待ちに回す
- 【自動】 出荷者ごとに、集計の結果を「事実の表」にして Claude API に渡し、お知らせの文面を JSON で受け取る
- 【自動】 文面の差し込み記号を、事実の表の値に置き換える
- 【自動】 メールの人には Gmail の下書きを、紙の人には印刷用のシートに1人1枠で書き出す
- 【人】 担当が確認の一覧から下書きを読み、直して送る。紙の分は印刷して精算書と一緒に封入する
4番目が、③の確認を残すための工程です。 精算の数字はスクリプトが計算し直し、レジの精算書と1円でも違えば、その出荷者のお知らせは作らずに止めます。 先にお知らせを作ってしまうと、食い違ったままの数字が出荷者に届きます。
7番目を AI の外に置いているのが、この設計の要です。 AIは「【売上点数1】」のような記号を文中に置くだけで、記号を数字に置き換えるのはスクリプトです。AIがどんな文章を書いても、お知らせに入る数字は集計の表のものだけになります。
02今回想定するシステム構成
レジの売上の明細(CSV) + ラベルの発行記録(CSV) │ 事務の担当が取り込み用のシートに貼る ▼【トリガー】毎月3日の朝(時間主導型のトリガー) Google Apps Script ├──▶ 取り込みの状態・件数・期間を確かめる(未取込なら止める) ├──▶ 出荷者×品目×曜日で、点数・金額・ラベル枚数・残品を集計 ├──▶ 売上・手数料・ラベル代・振込額を計算し、精算書の値と照合 ▼ Claude API ── 事実の表から、お知らせの文面を JSON で返す ▼ Google Apps Script ── 差し込み記号を表の値に置き換え、検査する ├──▶ メール … Gmail の下書き(GmailApp.createDraft) └──▶ 紙 … 印刷用のシートに1人1枠で書き出す ▼ 確認の一覧(スプレッドシート) ──▶【人】読んで直して送る・封入する
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make |
| 生成AI | Claude API(Messages API、構造化出力) | OpenAI API、Gemini API |
| 保管 | Google スプレッドシート(取り込み用、出荷者台帳、集計、確認の一覧、処理ログ) | - |
| メール | Gmail(下書きの作成まで) | - |
| 精算書 | 直売所向けのレジの仕組みが出力するもの(これまでどおり) | - |
新しく足すのは、Apps Script と、取り込み用・集計・確認の一覧・処理ログのシートだけです。 レジの仕組みと精算書の出し方は変えません。この構成は精算書を作り直しません。 精算書は直売所が出荷者に渡す正式な書類で、お知らせはそれに添える連絡です。2つを混ぜないことが、最初の設計の決まりです。
精算書には、税の決まりが関わります。 国税庁の質疑応答(問48)では、委託販売で委託者と受託者がともに適格請求書発行事業者であり、委託者が登録を受けている旨を取引の前までに通知していれば、受託者が自己の名称と登録番号を記載した適格請求書を、委託者に代わって購入者に交付できる(媒介者交付特例)とされています。その場合、受託者は交付した写しを保存し、速やかに委託者に交付する必要があり、多数の購入者に日々交付する場合などは、写しに代えて、関連の明確な精算書等を交付してもよいとされています。そのときの精算書には、税率ごとに区分した金額や消費税額等など、委託者の売上税額の計算に必要な事項を書く必要があるとされています。
同じ出荷者から、野菜は軽減税率(8%)、切り花や苗は標準税率(10%)の品目が並びます。 精算書の書き方は顧問の税理士と決めることで、お知らせの側では税率ごとの金額に触れません。 スクリプトの照合では、税率ごとの合計も精算書と突き合わせます。
03どうやって実装するのか
処理の起点を決める
毎月3日の朝6時台に、時間主導型のトリガーで動かします。 Apps Script の時間主導型のトリガーは、毎分から月に1回までの間隔で動かせます。公式のページでは、たとえば9時に設定すると9時から10時のあいだのどこかで動き、その時刻が日ごとに保たれるとされています。事務所が開く前に終わるよう、早い時刻に置きます。
ただし、日付だけを条件にはしません。 月初の書き出しと取り込みは人の作業で、休日が重なれば遅れます。スクリプトは最初に取り込み用のシートの「状態」の欄を見て、前月分が「取込済み」になっていなければ何も作らずに担当へ知らせて止まります。 3日から10日まで毎朝見に行き、取込済みになった日に動きます。10日を過ぎたら、その月は動かずに担当へ知らせるだけにします。お知らせは精算書と一緒に届くことに意味があり、振込の後に遅れて届く一言は、出荷者にとって別の書類になってしまいます。
インストール型のトリガーは、作った人のアカウントで動きます。 公式のページにそう書かれており、Gmail の下書きもそのアカウントにできます。トリガーは担当者個人ではなく、事務所で共有している出荷者窓口のアカウントで作ります。 トリガーが失敗すると Apps Script から失敗のまとめのメールが届くので、その宛先も窓口のアカウントになります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 売上の明細 | 日時、出荷者コード、品目コード、品名、単価、点数、金額、税率、返品・値引きの印 | レジの仕組みの CSV |
| ラベルの発行記録 | 日時、出荷者コード、品目コード、価格、発行枚数、取り消しの印 | ラベル発行機の CSV |
| 精算書の値 | 出荷者コード、売上合計、税率ごとの合計、手数料、ラベル代、振込額 | レジの仕組みの精算の CSV |
| 出荷者台帳 | 出荷者コード、氏名(屋号)、連絡方法(メール・紙)、メールアドレス、お知らせの要否、出荷を始めた月 | 出荷者台帳のシート |
| 売場の予定 | 翌月の催事、休業日、売場の配置替え | 売場の予定のシート |
質を決めるのは、ラベルの発行記録です。 残品の数は「発行したラベルの枚数 − 売れた点数」で出しますが、ラベルを刷り損じて貼らなかった分や、出荷者が持ち帰って翌日貼り直した分も発行枚数に入ります。 そのため残品の数は目安で、お知らせでは「残りやすかった」という傾向として伝え、正確な数として扱いません。 この扱いをプロンプトにも書きます。
出荷者台帳の「お知らせの要否」は、出荷者本人の希望で付けます。 精算書だけでよいという人もいます。希望しない人には作らないのが、出荷者との関係を保つ最初の決まりです。
データの取得方法を決める
3つの CSV は、事務の担当がスプレッドシートの取り込み用のシートに貼ります。 レジの仕組みとラベル発行機は事務所のパソコンから書き出す形が多く、外から直接は取れません。書き出しを自動にしようとせず、貼る作業を1回に集めるほうが、仕組みが壊れにくくなります。
| 取るもの | どう取るか | 何に使うか |
|---|---|---|
| 前月の売上 | 取り込み用のシートを一度に読み、返品・値引きの行を相殺する | 品目・曜日ごとの点数と金額 |
| 前月のラベル発行 | 同じく一度に読み、取り消しの行を除く | 品目・曜日ごとの持ち込み数 |
| 精算書の値 | 精算の CSV のシートを出荷者コードで引く | スクリプトの計算との照合 |
| 出荷者の情報 | 出荷者台帳を出荷者コードで引く | 宛先、要否、出荷歴 |
| 前々月の集計 | 集計のシートに残した前月分の結果 | 前月との比べ |
シートは範囲を一度に読み、スクリプトの中で出荷者コードをキーにまとめます。 1行ずつ読むと、売上の明細が月に数万行になる直売所では1回の実行時間に収まりません。集計の結果は集計のシートに残し、翌月の「前月との比べ」に使います。
AIへ渡す前に整形する
- 期間と件数の確認 … 明細の日付がすべて前月の範囲にあるか、件数が前月から極端に変わっていないかを見ます。半月分しか貼られていない、といった誤りを最初に止めます
- 返品・値引きの相殺 … 返品の行は元の売上と相殺し、値引きの行は金額だけを差し引きます。点数は変えません
- 品目の名寄せ … 出荷者がラベルに入れる品名は「トマト」「とまと」「中玉トマト」と揺れます。品目コードがあればコードで、無ければ品目の対応表で1つにまとめます
- 曜日と時間帯の付与 … 売上の日時から曜日と時間帯(開店〜正午、正午〜15時、15時〜閉店)を付けます
- 残品の目安の計算 … 品目・曜日ごとに「発行枚数 − 売れた点数」を出し、0未満は0にします(前日のラベルを貼り直した分)
- 精算の計算と照合 … 売上合計、税率ごとの合計、手数料(15%)、ラベル代、振込額を計算し、精算書の値と突き合わせます。1円でも違えば確認待ちにします
- 事実の表を作る … 出荷者ごとに、売れ筋の上位3品目、残りやすかった品目と曜日、前月との比べ、翌月の催事を1行1事実で並べ、【売上点数1】【残品率1】のような記号を振ります
6番目は、お知らせより先に置きます。 照合が合わない出荷者は、お知らせの問題ではなく精算の問題です。事務の担当が精算書を直すまで、その出荷者には何も作りません。
7番目で、数字と言葉を切り離します。 AIに渡すのは「トマト(中玉)|土曜|【売上点数1】」のような品目・曜日と記号の組で、金額や点数の生の値は渡しません。 値は差し込みのときにだけ使います。
AIに処理させる
させるのは、事実の表から、出荷者に届けるお知らせを3つの段落で書くことです。
| 段落 | 書くこと | 使ってよい材料 |
|---|---|---|
| 先月の売れ筋 | よく売れた品目と、よく売れた曜日・時間帯 | 売れ筋の事実と記号 |
| 残りやすかったもの | 残品の目安が多かった品目と曜日 | 残品の事実と記号。傾向として書く |
| 来月の売場から | 翌月の催事や休業日、配置替え | 売場の予定の事実 |
2段落目が、この構成でいちばん気を遣うところです。 残品の話は、書き方によっては出荷者を責めているように読めます。「残りやすかった」という事実を、曜日や時間帯という売場の側の条件と一緒に伝え、 出荷者が自分で次の出し方を考える材料にします。
| させないこと | 理由 |
|---|---|
| 数字を文中に直接書く | 精算書と食い違いうる。記号で置き、後から差し込む |
| 価格や出荷量を勧める | 何をいくらで出すかは出荷者が決める。直売所が指図しない |
| ほかの出荷者と比べる | ほかの出荷者の売上は伝えない。順位も書かない |
| 精算の金額や手数料に触れる | 精算書の役目。お知らせで繰り返さない |
| 残品を出荷者の落ち度として書く | 売場の条件と一緒に事実として伝える |
| 事実の表にない品目や出来事を書く | 売場で起きたことの報告に限る |
2行目と3行目は、とくに強く禁じます。 「隣の農家さんは150円で出しています」のような一言は、AIに材料を渡せば書いてしまいます。そもそもほかの出荷者の数字を渡さないことで、書きようをなくしておきます。
指示内容を固定する
あなたは道の駅の農産物直売所の事務所で、出荷者の方へ毎月お送りする
「先月の売場のお知らせ」を書く担当です。
以下の「事実の表」だけを使って、お知らせの本文を3つの段落で書いてください。
【書き方】
- 段落1(best_sellers):先月よく売れた品目と、よく売れた曜日・時間帯を2〜3文で。
- 段落2(leftovers):残りやすかった品目と曜日を1〜2文で。
「残りやすい傾向がありました」のように傾向として書く。
売場の条件(曜日・時間帯・天候の記載があればそれ)と一緒に書く。
残品がなかった、または事実の表に残品の行がない場合は空にする。
- 段落3(next_month):来月の催事・休業日・売場の配置替えを1〜2文で。
- 敬語で、やわらかく。1段落は120字以内。
【厳守事項】
- 数字を本文に直接書かないでください。数を述べるときは、
事実の表の記号(【売上点数1】など)をそのまま本文に置いてください。
「約」「以上」「倍」を付けた数も書かないでください。
- 価格、値下げ、出荷量について、勧める・お願いする表現を書かないでください。
- ほかの出荷者のこと、順位、平均との比べを書かないでください。
- 精算の金額、手数料、振込、税について書かないでください。
- 残品を出荷者の責任として書かないでください。
- 事実の表にない品目・出来事・天候を書かないでください。
- 出荷者の名前を書かないでください。宛名は【宛名】と書いてください。
- used_facts には、本文で使った記号をすべて並べてください。
- 事実が少なく書けないときは、本文を空にし、needs_review に理由を書いてください。
【出荷者の区分】{segment}(新規:出荷を始めて3か月以内/通常)
【事実の表】{facts}
【来月の売場の予定】{schedule}
「倍」を禁じているのは、記号を使えと言うだけでは足りないためです。 前月との比べを渡すと、「先月の2倍近く売れました」と計算して書くことがあり、それは集計の表に無い数字です。 前月との比べが要るなら、比べた結果も記号(【前月比1】)で渡します。
出荷者の区分を渡しているのは、新しい出荷者への書き方を変えるためです。 出荷を始めて間もない人には、売れた曜日や時間帯の話をていねいに書くほうが役に立ちます。区分はスクリプトが出荷者台帳の「出荷を始めた月」から決め、AIには区分の名前だけを渡します。
出力形式を固定する
Claude API の構造化出力で、次の形の JSON を受け取ります。 公式のページでは、output_config.format に type: "json_schema" を指定し、オブジェクトには additionalProperties: false を付けることとされています。
{
"grower_code": "G-0137",
"segment": "new | regular",
"best_sellers": "",
"leftovers": "",
"next_month": "",
"used_facts": ["【売上点数1】", "【曜日1】", "【残品率2】"],
"mentions_price": false,
"needs_review": ""
}
1つ目の理由は、記号の使い方をスクリプトで検算できることです。 本文に出てくる記号を数え、used_facts と一致するか、すべてが事実の表にある記号かを確かめます。
| 検査 | 合わないとき |
|---|---|
本文の記号と used_facts が一致する | 確認待ち(記号の書き漏れ・書き足し) |
| 記号がすべて事実の表にある | 確認待ち(存在しない記号) |
| 記号を除いた本文に数字がない | 確認待ち(数字の直書き) |
| 本文に「値下げ」「価格」「円」「手数料」がない | 確認待ち(禁じた話題) |
mentions_price が false | 確認待ち |
needs_review が空 | 確認待ち(AIが書けないと判断) |
2つ目は、段落ごとに差し込む場所を決められることです。 メールの本文も、印刷用のシートの枠も、段落の順に並べるだけで形になります。
3つ目は、segment を返させて照合できることです。 公式のページには、列挙型の値は大文字小文字だけ違う形で返ることがあると書かれているので、比べるときは大文字小文字を区別しません。 また構造化出力は数値の最小値・最大値の制約に対応していないため、数の範囲の確かめはスクリプトの側で行います。 スキーマを初めて使うときは文法の準備で遅くなり、その結果は最後の利用から24時間保たれるとされているので、180人分を1日のうちに続けて作る形が合っています。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| スプレッドシート | Apps Script の読み書き | 取り込み・台帳・予定を読む。集計・確認の一覧・処理ログに書く |
| Claude API | UrlFetchApp.fetch | 出荷者ごとに文面を受け取る |
| Gmail | GmailApp.createDraft | メールの人の下書きを作る |
| 印刷用のシート | Apps Script の書き込み | 紙の人のお知らせを1人1枠で並べる |
API の呼び出しでは muteHttpExceptions を true にします。 公式のページでは、これを true にすると失敗の応答でも例外を投げないとされています。応答のコードを見て、混み合いならしばらく待ってやり直し、それ以外の失敗はその出荷者を確認待ちに回します。 API キーはスクリプトのプロパティに置きます。公式のページでは、スクリプトのプロパティはそのスクリプトの利用者全員で共有され、スクリプトの間では共有されないとされています。
Gmail は下書きまでです。 createDraft は宛先・件名・本文に加えて、HTML の本文、差出人の表示名、返信先などを指定して下書きを作れます。差出人の表示名には直売所の名前を入れ、返信先は出荷者窓口のアドレスにします。 このメソッドを使うスクリプトには https://mail.google.com/ のスコープの承認が要るとされているので、最初の承認は窓口のアカウントで行います。
精算書の PDF は、メールに添付しません。 精算書はこれまでどおりレジの仕組みから送り、お知らせは別のメールにします。 1通にまとめると、お知らせの下書きを直すたびに正式な書類を扱うことになり、添付の取り違えが起きたときの影響が大きくなるためです。
人が確認する
全件を担当が読みます。 確認の一覧には、出荷者ごとに区分、宛先、照合の結果、検査の結果、下書きへのリンクが並びます。
- 確認待ちを先に片づける … 精算の照合が合わないもの、検査で止まったもの、AIが書けなかったもの。照合のずれは、お知らせより先に精算書の担当へ回します
- 2段落目を読む … 残品の書き方が、出荷者を責める調子になっていないか。売場の条件と一緒に書かれているか
- 数字を1つ確かめる … 差し込まれた数字のうち1つを、集計のシートと見比べます
- 直して送る・封入する … メールは下書きを開いて送ります。紙は印刷し、精算書と同じ封筒に入れます
- 大きく直したら記録する … どの段落を、なぜ直したかを一覧に一言残します
1人3分を目安にします。 読む・直すで2分、送る・封入するで1分です。新規の出荷者は少していねいに読み、通常の出荷者は流し読みに近くなります。
出荷者から電話が来たときに答えられる人が読むことも、この確認の役目です。「土曜にもっと出したほうがいいか」と聞かれたとき、答えるのは売場を知る人で、AIではありません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 前月分が取込済みになっていない | 何も作らずに止まり、担当へ知らせる。10日まで毎朝見に行く |
| 明細の期間や件数がおかしい | 止まって担当へ知らせる。貼り直しを頼む |
| 精算書の値とスクリプトの計算が合わない | その出荷者は作らず確認待ち。精算書の担当へ回す |
| 品目の対応表に無い品名 | 品名のまま集計し、確認の一覧に「対応表に追加」と印を付ける |
| 前月の出荷が数日だけ | 売れ筋の段落だけにする。残品の段落は空にする |
| お知らせを希望しない出荷者 | 作らない。一覧にも載せない |
| メールアドレスが空・戻ってきた | 紙に切り替えるかを人が決める。推測で宛先を作らない |
| API が応答しない・混み合い | 時間をおいてやり直し、続けて失敗したら確認待ち |
| 1回の実行が時間切れになる | 処理済みの印を見て、次の実行で続きから作る |
最後の行は、Apps Script の上限から来ます。 公式の上限の表では、スクリプトの実行時間は1回あたり6分で、トリガーで動かした合計の実行時間は個人のアカウントで1日90分、Google Workspace のアカウントで1日6時間です。180人分を1回で作ると6分を超えうるので、30人ずつ作り、残りがあれば数分後に動く1回きりのトリガーを作って続きを作ります。 トリガーはユーザー・スクリプトごとに20個までとされているので、続きのトリガーは動いたら消します。
URL の取得の回数にも上限があります。 個人のアカウントで1日20,000回、Google Workspace で1日100,000回です。180人分なら十分に収まりますが、やり直しを無制限に繰り返す作りにはしません。 1人あたり3回までにします。
記録を残す
- 実行の日時、対象の月、取り込んだ明細とラベル記録の件数
- 出荷者ごとの集計の結果(品目・曜日ごとの点数、金額、残品の目安)
- 精算の照合の結果(スクリプトの計算、精算書の値、差)
- AIに渡した事実の表と記号、AIが返した JSON の全文(差し込む前のもの)
- 検査の結果と、確認待ちにした理由
- 担当が送った・封入した日と、大きく直した段落と理由
3つ目の照合の結果は、精算の側の記録としても使えます。 毎月どの出荷者でずれが出たかが残るので、返品や値引きの入れ方の誤りがどこで繰り返されているかが分かります。
4つ目で差し込む前の JSON を残すのは、誤りの出どころを分けるためです。 出荷者から「書いてある数が違う」と言われたとき、AIの文面の問題か、集計の問題かを、差し込む前と後を比べるだけで切り分けられます。
04実装レベルの3段階
最小構成では180人をさばけません。 集計を手でやるので、確かめるための段階です。 本記事の想定は半自動化です。 月に1度まとめて作り、担当が数日かけて読んで送ります。1人12分が3分になるのはこの段階です。 差が大きいのは、①②の材料探しと③の照合がスクリプトに移り、④が「読んで直す」に変わるからです。 本格構成は、出荷者から「もっと早く知りたい」という声が出てからにします。 ただし週ごとの数字は振れが大きく、 月次で書き方が固まってから進めてください。
05工数削減シミュレーション
導入後 180件 × 3分 ÷ 60 = 9 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 農家などの出荷者から農産物・加工品・花の販売を委託され、月に1度、出荷者ごとに売上から手数料を引いて精算している道の駅・JAの直売所・産直の店。レジの売上とラベル発行の記録を CSV で書き出せ、事務所で Google Workspace を使っている場合。精算書に添えて売れ筋や残品の様子を伝えたいが、事務の担当が手で書いており、一部の出荷者にしか届いていない場合。
- 出荷者が十数人で、店長が売場で直接話せば足りる店。レジの仕組みに出荷者向けの分析帳票やアプリがあり、出荷者がそれを日々見ている場合。売上の記録に出荷者のコードが付いておらず、出荷者ごとに分けられない場合。なお、精算書の税の書き方や、媒介者交付特例を使うかどうかの判断はこの構成の対象外です。
07最小構成で試す方法
- 前月に出荷のあった出荷者から15人を選ぶ(出荷の多い人・少ない人・新規の人・花や加工品の人を混ぜる)
- その15人について、売上の明細とラベルの発行記録を手で集計し、売れ筋の上位3品目と残りやすかった品目・曜日を表にする
- 表の数字を【売上点数1】のような記号に置き換えた「事実の表」を作る
- 手元の Claude の画面に、第7章のプロンプトと1人ずつの事実の表を貼る
- 出てきた文面を、ベテランの担当が書いた一言と並べて、事務所の3人で読み比べる
15人は必ずばらして選んでください。 出荷の多い人ばかりだと、事実の少ない人への書き方の問題が見えません。
| 出てきた内容 | 判断 |
|---|---|
| ベテランの一言と遜色ない | スクリプトで集計からつなぐ段階に進む |
| 数字を直接書いてくる | 指示の書き方で直る。構成は有効 |
| 値下げや出荷量を勧めてくる | 禁止の書き方を強め、検査の語を足す |
| 残品の話が責める調子になる | 売場の条件を事実の表に足す |
4行目が出ることは珍しくありません。 事実の表に「キュウリ|残品率【残品率1】」しか無いと、AIは理由を出荷者の側に求めて書きがちです。「平日|15時〜閉店」のような売場の条件を同じ行に入れると、書き方が変わります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 「2倍近く」のように計算した数を書く | 記号以外の数字を検査で止める。 比べた結果も記号で渡す |
| 値下げや出荷量を勧めてくる | 指示で禁じ、本文の語で検査する。ほかの出荷者の数字を渡さない |
| お知らせと精算書の数字が食い違う | 照合が合わない出荷者は作らない。 精算書を先に直す |
| 残品の数が実際より多く出る | ラベルの刷り損じや貼り直しが入る。傾向として伝え、数を強調しない |
| 品名の揺れで同じ品目が分かれる | 品目の対応表を作り、無い品名は一覧に印を付ける |
| 半月分だけ貼られた CSV で動く | 期間と件数を最初に確かめて止める |
| 実行が6分で止まる | 30人ずつ作り、続きを1回きりのトリガーで作る |
| 続きのトリガーが増え続ける | 20個までとされている。動いたら消す |
| 担当者のアカウントでトリガーを作る | 作成者のアカウントで動く。出荷者窓口のアカウントで作る |
| 希望しない人にまで届く | 台帳の「お知らせの要否」を最初に見る |
| 下書きが Gmail にたまる | 送った印を一覧に付け、月をまたいだ下書きは消す |
上の3行が、この構成の失敗のほとんどです。 どれも「直売所が出荷者に、誤った数字や出すぎた口を届ける」失敗で、数字と話題を AI の外で決めているかどうかで、防げるかが決まります。
4行目は記録の性質です。 出荷者が「そんなに残っていない」と言うなら、たいていは出荷者のほうが正しいのです。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 出荷者の氏名(屋号)、連絡先、口座への振込額、品目ごとの売上と残品、そして出荷者ごとの収入の推移です。
- 外部へ渡す範囲を、文面に必要なものまでに限る … Claude API に渡すのは区分、品目と曜日、記号だけです。氏名・連絡先・金額・振込額は渡しません。 記号で書かせ、差し込みは Google Workspace の中で行います
- ほかの出荷者の数字を混ぜない … 1人分の事実の表には、その人の数字だけを入れます。平均や順位を作らないことで、他人の売上が漏れる経路をなくします
- 送信を自動にしない … 下書きまでです。出荷者は直売所の大事な取引の相手で、 誤ったお知らせは次の出荷の判断に響きます
- 精算書と混ぜない … 精算書は正式な書類で、税の決まりも関わります。お知らせは精算書を作り直さず、税率ごとの金額にも触れません。 精算書の書き方は顧問の税理士と決めてください
- API キーをスクリプトに直接書かない … スクリプトのプロパティに置き、スクリプトの編集権限を持つ人を事務所の担当に限ります
- 出荷者台帳の共有範囲を絞る … 振込先と収入の推移がまとまった表です。売場の従業員まで編集できる状態にしないでください
誤りが起きた場合のリスクは、誤った数字のお知らせを送ることと、直売所が出荷者の判断に踏み込むことの2つです。前者は記号と照合と検査で、後者は禁じる話題と渡さない材料で防ぎ、最後に売場を知る人が読んでから送ります。
10まず何から始めるか
1週目:品目の対応表を作る
前月の売上の明細から品名を書き出し、同じ品目の揺れを1行にまとめた対応表を作ります。売上の多い上位50品目から始めます。
2週目:15人で試す
出荷者を15人選んで手で集計し、事実の表を作って、手元の Claude の画面で文面を作らせます。数字を直接書いていないか、値下げを勧めていないかを最優先で見ます。
3週目:集計と照合をスクリプトにする
Apps Script で取り込み用のシートを読み、出荷者ごとの集計と精算の照合までを作ります。この時点ではお知らせを作らず、照合の結果だけを精算書の担当と確かめます。
4週目:下書きまでつなぐ
API で文面を作り、検査と差し込みを足して、Gmail の下書きと印刷用の枠を作るところまで組みます。最初の月は、送る前に事務所の3人で全件を読み合わせます。
2か月目: 出荷者台帳に「お知らせの要否」を入れ、希望しない人を外します。新規の出荷者の書き方を見直します。3か月目以降: 1人あたりの確認時間を測り、3分を超える下書きの理由を見て、事実の表の作り方を直します。180人全員に、精算書と同じ日にお知らせが届くようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 委託販売で委託者・受託者がともに適格請求書発行事業者で、委託者が登録の旨を取引前に通知していれば、受託者が自己の名称と登録番号で適格請求書を交付できること(媒介者交付特例)。受託者が写しを保存し委託者に交付すること。多数の購入者に日々交付する場合などは関連の明確な精算書等でよく、税率ごとの金額や消費税額等の記載が要ること | 国税庁: 消費税の仕入税額控除制度における適格請求書等保存方式に関するQ&A 問48 | 2026-10-15 |
| 時間主導型のトリガーが毎分から月1回まで動かせ、時刻がずれうること(9時の設定が9〜10時に動き、その時刻が保たれる)。インストール型のトリガーが作成者のアカウントで動くこと。失敗時にまとめのメールが届くこと | Google: Installable triggers | 2026-10-15 |
| 実行時間が1回6分、トリガーの合計実行時間が個人1日90分・Workspace 1日6時間、トリガーがユーザー・スクリプトごとに20個、URL の取得が個人1日20,000回・Workspace 1日100,000回であること | Google: Quotas for Google Services | 2026-10-15 |
createDraft が宛先・件名・本文と、HTML の本文・表示名・返信先などの指定で下書きを作ること。https://mail.google.com/ のスコープが要ること | Google: Class GmailApp | 2026-10-15 |
muteHttpExceptions を true にすると、失敗の応答でも例外を投げないこと | Google: Class UrlFetchApp | 2026-10-15 |
| スクリプトのプロパティがスクリプトの利用者全員で共有され、スクリプトの間では共有されないこと | Google: Properties Service | 2026-10-15 |
構造化出力を output_config.format の json_schema で指定し、additionalProperties: false が必要なこと。数値の最小値・最大値の制約に対応しないこと。列挙型の値が大文字小文字だけ違って返りうること。初回は文法の準備で遅れ、24時間保持されること | Claude: Structured outputs | 2026-10-15 |
精算書の税の書き方や、媒介者交付特例を使うかどうかは、顧問の税理士に確かめてください。 本記事は、精算書に添えるお知らせの下書きづくりに絞って、公式のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1662)についてのご相談はこちらから。
