撮影・映像制作の見積依頼から、過去の見積と単価表を使って見積書の明細案を作る
撮影や映像制作の見積依頼を読み、似た過去の見積を手がかりに、見積書に載せる項目と数量の明細案を作ります。単価はプログラムが単価表から引き、依頼に足りない情報は広告主への質問にまとめます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Python
- 対象業界
- IT・SaaS/その他/広告
- 対象部門
- 営業
- 対象業務
- 情報検索/書類作成
- 主な課題
- 判断に時間がかかる/属人化している/書類作成に時間がかかる
- AIで行う処理
- 生成
- 主な効果
- 対応スピード向上/属人化解消/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 営業が広告主から依頼を受け、内容をメモする
- 見積台帳を開き、似た案件の過去の見積を探す。探し方は、案件名の検索と、担当者の記憶
- 見つけた過去の見積をコピーし、今回の依頼に合わせて項目を足したり消したりする
- 撮影日数、スタッフの人数、編集の日数などの数量を決める
- 単価表を見て単価を入れ、金額を計算する
- 依頼に書かれていなかった条件(尺、媒体、期間など)は、仮置きしてメモを残す
- プロデューサーが明細を見て、抜けと数量を確かめ、掛率を決める
- 見積書を広告主へ送る。仮置きした条件は、送ったメールの本文で確かめる
- 人営業が依頼の内容を見積依頼のフォームに入力する。企画書があれば本文を貼る
- 自動フォームの送信をきっかけにスクリプトが動き、案件の種類・尺・撮影の場所で見積台帳から似た過去の見積を3件選ぶ
- 自動AIが依頼と過去の見積を読み、載せる項目の項目コードと数量と根拠を書き出す
- 自動AIが、依頼に書かれていない条件を広告主への質問にする
- 自動スクリプトが項目コードで単価表から単価を引き、数量と掛けて金額を出す
- 自動見積書の雛形をコピーし、明細案と質問を書き込み、営業に知らせる
- 人営業が明細案を確かめ、項目と数量を直す
- 人プロデューサーが確かめ、掛率を決める
- 人質問を広告主へ送り、返事を受けて見積書を仕上げる
各工程の詳しい説明を読む
- 営業が広告主から依頼を受け、内容をメモする
- 見積台帳を開き、似た案件の過去の見積を探す。探し方は、案件名の検索と、担当者の記憶
- 見つけた過去の見積をコピーし、今回の依頼に合わせて項目を足したり消したりする
- 撮影日数、スタッフの人数、編集の日数などの数量を決める
- 単価表を見て単価を入れ、金額を計算する
- 依頼に書かれていなかった条件(尺、媒体、期間など)は、仮置きしてメモを残す
- プロデューサーが明細を見て、抜けと数量を確かめ、掛率を決める
- 見積書を広告主へ送る。仮置きした条件は、送ったメールの本文で確かめる
(a)似た案件の探し方が人に付いている。 「去年のあの化粧品の動画に近い」と思い出せる担当は速く、思い出せない担当は台帳を上から見ていきます。同じ依頼でも、探し出す過去の見積が担当者によって違います。
(b)抜けに気づくのが撮影の後。 屋外の撮影で予備日を入れ忘れる、人物の撮影でヘアメイクを入れ忘れる、Web用なのに縦型の書き出しを入れ忘れる。撮影が終わってから追加の費用を説明することになり、広告主との関係に響きます。 7番目のプロデューサーの確認で拾えることもありますが、確認する側も忙しい月は見落とします。
(c)仮置きが見積書に残る。 使用する期間が書かれていない依頼に、担当者が「1年」と仮置きして金額を出すと、広告主はその金額を前提に予算を取ります。 実際は3年使うつもりだった、と分かるのは契約の直前です。
(d)同じ依頼の再見積が多い。 「尺を15秒に縮めたら」「ロケをスタジオにしたら」という条件違いの見積を、毎回ほぼ一から組み直しています。
- 【人】 営業が依頼の内容を見積依頼のフォームに入力する。企画書があれば本文を貼る
- 【自動】 フォームの送信をきっかけにスクリプトが動き、案件の種類・尺・撮影の場所で見積台帳から似た過去の見積を3件選ぶ
- 【自動】 AIが依頼と過去の見積を読み、載せる項目の項目コードと数量と根拠を書き出す
- 【自動】 AIが、依頼に書かれていない条件を広告主への質問にする
- 【自動】 スクリプトが項目コードで単価表から単価を引き、数量と掛けて金額を出す
- 【自動】 見積書の雛形をコピーし、明細案と質問を書き込み、営業に知らせる
- 【人】 営業が明細案を確かめ、項目と数量を直す
- 【人】 プロデューサーが確かめ、掛率を決める
- 【人】 質問を広告主へ送り、返事を受けて見積書を仕上げる
5番目を、AIではなくスクリプトにしているのが、この設計の要です。 AIが出すのは項目コードと数量だけで、金額の列にAIの出力は一度も入りません。 AIが単価を覚え違えても、見積書の金額は単価表のとおりです。
4番目の質問は、見積書の本文とは別の欄に書きます。 仮置きの条件で金額を出さず、「使用期間が決まるまで、出演者の使用料は別途」と明細に書いたうえで質問を添えます。広告主が仮置きの金額で予算を取ってしまうことを防ぎます。
02今回想定するシステム構成
見積依頼のフォーム(営業が入力) ▼【トリガー】フォームの送信 Google Apps Script ├──▶ 見積台帳から似た過去の見積を3件選ぶ(種類・尺・撮影の場所) ▼ Claude API ── 項目コードと数量と根拠、広告主への質問 │ ① 載せる項目 ② 数量 ③ 根拠 ④ 別途扱い ⑤ 質問 ▼ Google Apps Script ├──▶ 単価表から単価を引き、金額を計算 ├──▶ 項目コードが単価表に無いものに印 ▼ 見積書の雛形をコピーして書き込む(スプレッドシート) ▼ 【営業・プロデューサーが確認し、掛率を決める】 ▼ 広告主へ送付(人)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Python、Make |
| 生成AI | Claude API(項目と数量の洗い出しと、質問の作成) | OpenAI API、Gemini API |
| 受付 | Google フォーム | Microsoft Forms |
| 見積台帳・単価表・見積書 | Google スプレッドシート | Microsoft Excel、販売管理システム |
| 通知 | Gmail | Google Chat |
新しく足すのはスクリプトとAIの利用だけです。 見積台帳、単価表、見積書の雛形は、いまあるスプレッドシートをそのまま使います。最初の準備は、単価表の項目コードを見積台帳の明細にも付けることです。 名前だけで結びついていると、AIが挙げた項目を単価表で引けません。
実行の土台は、Google Apps Script のインストール型トリガーです。 フォームの送信で動くトリガーがあり、Google フォームの側に付けるものと、回答を受けるスプレッドシートの側に付けるものが別に用意されています。 インストール型トリガーは、作った人のアカウントで動くとされているため、営業の誰が送信しても、スクリプトは作った人の権限で見積台帳を読みます。
AIの呼び出しは、UrlFetchApp.fetch です。 外部のURLへ HTTP の要求を送る機能で、method、contentType、payload、headers を指定できます。muteHttpExceptions を true にすると、失敗の応答でも例外を投げずに応答を受け取れるので、エラーの中身を記録に残せます。
気をつけるのは実行時間の上限です。 Apps Script は1回の実行が6分までで、トリガーの合計の実行時間は1日あたり、一般のアカウントで90分、Google Workspace で6時間とされています。1件の見積依頼を1回の実行で処理する形なら、十分に収まります。
03どうやって実装するのか
処理の起点を決める
見積依頼のフォームの送信を起点にします。 スプレッドシートの側にフォームの送信のトリガーを付け、回答の1行が増えるたびに動かします。
依頼をメールから直接読み取る形にはしません。 依頼の書き方がばらばらで、見積に必要な条件がどこに書かれているかが決まらないからです。営業がフォームに書き写す手間は残りますが、そのときに「尺は聞いたか」「媒体は聞いたか」を営業自身が確かめる機会になります。 フォームの項目に、尺、使用する媒体、使用する期間、納品の形式、撮影の希望日を並べておきます。
再見積は、同じフォームに「元の見積番号」の欄を設けて受けます。 元の見積番号があれば、似た過去の見積を探す代わりに元の見積の明細を渡し、変わった条件だけを書かせます。
フォームの送信から見積書の下書きまでを、1回の実行で終えます。 途中で止まった場合に備えて、回答の行に「処理の状態」の列を持ち、処理済み になった行はもう一度動いても処理しません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 見積依頼 | 案件の種類(静止画/動画)、尺、カット数、撮影の場所(スタジオ/ロケ)、人物の有無、使用する媒体、使用する期間、納品の形式、希望日、企画書の本文 | フォームの回答 |
| 似た過去の見積 | 選んだ3件の明細(項目コード、項目名、数量、単位)と、その案件の条件 | 見積台帳 |
| 単価表 | 項目コード、項目名、単位、単価、「外部見積が要る」の印 | 単価表のシート |
| 項目の一覧 | 単価表の項目コードと項目名だけを抜き出したもの | 単価表のシート |
| 元の見積(再見積のとき) | 元の見積番号の明細と条件 | 見積台帳 |
AIへ渡す単価表は、項目コードと項目名だけにします。 単価は渡しません。単価を渡すと、AIは合計の予算感に合わせて数量を調整しようとします。 数量は案件の条件で決まるもので、金額から逆算するものではありません。
「外部見積が要る」の印は、単価表で持ちます。 出演者、ロケ地の使用料、特殊な機材、楽曲の使用料などは、案件ごとに外部の見積を取らないと金額が決まりません。この印の付いた項目は、金額を入れずに「別途」として明細に載せます。
データの取得方法を決める
似た過去の見積は、スクリプトの中で点数を付けて選びます。 ベクトル検索のような仕組みは使いません。見積台帳の列で比べれば足ります。
| 比べる列 | 点数の付け方 |
|---|---|
| 案件の種類 | 一致すれば3点 |
| 撮影の場所 | 一致すれば2点 |
| 人物の有無 | 一致すれば2点 |
| 尺 | 差が15秒以内なら2点、30秒以内なら1点 |
| 見積の日付 | 直近1年以内なら1点 |
点数の高い順に3件を選びます。 同じ点数なら新しいものを選びます。1件ではなく3件にしているのは、1件だけだとその案件の特殊な項目まで引き継いでしまうからです。 3件に共通する項目は載せる候補として強く、1件にしか無い項目は根拠を確かめる対象になります。
再見積のときは、この点数付けを使いません。 フォームの「元の見積番号」で見積台帳を引き、元の見積の明細と条件をそのまま渡します。 似た過去の見積を混ぜると、元の見積に無かった項目が紛れ込み、「尺を縮めただけなのに項目が増えた」という見積になります。再見積で変わるのは条件だけで、比べる相手は元の見積だけです。
見積台帳の読み込みは、必要な列だけにします。 5,000件分の明細をすべて読むと時間がかかるので、案件ごとの条件の列で先に絞り、選んだ3件の明細だけを読みます。
AIへ渡す前に整形する
- フォームの回答の空欄を確かめる … 尺、媒体、期間、納品の形式が空かどうかを記録します。空のまま進め、AIに質問を作らせます
- 企画書の本文を整える … 貼られた本文から、あいさつや会社の紹介の部分を落とします
- 過去の見積の明細を項目コードでそろえる … 項目コードの無い古い明細は、項目名で単価表と照らし、当たらないものは渡さずに除きます
- 過去の見積の単価と金額の列を落とす … AIへは数量と単位までを渡します
- 項目の一覧を添える … AIが選べるのは、この一覧にある項目コードだけです
4番目は、第7章の入力データで単価表の単価を渡さないのと同じ理由です。 過去の見積に金額が付いていると、AIは「前回と同じくらいの金額にする」方向で数量を寄せます。 金額の列を落とすだけで、この寄せ方は起きなくなります。
AIに処理させる
させるのは、項目と数量を選び、その根拠を書き、足りない条件を質問にすることです。
| させること | 中身 | 判断できないときの扱い |
|---|---|---|
| 載せる項目を選ぶ | 項目の一覧から、今回の依頼に要るものを選ぶ | 一覧に当たるものが無ければ not_in_list として名前だけ書く |
| 数量を決める | 撮影日数、人数、編集の日数、書き出しの本数など | 依頼から決まらなければ quantity_basis を「未確定」にする |
| 根拠を書く | 依頼のどの記載、または過去の見積の何件目から選んだか | - |
| 抜けの候補を挙げる | 過去の見積3件にあって、今回の依頼で要るか決まらない項目 | 載せずに consider に並べる |
| 質問を作る | 依頼に書かれていない条件ごとに1問 | - |
「抜けの候補」を明細とは別に出させるのが、この表の要点です。 過去の見積に予備日があったが今回は屋外か分からない、というとき、載せれば金額が膨らみ、載せなければ抜けます。 どちらにするかは営業が決めるので、AIには候補として並べさせるだけにします。
| させないこと | 理由 |
|---|---|
| 単価・金額の決定 | 単価表と計算はスクリプトの仕事 |
| 値引き・掛率の提案 | 広告主との関係で決まる。プロデューサーが決める |
| 書かれていない条件の仮置き | 使用する媒体と期間は使用料に直結する |
| 一覧に無い項目コードの作成 | 単価表で引けない項目が見積書に紛れ込む |
| 出演者や楽曲の使用料の見込み | 外部の見積が要る。「別途」にする |
3行目が、いちばん起きやすい失敗です。 使用期間が空欄の依頼を渡すと、AIは「一般的には1年」と仮置きして数量を決めます。その1年が見積書に残ると、第3章の(c)がそのまま起きます。
指示内容を固定する
あなたは広告制作会社で、撮影・映像制作の見積の明細を組む立場です。
渡す見積依頼と、似た過去の見積3件だけを見て組んでください。
推測で条件を補わないでください。
【やること】
1. 項目の一覧から、今回の依頼に要る項目を選び、item_code と数量を
書いてください。一覧に無い項目が要ると考えたときは、item_code を
"not_in_list" とし、item_name に名前を書いてください。
2. 数量ごとに、根拠を basis に書いてください。
依頼の記載から決めたときは、その記載をそのまま写してください。
過去の見積から決めたときは、何件目の見積かを書いてください。
3. 過去の見積にあって、今回要るかどうか依頼からは決まらない項目は、
明細に入れず consider に並べ、要るかどうかを決める条件を書いてください。
4. 依頼に書かれていない条件について、広告主への質問を1問ずつ
questions に書いてください。特に、尺、使用する媒体、使用する期間、
納品の形式、撮影の場所が空欄なら、必ず質問にしてください。
【厳守事項】
- 単価、金額、値引き、掛率を書かないでください。
- 書かれていない条件を仮に決めないでください。
「一般的には」「通常は」を根拠にしないでください。
条件が決まらない数量は quantity_basis を "未確定" にしてください。
- 項目の一覧に無い item_code を作らないでください。
- 単価表で「外部見積が要る」の印がある項目は、数量だけを書き、
external を true にしてください。
- 過去の見積の特殊な項目(その案件だけの事情によるもの)を、
そのまま引き継がないでください。3件中1件にしか無い項目は、
明細ではなく consider に入れてください。
- 再見積のときは、元の見積から変わった条件に関わる項目だけを
changes に書いてください。
【見積依頼】{request}
【空欄だった条件】{blank_fields}
【似た過去の見積(3件)】{past_quotes}
【項目の一覧(項目コードと項目名)】{item_list}
【外部見積が要る項目】{external_items}
【元の見積(再見積のとき)】{original_quote}
「一般的には」を根拠にしないと書いているのは、AIが仮置きするときにこの言い回しを使うからです。 言い回しを名指しで禁じると、仮置きの根拠を書けなくなり、「未確定」に回るようになります。
「3件中1件にしか無い項目は consider に」は、過去の特殊な案件を引き継がないための指示です。 3件のうち1件が雪山のロケだったからといって、今回の見積に防寒の機材が載っていては困ります。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力で、output_config.format に JSONスキーマを指定して返させます。
{
"request_id": "",
"lines": [
{
"item_code": "",
"item_name": "",
"quantity": 0,
"unit": "",
"quantity_basis": "確定 | 未確定",
"basis": "",
"external": false
}
],
"consider": [
{ "item_code": "", "item_name": "", "condition": "" }
],
"questions": [
{ "field": "duration | media | period | delivery | location | other", "question": "" }
],
"changes": []
}
1つ目の理由は、金額の列にAIの出力を入れないで済むことです。 lines には単価も金額も無いので、スクリプトは item_code で単価表を引き、quantity と掛けるだけです。AIの出力の形そのものが、金額を書けないようにできています。
2つ目は、quantity_basis で未確定の数量を分けられることです。 未確定 の行は、見積書では数量の欄を空けて「条件確定後にお見積り」と書きます。仮置きの数量で金額を出すことがなくなります。
3つ目は、questions の field で、質問を条件ごとにまとめられることです。 広告主へのメールには、媒体と期間の質問を先に並べます。使用料に響く条件から答えてもらうためです。
たとえば「新商品の紹介動画、30秒、スタジオ、人物あり、使用する媒体と期間は空欄」という依頼なら、下書きは次のようになります。
| 項目 | 数量 | 金額の欄 | 根拠・扱い |
|---|---|---|---|
| ディレクター | 3日 | 単価表から計算 | 過去の見積3件すべてにある |
| カメラマン | 1日 | 単価表から計算 | 依頼の「撮影は1日で」を写す |
| スタジオ使用料 | 1日 | 単価表から計算 | 依頼の「スタジオ」を写す |
| ヘアメイク | 1名・1日 | 単価表から計算 | 人物ありのため。過去の見積2件にある |
| 編集 | 未確定 | 空欄 | 尺の書き出しの本数が決まらない |
| 出演者 | 1名 | 別途 | 外部見積が要る。使用期間で変わる |
| 候補:縦型の書き出し | - | - | 媒体がWebのSNSなら要る |
| 質問 | - | - | 使用する媒体と期間、書き出しの本数 |
出演者の行は、数量だけが入り金額は「別途」になります。 使用する媒体と期間が決まり、外部の見積が取れた時点で、営業が金額を入れます。
スクリプトの側で確かめることもあります。
| 確かめること | 対応 |
|---|---|
item_code が単価表にあるか | 無ければ明細の行に印を付け、金額を空ける |
not_in_list の行 | 金額を空けて印を付け、営業が項目コードを付けるか決める |
quantity が0以下 | 印を付ける |
external が true | 金額に「別途」と入れる |
構造化出力では、数値の範囲の制約をスキーマに書けないとされているため、数量が0以下でないかはスクリプトの側で確かめます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 見積依頼のフォーム | フォームの送信のトリガー | 回答の1行ごとにスクリプトを動かす |
| 見積台帳 | スプレッドシートの読み取り | 似た過去の見積3件と、元の見積を読む |
| 単価表 | スプレッドシートの読み取り | 項目の一覧、単価、外部見積の印を読む |
| Claude API | UrlFetchApp.fetch | 明細案と質問をJSONで返す |
| 見積書 | 雛形のコピーと書き込み | 明細、金額、質問を書き込む |
| Gmail | メールの送信 | 営業に「下書きができた」と知らせる |
見積台帳には書き込みません。 見積台帳に載るのは、広告主へ送った確定の見積だけです。下書きの段階で書き込むと、似た過去の見積を探すときに、確かめていない明細が参考として選ばれてしまいます。
広告主へはメールを送りません。 知らせる先は社内の営業だけで、見積書を送るのも、質問を送るのも営業です。
人が確認する
- 営業が
considerを判断する … 候補として並んだ項目を、載せるか外すか決めます。予備日、ヘアメイク、縦型の書き出しなどがここに並びます - 営業が
未確定の行を確かめる … 数量が空いている理由が、質問に対応しているかを見ます - 営業が根拠を読む …
basisを見て、数量の決め方が今回の依頼に合っているかを確かめます - プロデューサーが明細を確かめ、掛率を決める … 金額はここで初めて見積として確定します
- 営業が質問を広告主へ送る … 質問の言い方は、広告主に合わせて直します
1番目が、この構成の価値のほとんどです。 抜けやすい項目が、営業が思い出すかどうかに関係なく、候補として目の前に並びます。 載せるかどうかの判断は残りますが、思い出す作業はなくなります。
目標は、1件あたり12分です。 明細を一から組む作業がなくなり、確かめる・選ぶ・直す作業だけが残る想定です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 似た過去の見積が1件も見つからない | 過去の見積を渡さずに、項目の一覧だけで組ませる。見積書に「過去事例なし」と表示する |
| 依頼の条件がほとんど空欄 | 明細を組まずに、質問だけを返す。営業が聞き直してから再送信する |
item_code が単価表に無い | 金額を空けて印を付ける |
| 単価表の単価が空欄 | 金額を空けて印を付け、単価表の担当に知らせる |
| AIの応答がエラー | muteHttpExceptions で応答を受け、回答の行に「失敗」と記録して営業に知らせる |
| 実行が6分を超えそう | 1件ずつの処理にしてあるので通常は起きない。企画書の本文が極端に長いときは要点だけ貼ってもらう |
| 同じ依頼が二度送信される | 回答の行の処理の状態を見て、処理済みなら動かない |
| トリガーを作った人が退職する | インストール型トリガーは作った人のアカウントで動く。共用の管理用アカウントで作っておく |
最後の行は、見落とされがちです。 インストール型トリガーは作った人のアカウントで動くので、その人のアカウントが止まると、見積の下書きも止まります。 誰のアカウントで作ったかを記録に残しておきます。
記録を残す
- フォームの回答と、空欄だった条件
- 選んだ過去の見積3件の見積番号と、その点数
- AIへ渡した入力と、返ってきたJSONの全文
- 作った見積書の下書きのファイル
- 営業とプロデューサーが直した記録 … 足した項目、消した項目、変えた数量
- 広告主へ送った最終の見積書の見積番号
選んだ過去の見積の番号を残すのは、明細案の根拠をたどるためです。 数量の根拠が「2件目の見積」なら、その見積を開いて確かめられます。
直した記録は、単価表と点数の付け方を直す材料になります。 同じ項目を毎回足しているなら、それは過去の見積に無い項目です。選ぶ過去の見積の点数の付け方を変えるか、単価表の項目を見直します。
consider を載せたか外したかの記録も、項目ごとに数えます。 載せる割合が高い項目は、案件の条件から決まる規則として明細の側へ移せます。たとえば「人物あり」ならヘアメイクを必ず載せる、という規則です。規則にできたものはスクリプトへ移し、AIに判断させる範囲を狭めていきます。
04実装レベルの3段階
最小構成で減るのは、第4章の②です。 過去の見積を探す①と、単価を入れる③は残ります。半自動化で①と③も減り、この段階が本記事の想定です。 本格構成は、見積台帳が整ってからにします。 半自動化を数か月回すと、項目コードの付いていない古い明細や、単価表に無い項目が見えてきます。それを直してから販売管理システムとつなぐほうが、登録される見積の質が上がります。
05工数削減シミュレーション
導入後 160件 × 12分 ÷ 60 = 32 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 静止画の撮影、動画の撮影と編集、Web用の短尺動画などの見積依頼を月に100件以上受ける広告制作会社や広告代理店の制作部門。見積の明細を、プロデューサーが過去の似た案件を思い出しながら組んでおり、経験の浅い担当が項目を落とす場合。単価表はあるが、どの項目を載せるかの判断が人に付いている場合。Google Workspace を使っており、見積台帳と単価表がスプレッドシートにある場合。
- 見積の依頼が月に数件で、毎回ほぼ同じ内容の場合。案件ごとの独自性が高く、過去の見積が参考にならない大型のCM制作が中心の場合。販売管理システムの見積機能に、案件の種類ごとの項目のひな形がすでに整っている場合。なお、見積金額、値引き、出演者や楽曲の使用料の条件は、この構成では決めません。
07最小構成で試す方法
- 先月の見積依頼から10件を選ぶ(撮影の後に追加の費用が出た案件を必ず入れる)
- それぞれについて、似た過去の見積を担当者に3件選んでもらい、単価と金額の列を消したものを用意する
- 単価表から、項目コードと項目名だけを抜き出した一覧を用意する
- 手元のAIサービスに、依頼と過去の見積3件と項目の一覧を貼り付け、「この依頼の見積に載せる項目と数量と根拠を書いてください。金額は書かないでください。依頼に書かれていない条件は決めずに、質問にしてください」と指示する
- 出てきた明細案を、当時の見積書と突き合わせる
追加の費用が出た案件で、その項目が明細か候補に出てくるかを最初に見てください。
| 出てきた内容 | 判断 |
|---|---|
| 当時の見積と同じ項目が並び、追加になった項目も候補に出た | スクリプトの組み立てに進む |
| 書かれていない条件を仮置きした | 指示の書き方で直る。構成は有効 |
| 一覧に無い項目を作った | 項目の一覧の粒度を見直す |
| 過去の見積の特殊な項目を引き継いだ | 過去の見積の選び方を先に直す |
2行目が出るのは想定のうちです。 仮置きを禁じる指示を足して、同じ10件でもう一度試してください。
あわせて、担当者による差も見ておきます。 同じ依頼について、ベテランと経験の浅い営業がそれぞれ選んだ過去の見積で試すと、どの過去の見積を渡すかで明細案がどれだけ変わるかが分かります。差が大きければ、スクリプトで点数を付けて選ぶ意味が大きいということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| AIが使用期間を「1年」と仮置きする | 「一般的には」を根拠にしないと明記し、未確定に回す |
| AIが金額に合わせて数量を寄せる | 単価と金額の列を渡さない |
| 過去の特殊な項目が引き継がれる | 3件中1件だけの項目は候補に回す |
| 一覧に無い項目コードが作られる | 項目の一覧から選ばせ、無ければ not_in_list |
| 項目名が過去の見積と単価表で違う | 項目コードで結ぶ。名前で結ばない |
| 出演者や楽曲の使用料が金額に入る | 外部見積の印で「別途」にする |
| 下書きが見積台帳に混ざる | 見積台帳には確定の見積だけを載せる |
| トリガーが作った人の退職で止まる | 共用の管理用アカウントで作る |
| 企画書が長くて実行時間を超える | 要点だけを貼ってもらう |
| 依頼の条件がほとんど空欄 | 明細を組まず、質問だけを返す |
| 再見積で、変わっていない項目まで数量が動く | 元の見積を渡し、変わった条件に関わる項目だけを changes に書かせる |
| 候補の欄が長すぎて誰も読まない | 3件中2件以上にある項目は明細へ、1件だけの項目を候補へ、と線を引き直す |
上の2行が、この構成の失敗のほとんどです。 どちらも、AIが「それらしい見積」に寄せようとして起きます。条件が決まらないものを決めさせず、金額を見せないでおくかどうかで、運用に乗るかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 広告主の未公開の商品や企画の内容、過去の見積の明細、自社の単価表です。
- 未公開の企画を扱うことを、広告主との取り決めに照らす … 企画書には発売前の商品や広告の内容が書かれています。外部のAIのAPIに渡してよいかを、契約の側で先に確かめてください
- 単価表をAIへ渡さない … 自社の原価に近い情報です。項目コードと項目名だけを渡す設計にしてあるのは、精度のためだけでなく、この理由もあります
- 学習に使われない設定と契約で使う … AIのAPIの利用条件を確かめ、入力が学習に使われない形で使います
- 見積の送付を自動にしない … 金額と条件は広告主との関係に直結します。送るのは営業です
- APIのキーをスクリプトに直接書かない … スクリプトのプロパティなどに分けて持ち、スクリプトを見られる人を絞ります
- 使用料の条件をAIに決めさせない … 出演者や楽曲の使用料は、権利を持つ側との取り決めで決まります。「別途」にして、外部の見積で決めます
誤りが起きた場合のリスクは、項目を落として後から追加の費用を説明することと、仮置きの条件で広告主が予算を取ることの2つです。 前者は候補の欄で、後者は未確定の欄で守ります。
10まず何から始めるか
1週目:項目コードをそろえる
単価表に「外部見積が要る」の列を足し、直近1年分の見積台帳の明細に項目コードを付けます。 名前で結びつかない明細は、この機会に項目名をそろえます。
2週目:10件で試す
先月の見積依頼から10件を選び、手元のAIサービスで明細案を作らせます。追加の費用が出た案件で、その項目が候補に出るか、書かれていない条件を仮置きしていないかを最優先で見ます。
3週目:フォームを作る
見積依頼のフォームに、尺、使用する媒体、使用する期間、納品の形式、撮影の場所、人物の有無、元の見積番号の欄を並べます。営業に1週間使ってもらい、書き写しの手間を聞きます。
4週目:スクリプトをつなぐ
フォームの送信のトリガーから、過去の見積の選び出し、AIの呼び出し、単価の計算、見積書の下書きまでを作ります。この時点では、下書きを営業1名だけに送ります。
2か月目: 対象を営業全員に広げ、consider の項目を載せた・外した件数を数えます。3か月目以降: 再見積の受け付けを足し、1件45分が何分になったかを実測します。撮影の後に追加の費用を説明する件数が減ったかを数え始めた時点で、この構成は運用に乗ったと言えます。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| インストール型トリガーに時間主導のもの、スプレッドシートの開く・編集・変更、フォームの送信(Forms と Sheets で別)などがあること。作った人のアカウントで動くこと。読み取り専用で開いたときには動かないこと | Google for Developers: Installable triggers | 2026-09-29 |
| 1回の実行が6分まで、トリガーの合計の実行時間が一般のアカウントで1日90分・Google Workspace で1日6時間、URL の取得が一般で1日20,000回・Workspace で1日100,000回、トリガーは1ユーザー1スクリプトあたり20個であること | Google for Developers: Quotas for Google Services | 2026-09-29 |
UrlFetchApp.fetch で method、contentType、payload、headers、muteHttpExceptions を指定でき、muteHttpExceptions を true にすると失敗の応答でも例外を投げないこと | Google for Developers: Class UrlFetchApp | 2026-09-29 |
構造化出力がJSONスキーマに沿った応答を返す機能で、output_config.format で指定すること。数値の範囲の制約はスキーマで使えないこと | Claude Docs: Structured outputs | 2026-09-29 |
出演者や楽曲の使用料の条件は、権利を持つ側との取り決めで確かめてください。 本記事は上記の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0300)についてのご相談はこちらから。
