

大規模個人化銷售提案:Google Sheets + API(2026)
要大規模產生個人化銷售提案,將潛在客戶資料保存在 Google Sheet(或 CRM 匯出檔)中,將每一列轉成結構化提示,並使用固定的 themeId,將其送到 2Slides Fast PPT 端點 POST /api/v1/slides/generate,讓每份簡報都共享同一設計。每份 10 頁的提案花費 100 點數,約 0.25 美元,約 30 秒內產出可原生編輯的 PPTX,並可自動寄給業務。此作法適合 RevOps 與銷售營運主管,以及自行執行外撥的創業者。
重點摘要
- 一次
POST /api/v1/slides/generate呼叫,將試算表一列轉成設計好的可編輯 PPTX,費用為每頁 10 點數。 - 從
GET /api/v1/themes/search?query=pitch deck取得固定的themeId,讓 200 份提案視覺一致,業務只需修改內容。 responseLanguage可接受每列的語言名稱(如「Spanish」、「Portuguese」),讓 LATAM 與 EMEA 帳戶能從同一張表產出母語簡報。- 產生端點限制每個金鑰每分鐘 6 次請求;Python 隊列在批次間休眠,約 70 分鐘可完成 200 份提案。
- 註冊即送 500 免費點數,可測試 5 份提案;每月 500 份生產提案約需 102.50 美元點數。
適用對象
你是 RevOps 或銷售營運主管,或是自行執行外撥的創業者。業務花 45 分鐘手動製作提案簡報,且 80% 與上一份相同,導致一半合格潛在客戶根本沒拿到量身訂做的提案。你的潛在客戶資料已存在 Google Sheet 或 CRM 匯出檔,包含公司、產業、痛點、價格方案與聯絡人姓名。
若每份提案需要自訂視覺或旁白影片,請勿使用此作法。那是後面介紹的影像設計流程適合的工作。如果你的銷售團隊使用 HubSpot,且想從交易階段觸發提案,請參考本文稍早提及的 HubSpot AI 簡報與銷售簡報自動化 CRM 原生範例。
工作流程一覽
| 步驟 | 工具 | 發生什麼事 | 2Slides 端點 / 點數 |
|---|---|---|---|
| 1 | Google Sheets 或 CRM 匯出 | 每列一個潛在客戶:公司、產業、痛點、價格方案、聯絡人、語言 | 無 |
| 2 | 2Slides Templates Hub 或 API | 選擇一個 pitch-deck 範本並記錄其 themeId | GET /api/v1/themes/search,免費 |
| 3 | Zapier Code 步驟或 Python | 從列資料組成結構化 userInput 提示 | 無 |
| 4 | Zapier Webhooks 或 requests | 以 mode: "async" 提交提案工作 | POST /api/v1/slides/generate,每頁 10 點數 |
| 5 | 延遲 60 秒,接著 GET | 輪詢直到 status 為 success | GET /api/v1/jobs/{jobId},免費 |
| 6 | Gmail 步驟或 SMTP | 將可編輯 PPTX downloadUrl 寄給業務 | 無 |
| 7 | Google Sheets 更新 | 將 jobId 與 downloadUrl 寫回該列以供稽核 | 無 |
步驟 1:結構化潛在客戶試算表
提案品質取決於你提供的欄位。每列一個潛在客戶,包含以下欄位即可:
| company | industry | contact_name | contact_title | pain_points | pricing_tier | price | language | rep_email | status |
|---|---|---|---|---|---|---|---|---|---|
| Northwind Logistics | 貨運與物流 | Mariana Ruiz | 營運副總 | 手動派車排程;18% 空車率;無即時 ETA | Growth | USD 1,800/月 | Spanish | j.ortiz@yourco.com | ready |
| Contoso Clinics | 門診醫療 | David Chen | 營運長 | 紙本報到表;平均等候 22 分鐘;缺席率 14% | Team | USD 950/月 | English | a.park@yourco.com | ready |
兩個規則讓後續提示可靠。第一,pain_points 用簡短的分號分隔短語,不用段落,讓模型明確抓到三個痛點。第二,language 欄位填寫 API 預期的語言名稱(如「Spanish」而非「es」)。status 欄位讓自動化跳過已處理列。
若從 CRM 匯出,請對應相同欄位。若不想用 CSV 匯出,Python 版本也可直接用 Google Sheets API 讀取試算表。
步驟 2:選擇一個 themeId,讓所有提案共享設計
提案系統的重點是統一性。若每份簡報用不同範本,品牌形象會像十家公司。先搜尋範本庫,挑一個 pitch-deck 或提案範本,並在自動化中硬編其 themeId。
先到 2slides.com/templates 視覺瀏覽,篩選 Pitch Deck,記下範本名稱。

