2Slides Logo
大規模にパーソナライズされた営業提案書作成:Google SheetsとAPI連携(2026年版)
2Slides Team
6 min read

大量のパーソナライズされた営業提案書:Google Sheets + API(2026年版)

大量のパーソナライズされた営業提案書を作成するには、見込み客情報をGoogle Sheets(またはCRMのエクスポート)に保持し、各行を構造化されたプロンプトに変換して、2SlidesのFast PPTエンドポイント POST /api/v1/slides/generate に固定の themeId と共に送信します。これにより、すべての提案書が同じデザインで統一されます。10ページの提案書は100クレジット(約0.25ドル)で、約30秒でネイティブ編集可能なPPTXとして届き、担当者に自動でメール送信も可能です。このレシピはRevOpsや営業オペレーションのリーダー、アウトバウンドを行う創業者向けです。

主なポイント

  • 1回の POST /api/v1/slides/generate 呼び出しで、スプレッドシートの1行をデザイン済みで編集可能なPPTX提案書に変換。1ページあたり10クレジット。
  • GET /api/v1/themes/search?query=pitch deck で取得した固定の themeId を使うことで、200件の提案書が視覚的に同一に。担当者は内容だけを編集。
  • responseLanguage に行ごとに言語名(「Spanish」「Portuguese」など)を指定可能。LATAMやEMEAのアカウントも同じシートからネイティブ言語の提案書を生成。
  • generateエンドポイントは1キーあたり1分間に6リクエストまで。Pythonのキューでバッチ処理し、200件の提案書を約70分で完了可能。
  • サインアップ時に500クレジットの無料付与があり、5件のテスト提案書をカバー。月500件の本番提案書は約102.50ドル相当のクレジット。

対象者

RevOpsや営業オペレーションを担当している方、または創業者自身がアウトバウンド営業を行っている方。営業担当者は提案書作成に45分かけており、その80%は前回とほぼ同じ内容のため、見込み客の半数はカスタマイズされた提案書を受け取れていません。見込み客データはすでにGoogle SheetsやCRMのエクスポートに、会社名、業界、課題、価格帯、担当者名などが入っています。

提案書ごとにカスタムビジュアルやナレーション付き動画が必要な場合は、このレシピは適しません。そうした場合は後述の画像デザインパイプラインを使います。営業チームがHubSpot内にいて、案件ステージの変更で提案書を自動生成したい場合は、HubSpot AIプレゼンテーションと営業デッキ自動化 のCRMネイティブパターンを参照してください。

ワークフロー概要

ステップツール処理内容2Slidesエンドポイント / クレジット
1Google SheetsまたはCRMエクスポート見込み客ごとに1行:会社名、業界、課題、価格帯、担当者、言語なし
22Slides Templates HubまたはAPIピッチデックテンプレートを1つ選び、themeIdを記録GET /api/v1/themes/search、無料
3ZapierのCodeステップまたはPython行データから構造化されたuserInputプロンプトを作成なし
4ZapierのWebhooksまたはrequestsmode: "async"で提案書生成ジョブを送信POST /api/v1/slides/generate、10クレジット/ページ
560秒待機後、GETstatussuccessになるまでポーリングGET /api/v1/jobs/{jobId}、無料
6GmailステップまたはSMTP編集可能なPPTXのdownloadUrlを担当者にメール送信なし
7Google Sheets更新監査用にjobIddownloadUrlを行に書き戻すなし

ステップ1:見込み客シートの構造化

提案書の品質は入力する列によって決まります。1行に1見込み客の以下の列があれば十分です:

companyindustrycontact_namecontact_titlepain_pointspricing_tierpricelanguagerep_emailstatus
Northwind LogisticsFreight and logisticsMariana RuizVP OperationsManual dispatch scheduling; 18% empty-mile rate; no live ETAsGrowthUSD 1,800/monthSpanishj.ortiz@yourco.comready
Contoso ClinicsOutpatient healthcareDavid ChenCOOPaper intake forms; 22-minute average wait; no-show rate 14%TeamUSD 950/monthEnglisha.park@yourco.comready

下流のプロンプトを確実にするための2つのルール。まず、pain_pointsは段落ではなくセミコロン区切りの短いフレーズで3つの明確な課題をモデルに伝えます。次に、language列にはAPIが期待する言語名を正確に書きます(「Spanish」など)。status列はすでに処理済みの行をスキップするために使います。

