名称: salesforce-dx
描述: 使用 sf CLI 查询 Salesforce 数据并管理销售管线。适用于 SOQL 查询(从简单到复杂)、商机管线分析、预测报告、数据导出、架构探索和 CRM 数据操作。也适用于高管工作流,例如按名称查找交易、查找联系人信息以邮件联系潜在客户、准备管线审查,以及将 CRM 数据与其他工具交叉引用。触发于 Salesforce、SOQL、管线、商机、预测、CRM 数据、交易查找、潜在客户邮件、客户信息或 sf CLI 问题。
使用 sf CLI 查询数据并管理管线。
# 验证 CLI 和认证
sf --version
sf org list
如果未列出任何组织,请进行身份验证:
sf org login web --alias my-org --set-default
在查询之前,先探索可用的对象和字段:
# 列出所有对象
sf sobject list --target-org my-org
# 描述对象字段
sf sobject describe --sobject Opportunity --target-org my-org
# 快速字段列表(仅名称)
sf sobject describe --sobject Opportunity --target-org my-org | grep -E "^name:|^type:"
# 简单查询
sf data query -q "SELECT Id, Name, Amount FROM Opportunity LIMIT 10"
# 使用 WHERE 子句
sf data query -q "SELECT Id, Name FROM Opportunity WHERE StageName = 'Closed Won'"
# 日期过滤
sf data query -q "SELECT Id, Name FROM Opportunity WHERE CloseDate = THIS_QUARTER"
# 导出到 CSV
sf data query -q "SELECT Id, Name, Amount FROM Opportunity" --result-format csv > opps.csv
# 父对象查找(从商机查找客户)
sf data query -q "SELECT Id, Name, Account.Name, Account.Industry FROM Opportunity"
# 子查询(从客户查找商机)
sf data query -q "SELECT Id, Name, (SELECT Id, Name, Amount FROM Opportunities) FROM Account LIMIT 5"
# COUNT
sf data query -q "SELECT COUNT(Id) total FROM Opportunity WHERE IsClosed = false"
# SUM 和 GROUP BY
sf data query -q "SELECT StageName, SUM(Amount) total FROM Opportunity GROUP BY StageName"
# 多重聚合
sf data query -q "SELECT StageName, COUNT(Id) cnt, SUM(Amount) total, AVG(Amount) avg FROM Opportunity GROUP BY StageName"
# 对于 >2000 条记录,使用 --bulk
sf data query -q "SELECT Id, Name, Amount FROM Opportunity" --bulk --wait 10
# 按阶段查看管线
sf data query -q "SELECT StageName, COUNT(Id) cnt, SUM(Amount) total FROM Opportunity WHERE IsClosed = false GROUP BY StageName ORDER BY StageName"
# 按负责人查看管线
sf data query -q "SELECT Owner.Name, SUM(Amount) total FROM Opportunity WHERE IsClosed = false GROUP BY Owner.Name ORDER BY SUM(Amount) DESC"
# 按关闭月份查看管线
sf data query -q "SELECT CALENDAR_MONTH(CloseDate) month, SUM(Amount) total FROM Opportunity WHERE IsClosed = false AND CloseDate = THIS_YEAR GROUP BY CALENDAR_MONTH(CloseDate) ORDER BY CALENDAR_MONTH(CloseDate)"
# 按阶段查看赢率
sf data query -q "SELECT StageName, COUNT(Id) FROM Opportunity WHERE IsClosed = true GROUP BY StageName"
# 本季度已关闭的赢单
sf data query -q "SELECT Id, Name, Amount, CloseDate FROM Opportunity WHERE StageName = 'Closed Won' AND CloseDate = THIS_QUARTER ORDER BY Amount DESC"
# 包含原因的输单
sf data query -q "SELECT Id, Name, Amount, StageName, Loss_Reason__c FROM Opportunity WHERE StageName = 'Closed Lost' AND CloseDate = THIS_QUARTER"
# 加权管线(假设有 Probability 字段)
sf data query -q "SELECT StageName, SUM(Amount) gross, SUM(ExpectedRevenue) weighted FROM Opportunity WHERE IsClosed = false GROUP BY StageName"
# 本月即将关闭的交易
sf data query -q "SELECT Id, Name, Amount, StageName, CloseDate FROM Opportunity WHERE CloseDate = THIS_MONTH AND IsClosed = false ORDER BY Amount DESC"
# 停滞交易(30 天内无活动)
sf data query -q "SELECT Id, Name, Amount, LastActivityDate FROM Opportunity WHERE IsClosed = false AND LastActivityDate < LAST_N_DAYS:30"
sf data create record -s Opportunity -v "Name='New Deal' StageName='Prospecting' CloseDate=2024-12-31 Amount=50000"
# 按 ID 更新
sf data update record -s Opportunity -i 006xx000001234 -v "StageName='Negotiation'"
# 通过 CSV 批量更新
sf data upsert bulk -s Opportunity -f updates.csv -i Id --wait 10
# 导出包含关系的数据
sf data export tree -q "SELECT Id, Name, (SELECT Id, Subject FROM Tasks) FROM Account WHERE Industry = 'Technology'" -d ./export
# 导入
sf data import tree -f ./export/Account.json
添加 --json 以获取结构化输出:
sf data query -q "SELECT Id, Name, Amount FROM Opportunity WHERE IsClosed = false" --json
使用 jq 解析:
sf data query -q "SELECT Id, Name FROM Opportunity LIMIT 5" --json | jq '.result.records[].Name'
| 字面量 | 含义 |
|---|---|
| TODAY | 当天 |
| THIS_WEEK | 本周 |
| THIS_MONTH | 本月 |
| THIS_QUARTER | 本季度 |
| THIS_YEAR | 本年 |
| LAST_N_DAYS:n | 过去 n 天 |
| NEXT_N_DAYS:n | 未来 n 天 |
| LAST_QUARTER | 上一季度 |
"Malformed query" — 检查字段 API 名称(而非标签)。使用 sf sobject describe 进行验证。
"QUERY_TIMEOUT" — 添加过滤器、使用 --bulk 或添加 LIMIT。
"INVALID_FIELD" — 该字段可能不存在于该对象上,或者您的配置文件缺少访问权限。
大型结果集 — 对于返回 >2000 条记录的查询,请使用 --bulk 标志。
按名称或客户查找交易:
# 按商机名称(模糊匹配)
sf data query -q "SELECT Id, Name, Amount, StageName, CloseDate, Owner.Name, Account.Name FROM Opportunity WHERE Name LIKE '%Acme%' ORDER BY Amount DESC"
# 按客户名称
sf data query -q "SELECT Id, Name, Amount, StageName, CloseDate FROM Opportunity WHERE Account.Name LIKE '%Microsoft%' AND IsClosed = false"
# 我负责的近期交易
sf data query -q "SELECT Id, Name, Amount, StageName, CloseDate, Account.Name FROM Opportunity WHERE OwnerId = '<my-user-id>' AND IsClosed = false ORDER BY CloseDate"
查找公司内可邮件联系的人员:
# 某客户的联系人
sf data query -q "SELECT Id, Name, Email, Phone, Title FROM Contact WHERE Account.Name LIKE '%Acme%'"
# 决策者(按职位)
sf data query -q "SELECT Name, Email, Title, Account.Name FROM Contact WHERE Title LIKE '%CEO%' OR Title LIKE '%VP%' OR Title LIKE '%Director%'"
# 特定交易上的联系人
sf data query -q "SELECT Contact.Name, Contact.Email, Contact.Title, Role FROM OpportunityContactRole WHERE Opportunity.Name LIKE '%Acme%'"
获取快速高管摘要:
# 本季度即将关闭的前 10 笔交易
sf data query -q "SELECT Name, Account.Name, Amount, StageName, CloseDate, Owner.Name FROM Opportunity WHERE CloseDate = THIS_QUARTER AND IsClosed = false ORDER BY Amount DESC LIMIT 10"
# 按销售代表查看交易(用于 1:1 会议)
sf data query -q "SELECT Owner.Name, COUNT(Id) deals, SUM(Amount) total FROM Opportunity WHERE IsClosed = false GROUP BY Owner.Name ORDER BY SUM(Amount) DESC"
# 需要关注的交易(停滞)
sf data query -q "SELECT Name, Amount, StageName, LastActivityDate, Owner.Name FROM Opportunity WHERE IsClosed = false AND LastActivityDate < LAST_N_DAYS:14 ORDER BY Amount DESC LIMIT 10"
在通话或会议之前:
# 客户概览
sf data query -q "SELECT Id, Name, Industry, BillingCity, Website, OwnerId FROM Account WHERE Name LIKE '%Acme%'"
# 与该客户相关的所有开放交易
sf data query -q "SELECT Name, Amount, StageName, CloseDate FROM Opportunity WHERE Account.Name LIKE '%Acme%' AND IsClosed = false"
# 近期活动
sf data query -q "SELECT Subject, Status, ActivityDate FROM Task WHERE Account.Name LIKE '%Acme%' ORDER BY ActivityDate DESC LIMIT 5"
Salesforce + 邮件(通过 gog/gmail):
1. 查找联系人邮箱:sf data query -q "SELECT Email FROM Contact WHERE Account.Name LIKE '%Acme%'"
2. 使用该地址通过您的邮件工具起草邮件
Salesforce + 日历:
1. 查找即将关闭的交易:sf data query -q "SELECT Name, Account.Name, CloseDate FROM Opportunity WHERE CloseDate = THIS_WEEK"
2. 与日历交叉引用以确保安排了后续跟进
通话后快速更新 CRM:
# 记录一项任务
sf data create record -s Task -v "Subject='Call with John' WhatId='<opportunity-id>' Status='Completed' ActivityDate=$(date +%Y-%m-%d)"
# 更新商机阶段
sf data update record -s Opportunity -i <opp-id> -v "StageName='Negotiation' NextStep='Send proposal'"
用于“我负责的交易”查询:
sf data query -q "SELECT Id, Name FROM User WHERE Email = 'your.email@company.com'"
将此存储在本地配置中以供快速参考。