接著用 API 取得同一範本的 ID。搜尋端點免費,每分鐘限 6 次,此處只呼叫一次無影響。
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 腳本讀取同一值。每年換一次範本,不要每筆交易換。
API 使用的引擎與 Fast PPT 網頁工具相同:貼上內容、挑範本、取得 PPTX。端點就是無頭執行這流程,對試算表每列都能產出。

步驟 3:組成提示並呼叫銷售提案自動化 API
提案提示應結構化,不是對話式。告訴模型潛在客戶是誰、痛點、建議方案,以及要產出哪些章節、順序。價格獨立一頁,方便業務修改不影響其他頁。
以下是上述試算表第一列的完整呼叫。注意 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://..." } }
若省略 mode,端點同步執行並在同一回應回傳 downloadUrl。單次呼叫較簡單,但 Zapier 這類平台 HTTP 超時短,批次作業用 async 較安全且合適。
步驟 4:Zapier 從新試算表列產生 PowerPoint
無工程師的團隊,Zapier 可在列標記 ready 後兩分鐘內將提案寄到業務信箱。Webhooks by Zapier 應用執行兩次 API 呼叫,其他都是標準步驟。
- 觸發器:Google Sheets,新增或更新列。加 Filter 步驟,只讓
status等於ready的列繼續。 - Code by Zapier (JavaScript) 或 Formatter:從列欄位組成
userInput(以下程式碼片段)。 - Webhooks by Zapier,POST 到
https://2slides.com/api/v1/slides/generate。HeaderAuthorization: Bearer <你的金鑰>,JSON 主體含userInput、themeId、responseLanguage、mode: "async"。映射回應的data.jobId。 - Delay by Zapier,延遲 60 秒。
- Webhooks by Zapier,GET
https://2slides.com/api/v1/jobs/{{jobId}},同 Header。映射data.status與data.downloadUrl。 - Filter:只在
data.status為success時繼續。若工作仍在處理,第二組 Delay 與 GET 可補足。 - Gmail:寄信 給
rep_email,主旨含潛在客戶名稱,內文或附件欄放downloadUrl。 - Google Sheets:更新列,寫入
jobId、downloadUrl,並將status設為done。
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 金鑰放在 Webhooks 步驟 Header,絕不放試算表。若多位業務同時標記 ready,Zapier 可能在一分鐘內發超過 6 次 generate 呼叫,超出部分會收到速率限制錯誤,Zapier 內建重播會處理。量較穩定時,請用下方 Python 批次腳本。相同 Zapier 模式也用於 用 Zapier 與 2Slides 自動化每週報告簡報。
步驟 5:用 Python 批次產生 200 份個人化銷售提案
若活動需在週一前完成 200 份提案,跑腳本比發 200 個 Zap 好。以下腳本讀取試算表 CSV 匯出檔(檔案→下載→CSV),分批提交 6 筆工作以遵守 generate 每分鐘 6 次限制,輪詢每筆工作間隔 6 秒以低於 jobs 每分鐘 10 次限制,下載每份 PPTX,並寫結果到第二個 CSV,供 Gmail 合併或 CRM 匯入用。
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:每金鑰每分鐘 6 次請求
POLL_GAP = 6 # jobs:每分鐘 10 次請求 -> 每 6 秒輪詢一次
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 次 generate 呼叫。
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 批)約 70 分鐘完成。腳本依 status 可重複執行,若中斷於第 140 列,重跑只會送剩餘 60 筆 ready。更大規模與排隊模式,請參考 如何用 AI API 批次產生簡報。
步驟 6:給業務可編輯的 PPTX,不是 PDF
generate 輸出是原生 PowerPoint 檔案:真實文字方塊、真實表格、範本母片。這是使用 Fast PPT 產生提案而非影像渲染簡報的原因。
業務會在產出後修改提案。通話中核准折扣、座位數變動、法務要在條款頁加條款、封面要放客戶 Logo。用可編輯 PPTX,業務打開檔案,編輯價格頁,直接寄出。用 PDF 或影像簡報,每次改都要重產生並重新審核整份簡報。
Gmail 步驟(或 CRM 郵件工具)應寄出 PPTX 檔案本身,不是檢視連結,且主旨帶潛在客戶名稱,方便業務日後查找。若想要精美留存檔,業務可在 PowerPoint 編輯後匯出 PDF。
強力提案簡報長什麼樣
寫步驟 3 的提示結構前,先看真實簡報。2Slides Gallery 有參考簡報可研究結構,或若走影像設計路線,可傳 referenceImageUrl 給 create-like-this 端點。這些是參考簡報,不是上述 API 輸出。