CRMからエクスポートする場合も同じフィールドにマッピングしてください。Python版ではCSVエクスポートを使わずにGoogle Sheets APIで直接読み込むことも可能です。

ステップ2:すべての提案書が同じデザインになるよう1つのthemeIdを選ぶ

提案書システムのポイントは一貫性です。テンプレートがバラバラだとブランドが複数の会社に見えます。テンプレートライブラリを一度検索し、ピッチデックまたは提案書テンプレートを選び、そのthemeIdを自動化にハードコードします。

まず2slides.com/templatesで視覚的にブラウズし、Pitch Deckでフィルターしてテンプレート名をメモします。

2Slides Templates Hub with curated slide themes and Pitch Deck filter
図1: Templates HubでPitch Deckにフィルターした画面。ここでテンプレートを選び、検索エンドポイントでthemeIdを取得します。

次にAPIで同じテンプレートのIDを取得します。検索エンドポイントは無料で1分間に6リクエストまでですが、ここでは1回だけ呼び出すので問題ありません。

curl -s "https://2slides.com/api/v1/themes/search?query=pitch%20deck&limit=5" \ -H "Authorization: Bearer $SLIDES_API_KEY"

レスポンスにはthemeIdとメタデータが含まれます。IDを環境変数(PROPOSAL_THEME_ID)にコピーし、ZapierステップやPythonスクリプトで同じ値を使います。テンプレートは年に1回変える程度で十分です。

APIはFast PPTウェブツールと同じエンジンを使っています:コンテンツを貼り付け、テンプレートを選び、PPTXを得る。エンドポイントはこれをシートの各行に対してヘッドレスで実行します。

2Slides Fast PPT interface with content box and template gallery
図2: ブラウザのFast PPT画面。generateエンドポイントはUIなしでこのフローを実行し、Google SheetsからPowerPointへの自動化を可能にします。

ステップ3:プロンプトを作成し営業提案自動化APIを呼び出す

提案書のプロンプトは会話形式ではなく構造化すべきです。見込み客が誰か、課題は何か、推奨プランは何か、どの順番でどのセクションを作るかを伝えます。価格は別スライドにして、担当者が他のスライドを乱さずに編集できるようにします。

以下は上記シートの1行目に対する正確な呼び出し例です。responseLanguageは行から取得し、mode"async" で即座にジョブIDを返します。

curl -s -X POST https://2slides.com/api/v1/slides/generate \ -H "Authorization: Bearer $SLIDES_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "userInput": "Sales proposal for Northwind Logistics (freight and logistics). Prepared for Mariana Ruiz, VP Operations. Pain points: manual dispatch scheduling; 18% empty-mile rate; no live ETAs for customers. Recommended plan: Growth tier at USD 1,800/month for 25 dispatcher seats. Structure: 1) Our understanding of Northwind Logistics 2) Goals for the next 12 months 3) Proposed solution mapped to each pain point 4) 90-day rollout plan 5) Pricing (own slide) 6) Next steps. Consultative tone, no buzzwords.", "themeId": "'"$PROPOSAL_THEME_ID"'", "responseLanguage": "Spanish", "mode": "async" }'

すべての2Slidesレスポンスは同じ形式でラップされており、Zapierでフィールドをマッピングする際に重要です:

{ "success": true, "data": { "jobId": "a1b2c3d4", "status": "pending" } }

5〜10秒ごとにジョブをポーリングします。Fast PPTの提案書は通常30秒程度で完成します。

curl -s https://2slides.com/api/v1/jobs/a1b2c3d4 \ -H "Authorization: Bearer $SLIDES_API_KEY" # { "success": true, "data": { "jobId": "a1b2c3d4", "status": "success", "downloadUrl": "https://..." } }

POST /api/v1/slides/generate parameters: themeId, userInput, responseLanguage, mode
図3: generateエンドポイントの4つのパラメータ。themeIdとuserInputは必須。responseLanguageはデフォルトでAuto、modeはデフォルトでsync。

modeを省略すると同期処理となり、同じレスポンスでdownloadUrlが返ります。単発呼び出しでは簡単ですが、ZapierのようなプラットフォームでHTTPタイムアウトが短い場合は非同期が安全で、バッチ処理にも適しています。

ステップ4:Zapierで新しいシート行からPowerPointを生成

