2Slides Logo
大规模个性化销售提案:Google Sheets + API(2026)
2Slides Team
8 min read

大规模个性化销售提案:Google Sheets + API(2026)

要大规模生成个性化销售提案,将潜在客户信息保存在 Google 表格(或 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 表格或 CRM 导出文件中,包含公司、行业、痛点、定价等级和联系人姓名。

如果每份提案都需要定制视觉或带解说视频,请勿使用本方案。那种需求适合后文介绍的图像设计流程。如果你的销售团队使用 HubSpot,并希望根据交易阶段触发提案,请参考本文稍早提到的 HubSpot AI 演示和销售幻灯片自动化 中的 CRM 原生方案。

工作流程概览

步骤工具发生的事情2Slides 端点 / 积分
1Google Sheets 或 CRM 导出每行代表一个潜在客户:公司、行业、痛点、定价等级、联系人、语言
22Slides 模板中心或 API选择一个 pitch-deck 模板并记录其 themeIdGET /api/v1/themes/search,免费
3Zapier 代码步骤或 Python从行数据构建结构化 userInput 提示
4Zapier Webhooks 或 requests提交提案生成任务,mode: "async"POST /api/v1/slides/generate,每页 10 积分
5延迟 60 秒后 GET轮询直到 statussuccessGET /api/v1/jobs/{jobId},免费
6Gmail 步骤或 SMTP将可编辑的 PPTX downloadUrl 邮件发送给销售代表
7Google Sheets 更新jobIddownloadUrl 写回行,便于审计

第 1 步:结构化潜在客户表格

提案质量取决于你提供的列。一个扁平表格,每行一个潜在客户,包含以下列即可:

companyindustrycontact_namecontact_titlepain_pointspricing_tierpricelanguagerep_emailstatus
Northwind Logistics货运与物流Mariana Ruiz运营副总裁手动调度排班;空驶率 18%;无实时 ETAGrowthUSD 1,800/月Spanishj.ortiz@yourco.comready
Contoso Clinics门诊医疗David Chen首席运营官纸质接诊表;平均等待 22 分钟;缺席率 14%TeamUSD 950/月Englisha.park@yourco.comready

有两条规则保证后续提示可靠。第一,pain_points 用简短的分号分隔短语,不用段落,确保模型获得三个明确的问题点。第二,language 列填写 API 期望的语言名称(如“Spanish”,而非“es”)。status 列用于自动化跳过已处理的行。

如果从 CRM 导出,映射相同字段。Google Sheets API(文档)也能直接读取表格,适合不想用 CSV 导出的 Python 版本。

第 2 步:选择一个固定的 themeId,确保所有提案设计一致

提案系统的关键是统一。如果每份幻灯片用不同模板,品牌形象会显得杂乱。先搜索模板库,选一个 pitch-deck 或 proposal 模板,硬编码其 themeId 到自动化流程中。

先在 2slides.com/templates 浏览,筛选 Pitch Deck,记下模板名称。

2Slides 模板中心,筛选为 Pitch Deck
图 1:模板中心,筛选为 Pitch Deck。选中模板后,通过搜索端点获取其 themeId。

然后通过 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。端点就是无界面地为表格中每行执行此流程。

2Slides Fast PPT 界面,内容框和模板库
图 2:浏览器中的 Fast PPT。生成端点运行的正是此流程,无需 UI,支持 Google Sheets 到 PowerPoint 的自动化。

第 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://..." } }

POST /api/v1/slides/generate 参数:themeId, userInput, responseLanguage, mode
图 3:生成端点的四个参数。themeId 和 userInput 必填;responseLanguage 默认为 Auto,mode 默认为 sync。

若省略 mode,端点同步执行,响应中直接返回 downloadUrl。单次调用更简单,但异步模式适合 Zapier 等平台避免 HTTP 超时,且适合批量处理。

第 4 步:Zapier 从新表格行生成 PowerPoint

无工程师支持的团队可用 Zapier 在行标记为 ready 后两分钟内将提案发送到销售代表邮箱。Webhooks by Zapier 应用完成两次 API 调用,其他为标准步骤。

  • 触发器:Google Sheets,新行或更新行。加过滤器仅处理 status 等于 ready 的行。
  • Code by Zapier(JavaScript) 或 Formatter:从行列组装 userInput(示例见下)。
  • Webhooks by Zapier,POSThttps://2slides.com/api/v1/slides/generate。请求头 Authorization: Bearer <你的密钥>,JSON 体含 userInputthemeIdresponseLanguagemode: "async"。映射响应中的 data.jobId
  • Delay by Zapier,延迟 60 秒。
  • Webhooks by Zapier,GET https://2slides.com/api/v1/jobs/{{jobId}},同样请求头。映射 data.statusdata.downloadUrl
  • 过滤器:仅当 data.statussuccess 时继续。若任务仍在处理中,可再加一次延迟和 GET。
  • Gmail:发送邮件,收件人为 rep_email,主题含潜在客户名,正文或附件含 downloadUrl
  • Google Sheets:更新行,写入 jobIddownloadUrl,并将 status 设为 done

代码步骤将提示逻辑集中,销售经理可修改提案结构,无需改动 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 请求头,绝不放表格中。若多名销售同时标记多行,Zapier 可能一分钟内发出超过 6 次生成请求,超出部分会收到限流错误,Zapier 内置重试机制会处理。若请求量更稳定,推荐使用下文 Python 批处理。相同 Zapier 模式也用于 自动化周报幻灯片生成

第 5 步:用 Python 批量生成 200 份个性化销售提案

当活动需要在周一前完成 200 份提案时,运行脚本比触发 200 个 Zap 更高效。以下脚本读取表格的 CSV 导出文件(文件 -> 下载 -> CSV),分批提交任务(每批 6 个,遵守每分钟 6 次生成请求限制),以 6 秒间隔轮询任务状态(遵守每分钟 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 次生成调用。 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 生成结果。

2Slides Gallery 中的 Perplexity 广告 pitch deck,提案结构参考
图 4:2Slides Gallery 中的 pitch deck 封面。提案封面应包含潜在客户、联系人和日期。

2Slides Gallery 中的 Perplexity 广告 pitch deck,提案结构参考
图 5:同一 Gallery 幻灯片的后续页。注意每页只表达一个核心观点;提示中用编号分段体现此结构。

强力提案的三个模式可借鉴到提示中:用潜在客户的语言(pain_points 列)开篇,针对每个痛点对应解决方案,定价单独一页。想深入了解各部分内容,请参见 如何用 AI 创建销售赋能幻灯片

费用说明

Fast PPT 按每页 10 积分计费,典型提案约 10 页。主题搜索和任务轮询免费。

量级页数积分积分包美元每份提案成本
每月 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 份完整提案。积分按需付费,无座位限制,一把共享密钥即可支持 12 人销售团队。

Fast PPT 还是图像设计幻灯片?

需求方案原因
销售代表会修改的可编辑提案generate(Fast PPT),每页 10 积分原生 PPTX,约 30 秒,模板统一
为少数企业客户制作视觉定制幻灯片create-pdf-slides,每页 10 + 100 积分,起价 2K 积分根据风格提示生成图像设计布局
匹配现有品牌幻灯片风格create-like-this,带 referenceImageUrl,同价从参考图像派生设计系统
异步销售的带解说视频提案create-pdf-slidescreate-like-this,再调用 generate-narration,每页 210 积分Fast PPT 任务不支持解说

本文介绍的表格驱动批量流程,Fast PPT 是默认选择。图像设计流程适合约 5% 设计为差异化的交易。

常见陷阱

  • 超过每分钟 6 次请求限制。 一次标记 20 行为 ready 会瞬间发出 20 个 POST。请排队处理:Python 脚本分批 6 个,等待 60 秒窗口;Zapier 依赖重试或加延迟步骤错峰调用。
  • API 密钥放在表格或客户端脚本。 密钥应放在 Zapier webhook 请求头或服务器环境变量。否则任何拿到表格的人都能消耗积分。
  • 语言代码替代语言名称。 responseLanguage 需要“Spanish”或“Portuguese”,不能用“es”或“pt-BR”。可在 Sheets 用下拉菜单校验。
  • Fast PPT 不支持解说或 MP4。 generate-narration 端点只接受 create-pdf-slidescreate-like-this 任务。generate 生成的是 PPTX。
  • 将 4000 字的发现电话记录直接放入 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 份提案一分钟内提交,通常下一分钟内全部完成,单密钥约 70 分钟完成 200 份。

每份提案看起来都一样吗?

设计是统一的,这是预期效果。所有任务使用相同 themeId,颜色、字体和布局一致,只有内容因潜在客户不同而变化。若想要两套风格(如企业客户和中小企业),可在表格加 theme 列,映射到两个不同的 themeId

其他演示 API 支持此类自动化吗?

支持。Gamma 的 API(developers.gamma.app)也提供类似自动化,但需要 Pro 计划的 API 密钥。2Slides API 密钥适用于所有账户,包括免费账户赠送的 500 积分,且 Fast PPT 输出为原生 PPTX,而非托管页面,方便销售代表直接修改定价页。

生成后销售代表能修改定价页吗?

能。这是使用 Fast PPT 路径的主要原因。文件是标准 PPTX,文本框和表格可编辑,销售代表可在 PowerPoint 或 Google Slides 中修改座位数、应用批准折扣或添加法律条款,无需重新生成,其他幻灯片保持不变。

后续步骤

大规模个性化销售提案归结为三部分:干净的表格、固定模板和遵守每分钟 6 次请求的队列。

About 2Slides

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

Try For Free