強力提案的三個模式可帶入提示:以潛在客戶用詞開場(pain_points 欄),每個解決方案對應一個痛點,價格獨立一頁。想深入了解各章節內容,請參考 如何用 AI 製作銷售啟動簡報。
費用說明
Fast PPT 按每頁 10 點數計費,典型提案約 10 頁。範本搜尋與工作輪詢免費。
| 數量 | 頁數 | 點數 | 點數包 | 美金 | 每份提案 |
|---|---|---|---|---|---|
| 每月 20 份提案 | 200 | 2,000 | 1 × $5(2,000 點) | $5.00 | $0.25 |
| 每月 500 份提案 | 5,000 | 50,000 | 1 × $80(40,000 點)+ 1 × $22.50(10,000 點) | $102.50 | $0.21 |
註冊即送 500 免費點數,足夠測試 5 份完整提案。點數按用量付費,無座位限制,一組共用金鑰可服務 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% 以設計為差異化的交易。
常見陷阱
- 超過每分鐘 6 次請求限制。 同時標記 20 列 ready,會在幾秒內發出 20 次 POST。請排隊:Python 腳本分批 6 筆並等待 60 秒;Zapier 依賴重播或用 Delay 步驟錯開。
- API 金鑰放在試算表或客戶端腳本。 金鑰應放在 Zapier webhook Header 或伺服器端環境變數。否則任何有試算表的人都能花你的點數。
- 語言代碼非語言名稱。
responseLanguage要「Spanish」或「Portuguese」,非「es」或「pt-BR」。可在 Sheets 用下拉選單驗證欄位。 - 期待 Fast PPT 產生旁白或 MP4。
generate-narration端點只接受create-pdf-slides或create-like-this工作。generate產出僅 PPTX。 - 將 4,000 字的發現通話稿丟給
userInput。 請先摘要。三個分號分隔痛點勝過一大段筆記,價格頁保持清爽。 - 映射錯誤的回應欄位。 工作 ID 在
data.jobId,非頂層。輪詢回應同樣包在{ success, data: { ... } }。
常見問題解答
可以不透過 Google Sheets,直接從 CRM 資料產生銷售簡報嗎?
可以。API 只需 userInput 字串與 themeId,任何來源都行:HubSpot 工作流程、Salesforce 匯出、Postgres 查詢。Google Sheets 方便業務編輯列並標記 ready,無需工程協助。若想用 CRM 原生觸發交易階段變更,請參考本文前述 HubSpot 範例。
一份提案產生需多久?
Fast PPT 簡報工作開始後約 30 秒完成。Zapier 中,單次 60 秒延遲後輪詢幾乎足夠。Python 批次中,6 份提案一分鐘內送出,通常下一分鐘內全完成,200 份約 70 分鐘完成(單一 API 金鑰)。
每份提案看起來都一樣嗎?
設計會一樣,這是預期。因為每筆工作用同一 themeId,色彩、字型、版面在批次中完全一致,只有內容依潛在客戶不同。若想要兩種風格(如企業版與中小企業版),可在試算表加 theme 欄,映射兩個不同 themeId。
其他簡報 API 支援此類自動化嗎?
有。Gamma API(developers.gamma.app)也提供類似產生自動化,但需 Pro 方案才有 API 金鑰。2Slides API 金鑰適用任何帳戶,包括免費帳戶(500 點數),且 Fast PPT 輸出是原生 PPTX,不是託管頁面,讓業務能直接編輯價格頁。
業務產出後能修改價格頁嗎?
能,這是使用 Fast PPT 路徑的主要原因。檔案是標準 PPTX,文字方塊與表格可編輯,業務可在 PowerPoint 或 Google Slides 改變座位數、套用核准折扣、加法務條款。無需重產生,其他頁面不受影響。
下一步
大規模個人化銷售提案靠三件事:乾淨的試算表、一個固定範本,以及遵守每分鐘 6 次請求的排隊機制。
- 於 2slides.com/api 取得 API 金鑰。註冊含 500 免費點數,足夠測試 5 份提案。
- 瀏覽團隊其他食譜,參考中心文章 AI 簡報 API 團隊用例。
- 銷售面深入了解,請看 HubSpot AI 銷售簡報自動化 與 用 AI API 批次產生簡報。
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free