エンジニアがいないチームでも、Zapierを使えば行がreadyにマークされてから2分以内に担当者の受信箱に提案書が届きます。Webhooks by Zapierアプリで2つのAPI呼び出しを行い、その他は標準ステップです。

  • トリガー:Google Sheets、新規または更新行。statusreadyの行だけ続行するFilterステップを追加。
  • Code by Zapier (JavaScript) またはFormatterで、行の列からuserInputを組み立て(下記スニペット参照)。
  • Webhooks by Zapier, POSThttps://2slides.com/api/v1/slides/generate に送信。ヘッダーに Authorization: Bearer <your key>、JSONボディにuserInputthemeIdresponseLanguagemode: "async"。レスポンスのdata.jobIdをマッピング。
  • Delay by Zapierで60秒待機。
  • Webhooks by Zapier, GEThttps://2slides.com/api/v1/jobs/{{jobId}} に同じヘッダーでアクセス。data.statusdata.downloadUrlをマッピング。
  • Filterdata.statussuccessのときのみ続行。処理中のジョブがあれば、2回目のDelay+GETで対応。
  • Gmail: Send Emailrep_email宛に、件名に見込み客名、本文または添付にdownloadUrlを送信。
  • Google Sheets: Update RowjobIddownloadUrlを書き込み、statusdoneに更新。

Codeステップにプロンプトロジックをまとめることで、営業マネージャーがWebhookを触らずに提案書構成を変更できます:

// Code by Zapier (JavaScript). inputDataはシート行からマッピングされる。 const { company, industry, contact_name, contact_title, pain_points, pricing_tier, price, language, } = inputData; const userInput = [ `Sales proposal for ${company} (${industry}).`, `Prepared for ${contact_name}, ${contact_title}.`, `Pain points: ${pain_points}.`, `Recommended plan: ${pricing_tier} tier at ${price}.`, `Structure: 1) Our understanding of ${company} 2) Goals for the next 12 months`, `3) Proposed solution mapped to each pain point 4) 90-day rollout plan`, `5) Pricing (own slide) 6) Next steps. Consultative tone, no buzzwords.`, ].join(" "); output = { userInput, responseLanguage: language || "English" };

APIキーはWebhookヘッダーに保持し、シートには絶対に入れないでください。複数の担当者が同時に行をreadyにすると、Zapierは1分間に6回を超えるgenerate呼び出しを行う可能性があり、超過分はレートリミットエラーとなりますが、Zapierのリプレイ機能が自動で処理します。安定した大量処理には後述のPythonバッチを使ってください。同じZapierパターンはZapierと2Slidesで週次レポートスライドを自動化でも使われています。

ステップ5:Pythonで200件のパーソナライズ提案書を一括生成

キャンペーンで200件の提案書が月曜までに必要な場合、200回Zapを起動する代わりにスクリプトを実行します。以下のスクリプトはシートのCSVエクスポート(ファイル→ダウンロード→CSV)を読み込み、6件ずつバッチでgenerateジョブを送信し、6秒間隔でjobsをポーリングして10リクエスト/分制限を守り、PPTXをダウンロードし、結果をGmailマージやCRMインポートで使える2つ目のCSVに書き出します。

