如何向Salesforce可调用方法传参并传入Web-to-Lead的Session值
嘿,我来帮你一步步解决这两个Salesforce相关的问题:
1. 如何向Salesforce的可调用方法(InvocableMethod)传递参数?
传递参数给InvocableMethod主要看你是用低代码工具还是Apex代码调用,下面分场景说明:
通过Flow/Process Builder传递(低代码方式)
用Flow的话:
- 在Flow编辑器里添加一个「Action」元素,选择你的
AutoConvertLeads类的LeadAssign方法。 - 在Action的配置界面,找到输入参数
LeadIds(这是一个Id列表),把Flow里的变量(比如当前触发的Lead Id,或者你收集到的Lead Id集合)映射到这个参数上。 - 保存并激活Flow,当Flow触发时,参数就会自动传给Invocable方法。
- 在Flow编辑器里添加一个「Action」元素,选择你的
用Process Builder的话:
- 在Process Builder的「Immediate Actions」里添加「Apex」类型的动作。
- 选择
AutoConvertLeads类,然后在「Set Apex Variables」部分,把Process触发的Lead Id赋值给LeadIds(注意要包装成列表,因为方法参数是List<Id>类型)。
通过Apex代码传递
如果是在其他Apex类里调用,直接传入符合类型要求的参数就行,举个例子:
// 准备要处理的Lead Id列表 List<Id> targetLeadIds = new List<Id>{'00QXXXXXXXXXXXX'}; // 调用Invocable方法 AutoConvertLeads.LeadAssign(targetLeadIds);
2. 修改Apex代码,把Web-to-Lead的Session值传到Contact的session__c字段
看了你的原代码,发现c.session__c是硬编码的占位符,而Session值其实是Web-to-Lead提交到Lead的对应字段里的,所以我们只需要从Lead里取出这个值,再赋值给Contact就好。
修改后的完整代码
public class AutoConvertLeads { @InvocableMethod public static void LeadAssign(List<Id> LeadIds) { // 查询Lead时同时获取Email和session__c字段(Web-to-Lead的Session值存在这里) Lead leadRecord = [SELECT Id, Email, session__c FROM Lead WHERE Id = :LeadIds[0] LIMIT 1]; Database.LeadConvert leadConvert = new Database.LeadConvert(); leadConvert.setLeadId(leadRecord.Id); // 获取默认的转换状态 LeadStatus convertedStatus = [SELECT Id, MasterLabel FROM LeadStatus WHERE IsConverted = true LIMIT 1]; // 根据Lead的Email查找已存在的Contact List<Contact> contactList = [SELECT Id, Name, session__c FROM Contact WHERE Email = :leadRecord.Email LIMIT 1]; if(contactList.size() > 0) { Contact contactRecord = contactList[0]; // 把Lead里的Session值直接赋值给Contact的session__c字段 contactRecord.session__c = leadRecord.session__c; update contactRecord; } else { leadConvert.setConvertedStatus(convertedStatus.MasterLabel); leadConvert.setDoNotCreateOpportunity(true); // 如果需要创建Opportunity可以删掉这行 Database.LeadConvertResult convertResult = Database.convertLead(leadConvert); System.assert(convertResult.isSuccess()); } } }
关键修改点
- 查询Lead时包含session__c:原代码只查了Id和Email,现在加上
session__c,这样就能拿到Web-to-Lead提交的Session选项值。 - 替换硬编码值为Lead的session__c:把占位符改成直接引用Lead里的
session__c值,确保Contact的字段和Lead的Session值保持一致。
额外注意事项
- 要确认Lead对象上确实有
session__c这个Picklist字段,而且Web-to-Lead表单已经正确把用户填写的Session选项映射到这个字段上。 - 因为
session__c是Picklist,Lead里的值必须是Contact的session__c字段的有效可选值(就是你列出的那些时间选项),不然更新Contact时会触发验证错误。如果怕有不匹配的情况,可以加个try-catch块处理更新异常,或者提前校验值的有效性。
内容的提问来源于stack exchange,提问作者Sameer Vitvekar
相关产品推荐
相关产品推荐

