印刷会社のWebの見積依頼をスプレッドシートに受け、仕様を単価表の区分に読み替えて概算を出し、確認事項付きの返信を下書きする
ホームページの見積依頼フォームの回答をスプレッドシートで受け、部数・用紙・サイズ・加工の書き方を自社の単価表の区分に読み替えます。概算の金額は単価表から計算し、あいまいな点を確認事項にした返信を下書きします。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 広告/製造
- 対象部門
- 営業
- 対象業務
- 問い合わせ対応/書類作成
- 主な課題
- 営業フォローが追いつかない/属人化している/書類作成に時間がかかる
- AIで行う処理
- 生成
- 主な効果
- 品質標準化/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 営業の担当が回答のスプレッドシートを開き、新しい依頼を探す
- 仕様を読み、用紙・サイズ・加工を単価表の区分に読み替える
- 単価表を引いて、部数の段階の単価から本体の金額を出し、加工の金額を足す
- 納期が短ければ、工場の担当に間に合うかを聞く
- あいまいな点を拾い、確認事項として返信に書く
- 概算の金額と確認事項を書いた返信をメールで送る
- 回答のスプレッドシートに、返信した日と金額を記録する
- 自動フォームの回答がスプレッドシートに入ったことをきっかけに、スクリプトが動く
- 自動選択肢の欄はそのまま単価表の区分に当て、自由記入の欄と備考を Gemini API に渡す
- 自動Gemini API が、自由記入の仕様を単価表の区分の候補に読み替え、確認事項を返す
- 自動スクリプトが、区分が1つに決まった仕様で単価表を引き、本体と加工の金額を計算する
- 自動候補が複数ある仕様は、候補ごとに計算して金額の幅にする
- 自動納期が工場の標準の日数より短ければ「納期確認」の印を付ける
- 自動概算と確認事項を入れた返信を Gmail の下書きにし、回答の行に下書きの作成を記録する
- 人営業の担当が下書きを開き、読み替えと金額と確認事項を確かめて直す
- 人「納期確認」の印があれば工場に確かめ、返信を送る
各工程の詳しい説明を読む
- 営業の担当が回答のスプレッドシートを開き、新しい依頼を探す
- 仕様を読み、用紙・サイズ・加工を単価表の区分に読み替える
- 単価表を引いて、部数の段階の単価から本体の金額を出し、加工の金額を足す
- 納期が短ければ、工場の担当に間に合うかを聞く
- あいまいな点を拾い、確認事項として返信に書く
- 概算の金額と確認事項を書いた返信をメールで送る
- 回答のスプレッドシートに、返信した日と金額を記録する
(a)読み替えが一部の担当に偏る。 「少し厚めのつるつるした紙」を単価表のどの区分と読むかは、経験で決まります。経験の浅い担当は、ベテランに聞きに行くか、薄い紙で金額を出して後で直します。
(b)返信が翌日以降になる。 1件15分かかるので、午後に届いた依頼は翌日に回ることが多くなります。相見積もりの依頼では、先に返した会社に決まることがあります。
(c)確認すべき点の聞き漏れ。 「両面かどうか」「仕上がりのサイズか、広げたサイズか」「入稿のデータの形式」を聞き忘れると、正式な見積の段階でもう一往復が要ります。 聞くべき点の一覧が担当ごとに頭の中にあるのが原因です。
(d)金額の計算の誤り。 部数の段階の境目(1,000部と1,001部)や、加工の加算を足し忘れると、概算と正式な見積の差が大きくなります。
- 【自動】 フォームの回答がスプレッドシートに入ったことをきっかけに、スクリプトが動く
- 【自動】 選択肢の欄はそのまま単価表の区分に当て、自由記入の欄と備考を Gemini API に渡す
- 【自動】 Gemini API が、自由記入の仕様を単価表の区分の候補に読み替え、確認事項を返す
- 【自動】 スクリプトが、区分が1つに決まった仕様で単価表を引き、本体と加工の金額を計算する
- 【自動】 候補が複数ある仕様は、候補ごとに計算して金額の幅にする
- 【自動】 納期が工場の標準の日数より短ければ「納期確認」の印を付ける
- 【自動】 概算と確認事項を入れた返信を Gmail の下書きにし、回答の行に下書きの作成を記録する
- 【人】 営業の担当が下書きを開き、読み替えと金額と確認事項を確かめて直す
- 【人】 「納期確認」の印があれば工場に確かめ、返信を送る
8番目が、この設計の分かれ目です。 人が見るのは、読み替えの結果と金額の幅と確認事項の3つです。ゼロから書いていた返信が、直す作業に変わります。
4番目と5番目をスクリプトにしているのも、意図してのことです。 金額は単価表と部数の段階で決まる計算で、AIに計算させる理由がありません。計算を表とスクリプトに置けば、単価表を改定したときに直すのは表だけです。
02今回想定するシステム構成
Googleフォーム(見積依頼) │ 回答の送信 ▼【トリガー】スプレッドシートのフォーム送信 Google Apps Script ├──▶ 選択肢の欄を単価表の区分に当てる ▼ Gemini API ── 自由記入の仕様を区分の候補に読み替え、確認事項を返す(JSON) ▼ Google Apps Script ├──▶ 単価表を引いて本体と加工の金額を計算(候補が複数なら幅) ├──▶ 納期と工場の標準の日数を比べて印を付ける ▼ Gmail の下書き(概算と確認事項) ▼ 【人が確認】営業の担当 → 工場に納期の確認 → 送信
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Python |
| 生成AI | Gemini API(仕様の読み替えと確認事項・返信の文面) | Claude API、OpenAI API |
| 差異計算 | Google Apps Script(単価表の表引きと金額の幅) | Python |
| 保管 | スプレッドシート(回答・単価表・読み替えの辞書) | Google ドライブ上の CSV |
新しく足すものは、スクリプトと Gemini API の有料の利用枠だけです。 フォーム、回答のスプレッドシート、単価表、Gmail はいま使っているものです。最初の準備は、単価表の区分に ID を振ることです。 用紙なら「コート 90kg」「コート 110kg」のように、AIが選ぶ先を一覧として固定します。
起点になるのは、Apps Script のインストール型トリガーです。 公式の説明では、フォーム送信のトリガーには、Googleフォーム用と、フォームが回答を送るスプレッドシート用があります。本記事は、回答のスプレッドシートに置く形にします。 回答の行の隣に、読み替えの結果や下書きの作成の記録を書けるからです。インストール型トリガーは作成した人のアカウントで動くので、営業部の共用アカウントで作ります。 下書きもそのアカウントの Gmail にできます。
読み替えには、Gemini API の構造化出力を使います。 公式のページでは、/v1beta/interactions に送る要求で、response_format に MIME の種類 application/json とスキーマ(schema)を指定する形が示されています。JSON Schema のうち使えるのは一部で、enum、required、数の minimum・maximum などが挙げられています。
03どうやって実装するのか
処理の起点を決める
回答のスプレッドシートのフォーム送信をきっかけにします。 依頼が届いた直後に動くので、営業の担当が下書きを開くときには、読み替えと金額がそろっています。 相見積もりでは返信の早さが効くので、1日1回の定時実行にはしません。
処理は1件ずつ行い、回答の行の「処理状態」の列に「下書き済み」「要確認」「失敗」を書きます。 失敗した行は、1時間ごとの時間主導型のトリガーで拾い直します。処理状態が空のまま残っている行が、未処理の数です。
単価表の改定は、トリガーの外で行います。単価表のシートに改定日の列を持ち、計算に使った改定日を回答の行に残します。 改定の前後で同じ依頼の金額が違っても、どちらの表で出したかが分かります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 見積依頼 | 品目、サイズ、部数、用紙、色数、加工、納期、入稿の形、自由記入、連絡先 | フォーム送信のイベントと回答の行 |
| 単価表 | 品目×サイズ×用紙×色数ごとの、部数の段階ごとの単価 | スプレッドシート |
| 加工の表 | 加工の種類ごとの加算の単価と最低料金 | スプレッドシート |
| 区分の一覧 | 用紙・サイズ・加工の区分ID、名称、依頼でよく使われる言い方 | スプレッドシート(読み替えの辞書) |
| 工場の標準の日数 | 品目と部数の段階ごとの、入稿から出荷までの標準の営業日数 | スプレッドシート |
| 聞くべき点の一覧 | 品目ごとに、依頼に無ければ必ず聞く項目 | スプレッドシート |
区分の一覧は、たとえば次のような形にします。
| 区分ID | 種類 | 名称 | 依頼でよく使われる言い方 |
|---|---|---|---|
| coat_90 | 用紙 | コート紙 90kg | つるつる、光沢、チラシの普通の紙 |
| coat_135 | 用紙 | コート紙 135kg | つるつるで厚め、しっかりした紙 |
| matte_110 | 用紙 | マットコート紙 110kg | 光らない、落ち着いた感じ |
| fold_2 | 加工 | 二つ折り | 半分に折る、二つ折り |
| pp_gloss | 加工 | PP加工(グロス) | 表面を光らせる、ラミネートのような |
質を決めるのは、区分の一覧と聞くべき点の一覧です。 区分の一覧に「つるつる」「光沢」がコート紙の言い方として載っていれば、読み替えは安定します。ベテランの担当の頭の中にあった読み替えを、この一覧に書き出すのが最初の作業です。
聞くべき点の一覧を表で持つのは、品目ごとに違うからです。 冊子ならページ数と綴じ方、名刺なら人数と両面か、ポスターなら掲示場所(屋外か)。一覧にあって依頼に無い項目は、AIに判断させず、スクリプトが確認事項に入れます。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 回答の各欄 | フォーム送信のイベントが持つ回答と行の番号 | 選択肢の欄は区分IDへ直接当てる |
| 自由記入と備考 | 同じ回答 | Gemini API へ |
| 区分の一覧 | 読み替えの辞書のシート | AIに渡す選択肢と、enum の値 |
| 単価と加算 | 単価表・加工の表のシート | 金額の計算 |
| 標準の日数 | 工場の標準の日数のシート | 「納期確認」の印 |
選択肢の欄は、AIに渡しません。 「A4」「1,000部」「4色」のように選択肢で答えられた欄は、区分IDへの対応表で決まります。AIに通すと、正しい値が書き換わる余地が増えるだけです。 AIに渡すのは、自由記入の欄と備考、それに選択肢の欄の値(読み替えの手がかりとして)です。
区分の一覧は、品目で絞ってから渡します。 名刺の依頼に冊子用の用紙まで渡すと、選ぶ先が増えて読み替えがぶれます。
AIへ渡す前に整形する
- 品目の確定 … 品目の欄で、使う単価表と区分の一覧を決めます。「その他」なら読み替えをせず人へ回します
- 文字の正規化 … 全角の数字を半角に、「1000」「1,000」「千部」を数にそろえます
- 部数の確認 … 単価表の部数の段階の範囲外(極端に少ない・多い)は、計算をせず人へ回します
- 納期の日付化 … 「○月○日必着」は日付に、「なるべく早く」は空にして確認事項へ回します
- 聞くべき点の照合 … 聞くべき点の一覧と回答を比べ、欠けている項目を確認事項の候補にします
- 区分の一覧の作成 … 品目に合う区分のIDと名称と言い方を、スキーマの
enumとプロンプトに入れます
6番目を軽く見ないでください。 区分IDを enum にしておけば、単価表に無い区分IDが返ってくることがありません。 表に無い区分で金額を出そうとして、計算が止まる失敗を前もって消せます。
AIに処理させる
させるのは、自由記入の仕様を区分IDの候補に読み替えることと、確認事項と返信の文面を書くことです。
| 読み替えるもの | 読み替え方 | 1つに決まらないときの扱い |
|---|---|---|
| 用紙 | 区分の一覧から選び、根拠の文字列を写す | 候補を複数返す(最大3つ)。ambiguous |
| 仕上がりのサイズ | 定型サイズの区分。「広げてA3、折ってA4」は仕上がりで選ぶ | 仕上がりか広げたサイズか不明なら ambiguous |
| 色数 | 片面・両面と色数 | 書かれていなければ missing |
| 加工 | 折り・綴じ・PP加工・穴あけなどの区分 | 種類が決まらなければ ambiguous |
| 確認事項 | 上の ambiguous・missing と、聞くべき点の欠けを質問文にする | - |
| 返信の文面 | 概算の金額は差し込み位置だけを置き、数字を書かない | - |
最後の行が、この構成でいちばん大事な決まりです。 返信の文面には、金額を {estimate} のような差し込み位置として置かせ、数字はスクリプトが計算した値を後から入れます。 AIが文面の中で金額を書くと、計算した値と違う数字が紛れ込む余地が残ります。
| させないこと | 理由 |
|---|---|
| 金額の計算 | 単価表と部数の段階で決まる。スクリプトが行う |
| 区分の一覧に無い仕様の創作 | 表に無い区分は金額を出せない。人へ回す |
| 納期の約束 | 工場の混み具合で決まる。「確認します」までにする |
| 値引き・特急料金の提示 | 営業の担当が決める |
| 印刷の可否の判断 | 入稿のデータを見るまで分からない |
2行目がいちばん起きやすい失敗です。 「和紙風の紙」のように区分の一覧に無い言い方が来ると、AIは近い区分を選んで埋めたがります。埋めると、扱っていない紙の金額を答えたことになります。 区分の一覧に無いものは「該当なし」と返させ、人に回します。
指示内容を固定する
あなたは印刷会社の営業部で、Webの見積依頼の仕様を自社の単価表の区分に読み替える担当です。
依頼に書かれていることだけをもとに判断してください。推測で埋めないでください。
【やること】
1. 自由記入と備考に書かれた用紙・サイズ・色数・加工を、【区分の一覧】の区分IDに読み替える
2. 読み替えの根拠にした依頼の文字列を evidence にそのまま写す
3. 1つに決まらないものは、候補を最大3つまで並べ、status を ambiguous にする
4. 書かれていないものは status を missing にする
5. ambiguous と missing のものと、【聞くべき点の欠け】を、依頼者に尋ねる質問文にする
6. 返信の文面を書く
【厳守事項】
- 区分IDは【区分の一覧】にあるものだけを使ってください。
一覧に当てはまらない言い方(例:和紙風、金色の箔)は、status を not_in_list にし、
候補を作らないでください。
- 金額を計算しないでください。返信の文面の中にも数字の金額を書かないでください。
金額を書く位置には {estimate} とだけ書いてください。
- 納期に間に合うとは書かないでください。「工場の予定を確認のうえ、改めてご連絡します」
の趣旨にとどめてください。
- 値引き、特急料金、印刷の可否には触れないでください。
- 質問は1つの文で1つのことだけを尋ね、依頼者が選びやすいよう選択肢を添えてください。
- 印刷の用語を使うときは、依頼者の書いた言い方を括弧で添えてください。
- 返信の文面は、依頼者の名前の宛名から始め、概算であることを最初に断ってください。
【依頼の選択肢の欄】{selected_fields}
【自由記入と備考】{free_text}
【区分の一覧】{category_list}
【聞くべき点の欠け】{missing_checklist}
「金額を書く位置には {estimate} とだけ書く」を明記しないと、数字を書きます。 単価表を渡していなくても、印刷の相場らしい金額を文面に入れることがあります。禁じるのは、金額の数字を文面で作ることそのものです。
「一覧に当てはまらない言い方は候補を作らない」も同じ理由です。 何も言わなければ、いちばん近い区分を候補の1つ目に置き、扱っていない仕様の金額が概算として出ていきます。
出力形式を固定する
次の形のJSONで受け取ります。
{
"specs": [
{ "field": "paper | size | color | finishing",
"status": "ok | ambiguous | missing | not_in_list",
"candidates": ["coat_110", "coat_135"],
"evidence": "つるつるした少し厚めの紙" }
],
"questions": [ "" ],
"reply_body": "",
"needs_human": false
}
1つ目の理由は、candidates を区分IDの配列にしておけば、金額の幅がそのまま計算できることです。 候補が1つならその金額、2つ以上なら最小と最大を出します。スキーマで区分IDを enum にしておけば、表に無いIDは返りません。
2つ目は、status で人へ回すかを機械的に決められることです。 not_in_list が1つでもあれば needs_human を立て、下書きを作らずに担当へ回します。needs_human をAIにも返させますが、スクリプトの側でも status から決め直し、どちらかが立てば人へ回します。
3つ目は、evidence で確認が速くなることです。 担当は、どの言い方をどの区分と読んだかを、依頼を開き直さずに読めます。
スクリプトは reply_body の {estimate} に、計算した金額(幅の場合は「○円〜○円(税別)」)を入れてから下書きにします。{estimate} が文面に無いか、2つ以上あれば、下書きを作らずに人へ回します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 回答のスプレッドシート | フォーム送信のトリガー、SpreadsheetApp | 回答を受け、処理状態と結果を書く |
| 単価表・加工の表・区分の一覧 | SpreadsheetApp(読み取り) | 区分の対応と金額の計算 |
| Gemini API | UrlFetchApp で /v1beta/interactions を呼ぶ | 読み替えと確認事項と返信の文面 |
| Gmail | GmailApp の createDraft | 返信の下書きを作る |
| 基幹の受注システム | つながない | 正式な見積から先は既存の経路 |
Gemini API への要求は、次のような本体を UrlFetchApp で POST します(キーは x-goog-api-key のヘッダーに入れます)。
{
"model": "<利用するGeminiのモデル>",
"input": "(プロンプトの全文。依頼の欄・自由記入・区分の一覧・聞くべき点の欠けを差し込んだもの)",
"response_format": {
"type": "text",
"mime_type": "application/json",
"schema": { "type": "object", "properties": { "specs": {}, "questions": {}, "reply_body": {}, "needs_human": {} },
"required": ["specs", "questions", "reply_body", "needs_human"] }
}
}
schema の中身は前の小見出しの形を JSON Schema で書いたもので、candidates の要素は品目ごとの区分IDの enum にします。enum の中身は品目ごとに変わるので、スキーマはスクリプトが区分の一覧から毎回組み立てます。 返ってきたテキストを JSON として読めなければ、処理状態を「失敗」にして拾い直しに回します。
メールは送らず、下書きを作ります。 GmailApp の createDraft は、公式の説明では、宛先・件名・本文と追加の引数で下書きを作り、HTML の本文(htmlBody)、送信者の名前(name)、返信先(replyTo)などを指定できます。送信は、担当が下書きを開いて直してから行います。
基幹の受注システムには書き込みません。 この構成が出すのは概算の返信までで、正式な見積と受注は既存の経路です。
公式の割り当ての表では、URL Fetch の呼び出しは個人のアカウントで1日20,000回、Google Workspace のアカウントで1日100,000回、1回の実行は6分までです。月400件なら、どちらにも遠く届きません。 Gemini API のキーはスクリプトのプロパティに置き、コードに書きません。
人が確認する
全件の下書きを担当が開きます。 ただし、見るところを3つに絞ります。
回答のスプレッドシートには、1依頼1行で「区分の読み替え(evidence つき)」「金額(幅)」「質問の数」「印」の列を並べ、担当はまずこの一覧で今日の依頼を眺めてから、下書きを順に開きます。 一覧で見れば、同じ言い方が何件も ambiguous になっていることにも気づけます。
- 読み替えの結果 …
evidenceと選ばれた区分を見比べます。候補が複数のものは、返信の質問で尋ねる形になっているかを見ます - 金額 … 部数の段階と加工の加算が正しく入っているか。幅が大きすぎるときは、候補を絞れないかを考えます
- 確認事項と文面 … 質問の数が多すぎないか。納期の約束や値引きの言葉が入っていないか
「納期確認」の印がある依頼は、工場に確かめてから送ります。 印があるまま送ると、間に合わない納期を引き受けたように読まれます。
needs_human の依頼は、下書きがありません。 担当がゼロから返信を書きます。月に1割前後という想定で、それより多い月は区分の一覧の言い方が足りていません。
目標は、400件をならして1件6分です。 15分のうち、読み替えと表引きが無くなり、直す作業が残ります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 品目が「その他」 | 読み替えをせず、処理状態を「要確認」にして担当へ |
| 部数が単価表の段階の範囲外 | 計算せず「要確認」。大部数は工場の原価で見積る |
not_in_list がある | 下書きを作らず「要確認」 |
| 候補の金額の幅が大きすぎる | 下書きは作るが、件名に「幅大」と付ける |
{estimate} が文面に無い・複数ある | 下書きを作らず「要確認」 |
| 連絡先のメールアドレスの形式が不正 | 下書きを作らず、電話で連絡する一覧へ |
| Gemini API が応答しない | 処理状態を「失敗」。1時間ごとのトリガーで拾い直す |
| 同じ依頼者から同じ内容が二度届く | 同じメールアドレス・品目・部数が24時間以内にあれば「重複の疑い」 |
| 部数が「500か1,000」のように2つ書かれる | 両方の部数で計算し、2行の概算にする。どちらにするかを質問に入れる |
| 返ってきた文面を JSON として読めない | 処理状態を「失敗」。2回続けば「要確認」にして担当へ |
上の3行が大半です。 どれもAIの問題ではなく、単価表と区分の一覧の範囲の問題です。 「要確認」が多い品目は、区分の一覧か単価表を広げる候補です。
記録を残す
- 回答の行(依頼の全項目)と受け取った日時
- AIに渡した区分の一覧の版と、単価表の改定日
- Gemini API が返したJSONの全文
- 計算した金額(候補ごと)と、下書きに入れた金額
- 担当が直した記録 … 区分の読み替えを変えたか、金額を変えたか、質問を足したか削ったか
- 返信した日時と、正式な見積・受注に進んだか
5つ目が、区分の一覧を育てる材料になります。 担当が同じ言い方の読み替えを何度も直しているなら、その言い方を区分の一覧に足します。ベテランの読み替えが、記録を通じて表に移っていきます。
最後の行は、返信の早さが受注に効いているかを見るためのものです。 返信までの時間と受注の有無を並べて、構成の効き目を自社の数字で確かめます。
04実装レベルの3段階
最小構成では件数がさばけません。 確かめるための段階です。 半自動化で、1件15分が6分になり、この段階が本記事の想定です。 読み替えと表引きと確認事項の洗い出しが自動になり、担当は下書きを直して送ります。本格構成で納期の確認も短くなりますが、工場の生産の予定とつなぐ作業は会社ごとの事情が大きく、第10章の数値には入れていません。 段階を飛ばさないでください。 半自動化を1か月回すと、担当が直した読み替えの記録がたまり、区分の一覧の穴が見えてきます。そこを埋めてから本格構成に進みます。
05工数削減シミュレーション
導入後 400件 × 6分 ÷ 60 = 40 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- チラシ・パンフレット・冊子・名刺などの商業印刷を受け、ホームページの見積依頼フォームから月に数百件の依頼が届く印刷会社。単価表はあるが、依頼の「コート紙の厚め」「二つ折りで」のような書き方を単価表の区分に読み替えるのが一部の営業に偏っている場合。返信が翌日以降になり、相見積もりで先に返した会社に決まってしまうことがある場合。Google Workspace を使っており、単価表をスプレッドシートで持てる場合。
- 見積の大半が特殊な加工や大型の案件で、毎回、工程を組んで原価を積み上げる必要がある会社。ネット印刷のように、注文画面で仕様を選ぶと金額がその場で出る仕組みがすでにある場合。見積依頼が月に数十件で、担当者が1件ずつ書いて間に合う場合。なお、正式な見積の金額、値引き、納期の約束は営業の担当と工場が決めるもので、この構成では代替できません。
07最小構成で試す方法
- 先月の見積依頼から30件を選ぶ(自由記入の多いもの、区分の一覧に無い言い方のものを必ず入れる)
- その30件に、当時の担当がどの区分で読み、どんな質問を返したかを並べておく
- 手元のAIサービスの画面に、区分の一覧と依頼を1件ずつ貼り付ける
- 「この依頼の用紙・サイズ・色数・加工を、一覧の区分に読み替えてください。決まらないものは候補を並べ、一覧に無いものは『該当なし』としてください。金額は書かないでください」と指示する
- 出てきた読み替えを、当時の担当の読み替えと突き合わせる
30件は必ずやってください。 スクリプトを書く前に、「区分の一覧で読み替えが安定するか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時の担当と同じ区分を選んだ | スクリプトとフォームの連携に進む |
| 一覧に無い言い方を近い区分で埋めた | 指示の書き方で直る。構成は有効 |
| 候補が多すぎて絞れない | 区分の一覧の言い方が足りない。 AIの問題ではない |
3行目が出ることは珍しくありません。 失敗ではなく、ベテランの頭の中にあった読み替えのうち、まだ表に書かれていないものが見つかったということです。 その言い方を区分の一覧に足し、同じ30件をやり直してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 返信の文面に金額の数字が入る | {estimate} の差し込み位置だけを書かせ、数字はスクリプトが入れる |
| 一覧に無い仕様を近い区分で埋める | not_in_list で返させ、下書きを作らずに人へ |
| 表に無い区分IDが返る | 区分IDをスキーマの enum にする |
| 選択肢の欄までAIが書き換える | 選択肢の欄は対応表で決め、AIの結果で上書きしない |
| 仕上がりと広げたサイズを取り違える | 仕上がりで選ぶと明記し、不明なら ambiguous |
| 部数の段階の境目で金額がずれる | 段階の境目を表に明記し、境目の部数で試験する |
| 納期に間に合うと書いてしまう | 「確認のうえ連絡」の趣旨にとどめると明記し、印で工場に回す |
| 質問が多すぎて返信が長くなる | 質問は1文1問、選択肢を添える。多い依頼は電話に切り替える |
| 単価表の改定の前後で金額が食い違う | 計算に使った改定日を回答の行に残す |
| 個人のアカウントでトリガーを作った | 作成した人のアカウントで動く。営業部の共用アカウントで作る |
| 品目ごとの区分IDを1つのスキーマに全部入れる | 選ぶ先が増えてぶれる。品目で絞ってからスキーマを組み立てる |
| 返信の宛名や署名をAIに書かせる | 氏名を渡さずに済むよう、宛名と署名はスクリプトが差し込む |
上の3行が、この構成の失敗のほとんどです。 どれも「金額や区分が、表の外から入り込む」という同じ形をしています。表に無いものを表に無いまま返せているかどうかで、概算が信用されるかが決まります。
下の2行は、運用を始めてから効いてきます。 品目が増えるほど区分の一覧は長くなり、全部を1つのスキーマに入れると、名刺の依頼に冊子の用紙が候補として出るようになります。区分の一覧は品目ごとに切り分けて持つのが、長く使うための形です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 依頼者の氏名・会社名・電話・メールアドレス、印刷物の内容(チラシの文面や催しの日程が自由記入に書かれることがある)、そして自社の単価表です。
- Gemini API は有料の利用枠で使う … 公式の利用規約では、無料の利用枠(Unpaid Services)に送った内容と応答はサービスの提供・改善・開発に使われ、人が読むことがあるとされ、機密や個人の情報を送らないよう案内されています。有料の利用枠(Paid Services)では、プロンプトと応答を製品の改善に使わず、違反の検知のために限られた期間だけ記録するとされています。依頼者の情報を送るので、有料の利用枠を前提にします
- AIに渡す範囲を、読み替えに要るところまでに限る … 氏名・電話・メールアドレスはAIに渡しません。返信の宛名はスクリプトが差し込みます
- 単価表そのものを渡さない … AIに渡すのは区分の名称と言い方だけで、単価は渡しません。 単価は自社の営業上の情報で、読み替えには要りません
- 返信を自動で送らない … 概算でも、顧客は金額として受け取ります。送信は担当が行います
- 概算であることを文面で断る … 正式な見積は入稿のデータと工場の予定を見てから出すことを、返信の最初に書かせます
- 利用者の年齢に注意する … 公式の利用規約では、API を使う人は18歳以上であることが求められています。見積依頼のフォームと返信は営業部の担当が扱い、依頼者がAIを直接使う形にはしません
誤りが起きた場合のリスクは、扱っていない仕様の金額を答えることと、概算と正式な見積が大きく違うことの2つです。 前者は一覧に無い言い方を埋めると起き、後者は候補が複数あるのに1つを選ぶと起きます。どちらも「読み替えられないものを読み替えられないまま返す」という同じ区別から出ているので、そこだけは設計で守ります。
10まず何から始めるか
1週目:区分の一覧を作る
単価表の用紙・サイズ・加工に区分IDを振り、それぞれに依頼でよく使われる言い方を書き足します。ベテランの担当に、先月の依頼の自由記入を見ながら言い方を挙げてもらうのが早道です。あわせて、品目ごとの聞くべき点の一覧を作ります。
2週目:30件で試す
先月の依頼から30件を選び、手元のAIサービスに区分の一覧と一緒に貼り付けて読み替えさせます。当時の担当の読み替えと突き合わせ、一覧に無い言い方を埋めていないかを最優先で見ます。
3週目:フォームから読み替えと金額までをつなぐ
Apps Script で、回答のスプレッドシートのフォーム送信のトリガーから、Gemini API の読み替えと単価表の計算までを作り、結果を回答の行に書きます。この時点では下書きを作らず、読み替えと金額を担当が見比べます。
4週目:返信の下書きを足す
確認事項と返信の文面を足し、Gmail の下書きにします。担当が直した箇所を記録し、2週間分を見返します。
2か月目: 直した読み替えを区分の一覧に書き足し、needs_human の割合を毎週数えます。3か月目以降: 1件15分が何分になったかを実測し、返信までの時間と受注の有無を並べます。経験の浅い担当が、ベテランに聞かずに下書きを直して送れるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| インストール型トリガーにフォーム送信(Googleフォーム用とスプレッドシート用)と時間主導型があること。インストール型トリガーは作成した人のアカウントで動くこと | Google for Developers: Installable Triggers | 2026-10-14 |
GmailApp の createDraft が宛先・件名・本文と追加の引数で下書きを作り、htmlBody・name・replyTo などを指定できること | Google for Developers: Class GmailApp | 2026-10-14 |
| URL Fetch の呼び出しが個人1日20,000回・Workspace 1日100,000回、1回の実行が6分までであること | Google for Developers: Quotas for Google Services | 2026-10-14 |
構造化出力の要求を /v1beta/interactions に送り、response_format に MIME の種類 application/json とスキーマ(schema)を指定すること。使える JSON Schema が一部で、enum・required・minimum・maximum などが挙げられていること | Gemini API: Structured outputs | 2026-10-14 |
| 無料の利用枠では送った内容と応答が製品の改善に使われ人が読むことがあり、機密や個人の情報を送らないよう案内されていること。有料の利用枠ではプロンプトと応答を製品の改善に使わず、違反の検知のため限られた期間だけ記録すること。API の利用者が18歳以上であること | Gemini API Additional Terms of Service | 2026-10-14 |
正式な見積の金額と納期は、自社の営業と工場で決めてください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1479)についてのご相談はこちらから。