import csv, os, time, requests API = "https://2slides.com/api/v1" HEADERS = { "Authorization": f"Bearer {os.environ['SLIDES_API_KEY']}", "Content-Type": "application/json", } THEME_ID = os.environ["PROPOSAL_THEME_ID"] # GET /themes/search?query=pitch deck から取得 BATCH = 6 # generate: 1キーあたり6リクエスト/分 POLL_GAP = 6 # jobs: 10リクエスト/分 -> 6秒に1回ポーリング OUT_DIR = "proposals" def build_prompt(row): return ( f"Sales proposal for {row['company']} ({row['industry']}). " f"Prepared for {row['contact_name']}, {row['contact_title']}. " f"Pain points: {row['pain_points']}. " f"Recommended plan: {row['pricing_tier']} tier at {row['price']}. " f"Structure: 1) Our understanding of {row['company']} 2) Goals for the next 12 months " f"3) Proposed solution mapped to each pain point 4) 90-day rollout plan " f"5) Pricing (own slide) 6) Next steps. Consultative tone, no buzzwords." ) def submit(row): r = requests.post(f"{API}/slides/generate", headers=HEADERS, timeout=60, json={ "userInput": build_prompt(row), "themeId": THEME_ID, "responseLanguage": row.get("language") or "English", "mode": "async", }) r.raise_for_status() body = r.json() # { success, data: { jobId, status } } if not body.get("success"): raise RuntimeError(body) return body["data"]["jobId"] def poll(job_id): r = requests.get(f"{API}/jobs/{job_id}", headers=HEADERS, timeout=30) r.raise_for_status() return r.json()["data"] # { jobId, status, progress, downloadUrl } def download(url, path): with requests.get(url, stream=True, timeout=120) as r: r.raise_for_status() with open(path, "wb") as f: for chunk in r.iter_content(65536): f.write(chunk) def main(): os.makedirs(OUT_DIR, exist_ok=True) with open("prospects.csv", newline="", encoding="utf-8") as f: rows = [r for r in csv.DictReader(f) if r.get("status") == "ready"] results = [] for i in range(0, len(rows), BATCH): batch = rows[i:i + BATCH] window_start = time.time() pending = {submit(row): row for row in batch} print(f"submitted {len(pending)} jobs, {i + len(batch)}/{len(rows)} total") while pending: for job_id in list(pending): time.sleep(POLL_GAP) data = poll(job_id) if data["status"] == "success": row = pending.pop(job_id) safe = row["company"].replace(" ", "_") path = os.path.join(OUT_DIR, f"{safe}_proposal.pptx") download(data["downloadUrl"], path) results.append({**row, "jobId": job_id, "downloadUrl": data["downloadUrl"], "file": path, "status": "done"}) elif data["status"] == "failed": row = pending.pop(job_id) results.append({**row, "jobId": job_id, "downloadUrl": "", "file": "", "status": "failed"}) # 60秒間に6回を超えないように待機 elapsed = time.time() - window_start if elapsed < 60: time.sleep(60 - elapsed) with open("proposals_out.csv", "w", newline="", encoding="utf-8") as f: w = csv.DictWriter(f, fieldnames=list(results[0].keys())) w.writeheader() w.writerows(results) if __name__ == "__main__": main()

タイミング:6件のバッチ処理はポーリング込みで約60〜120秒かかるため、200件(34バッチ)は1キーで約70分で完了します。スクリプトはstatusで冪等性があるため、途中で140行目で止まっても再実行すれば残り60行だけ処理されます。より大規模な処理やキューイングパターンはAI APIでプレゼンテーションをバッチ生成する方法を参照してください。

ステップ6:担当者に編集可能なPPTXを渡す(PDFではなく)

generateの出力はネイティブのPowerPointファイルです:実際のテキストボックス、実際の表、テンプレートのマスタースライドを含みます。これがFast PPTを使う理由であり、画像レンダリングされたデッキではありません。

担当者は生成後に提案書を変更します。割引が承認されたり、席数が電話で変わったり、法務が条項を追加したり、見込み客のロゴを表紙に入れたり。編集可能なPPTXなら担当者はファイルを開いて価格スライドを編集し、そのまま送信できます。PDFや画像デッキだと、変更のたびに全スライドを再生成・再レビューしなければなりません。

Gmailステップ(またはCRMのメールツール)は、ビューアリンクではなくPPTXファイル自体を送信し、件名に見込み客名を入れて担当者が後で見つけやすくしてください。洗練されたリーブビハインドが欲しい場合は、担当者がPowerPointからPDFにエクスポートできます。

強力な提案書デッキの例

ステップ3でプロンプト構造を書く前に、実際のデッキを見ると参考になります。2Slidesギャラリーには構成の参考になるデッキがあり、画像デザインルートを使う場合はreferenceImageUrlとしてcreate-like-thisエンドポイントに渡せます。これらはAPI呼び出しの出力ではなく参考用デッキです。

Perplexity ads pitch deck from the 2Slides Gallery, a reference for proposal structure
図4: 2Slidesギャラリーのピッチデック表紙スライド。提案書の表紙には見込み客名、担当者名、日付を入れます。

Perplexity ads pitch deck from the 2Slides Gallery, a reference for proposal structure
図5: 同ギャラリーの後半スライド。スライド1枚に1つのアイデア密度がポイント。プロンプトでも番号付きセクションでこれを反映してください。

強力な提案書に共通する3つのパターンは、見込み客の言葉で状況を開示(pain_points列)、各課題に対応する解決策をマッピング、価格は単独スライドに分離、です。各セクションの詳細はAIで営業支援デッキを作る方法を参照してください。

費用

Fast PPTは1ページあたり10クレジットで課金され、典型的な提案書は10ページです。テーマ検索とジョブポーリングは無料です。

ボリュームページ数クレジットクレジットパックUSD1提案あたり
月20提案2002,0001 × $5 (2,000)$5.00$0.25
月500提案5,00050,0001 × $80 (40,000) + 1 × $22.50 (10,000)$102.50$0.21

サインアップ時の500クレジット無料は5件のテスト提案書に相当。クレジットは従量課金で席数制限なし。1つの共有キーで12人の営業チームをカバー可能です。

Fast PPTと画像デザインスライド、どちらを使うべき?

ニーズ使用理由
担当者が編集する提案書generate (Fast PPT)、10クレジット/ページネイティブPPTX、約30秒、テンプレート一貫性
少数の大口企業向けにビジュアル重視のカスタムデッキcreate-pdf-slides、10 + 100クレジット/ページ(2Kクレジット)スタイルプロンプトから画像デザインレイアウト生成
既存ブランドデッキの外観に合わせるcreate-like-this + referenceImageUrl、同コスト参照画像からデザインシステムを派生
非同期販売用のナレーション付き提案動画create-pdf-slidesまたはcreate-like-this + generate-narration、210クレジット/ページFast PPTはナレーション不可

本記事のシート駆動大量処理にはFast PPTがデフォルトで最適。デザインが差別化要因の5%の案件は画像パイプラインを使いましょう。

よくある落とし穴

  • 1分間に6リクエスト超過のバースト。 20行を一度にreadyにすると20回のPOSTが数秒で発生。キューイングが必要。Pythonスクリプトは6件ずつバッチ処理し60秒待機。Zapierはリプレイ機能かDelayステップで調整。
  • APIキーをシートやクライアント側スクリプトに入れる。 キーはZapierのWebhookヘッダーかサーバー環境変数に保持。シートに入れると誰でもクレジットを消費可能に。
  • 言語コードではなく名前を使う。 responseLanguageは「Spanish」「Portuguese」などの言語名を要求。espt-BRは不可。Sheetsでドロップダウン検証を推奨。
  • Fast PPTからナレーションやMP4を期待する。 generate-narrationcreate-pdf-slidescreate-like-thisのジョブのみ対応。generateはPPTXのみ。
  • 4,000語のディスカバリーコールの文字起こしをuserInputに丸投げ。 まず要約。セミコロン区切りの3つの課題が長文より効果的。価格スライドはシンプルに。
  • レスポンスの間違ったフィールドをマッピング。 ジョブIDはトップレベルではなくdata.jobIdにある。同じ{ success, data: { ... } }構造がポーリングレスポンスにも適用。

よくある質問

CRMデータからGoogle Sheetsなしで営業デッキを生成できますか?

はい。APIはuserInput文字列とthemeIdだけ必要なので、HubSpotのワークフロー、Salesforceエクスポート、Postgresクエリなど任意のソースから可能です。Google Sheetsは担当者がエンジニアの助けなしに行を編集しreadyにできるので便利です。案件ステージ変更でのCRMネイティブトリガーは本記事冒頭のHubSpotパターンを参照してください。

1件の提案書生成にどれくらい時間がかかりますか?

ジョブ開始後、Fast PPTデッキは約30秒です。Zapierでは60秒のDelayを1回入れればほぼ十分。Pythonバッチでは6件を1分以内に送信し、次の1分でほぼ完了するため、200件は1キーで約70分で完了します。

すべての提案書は同じ見た目ですか?

はい、それが意図です。同じthemeIdを使うため、色、フォント、レイアウトはバッチ全体で同一で、内容だけが見込み客ごとに変わります。2種類の見た目が欲しい場合(例:大企業向けとSMB向け)、シートにtheme列を追加し、異なるthemeIdにマッピングしてください。

他のプレゼンテーションAPIもこの自動化をサポートしていますか?

はい。GammaのAPI(developers.gamma.app)も類似の生成自動化を提供していますが、Proプランが必要です。2SlidesのAPIキーは無料アカウントでも使え、Fast PPTの出力はホスト型ページではなくネイティブPPTXなので、価格スライドの担当者編集が実用的です。

担当者は生成後に価格スライドを編集できますか?

はい。これがFast PPT経路を使う主な理由です。ファイルは標準PPTXでテキストボックスや表が編集可能なので、担当者は席数変更、承認済み割引適用、法務条項追加をPowerPointやGoogle Slidesで行えます。再生成は不要で、他のスライドはそのままです。

次のステップ

大量のパーソナライズ営業提案書は、きれいなシート、1つの固定テンプレート、1分間に6リクエストを守るキューの3つに集約されます。

About 2Slides

Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.

Try For Free