Salesforce Flow 循环:为每个日期或班次创建一条记录
一个屏幕,多条记录。每位屏幕 Flow(Screen Flow) 构建者都需要的循环模式,另附三个可直接复制的现成 Flow:班次、休假和日期范围。
招聘人员要为一个职位添加十二个班次。经理批准一周的休假。活动策划人预订一个为期三天的研讨会,外加一天回访。每件事都是在一个屏幕上做出的一个决定,而每件事都应该生成多条记录。
屏幕 Flow 没有“每个日期创建一条记录”这样的元素。您需要用三个标准部件来搭建:一个循环、一个分配和一次保存。本文将逐步讲解这一模式,并提供三个基于它的可用 Flow。
这个模式来自一个基于 TalentRover 的招聘项目,招聘人员需要为职位添加一连串班次。一条一条地录入,比排班本身还费时间。改为一次选好日期和时段、由循环写入班次之后,问题就解决了,而且同样适用于任何对象。
五个元素构成的模式
- 屏幕。一个 MultiDatePick 日历,用户一次选好所有日期,需要时连时间一起选。
- 解析。
Parse Date Entries from JSON操作把所选内容转换成 Flow 可以循环遍历的列表。 - 循环。“循环”元素逐条遍历列表。
- 分配。在循环内:把条目的日期和时间复制到记录变量上,再把这条记录添加到记录集合中。
- 创建记录。循环结束后,用一个“创建记录”保存整个集合。
为什么保存要放在循环之后
很多人会想把“创建记录”直接放进循环:遍历一次,生成一条。三个日期时没问题,三十个就会出错。每个“创建记录”都是一次独立的数据库保存,而 Salesforce 在一个事务中最多允许 150 次,这些保存触发的所有触发器和 Flow 也共用这个额度。循环内的保存每个日期都要消耗一次。
先构建集合再一次保存,无论用户选了多少,总共只消耗一次保存。这样也更快,而且要么全部保存、要么全部不保存,失败时绝不会只留下一半班次。
| 在循环内“创建记录” | 构建集合,循环后保存 | |
|---|---|---|
| 30 个日期的保存次数 | 30 | 1 |
| 超出限制的风险 | 每多选一个日期就增加一分 | 循环不带来任何风险 |
| 出错时 | 部分记录已保存,部分未保存 | 全部保存或全部不保存 |
使用场景:为职位添加班次
招聘人员从职位记录打开 Flow,在日历上选择班次日期,在时间网格上选择时段,然后单击“下一步”。Flow 会每天写入一条关联到该职位的班次。
日历通过 selectedDatesWithTimesJson 输出以 JSON 形式把所选内容交给 Flow。Flow 无法读取 JSON,所以需要解析器。它返回的每个条目包含以下字段:
| 字段 | 类型 | 内容 |
|---|---|---|
fromDate | Date | 班次的日期 |
toDate | Date | 班次为同一天;范围则为最后一天 |
startTime | 时间 | 所选的第一个时间段 |
endTime | 时间 | 所选最后一个时间段的结束时间 |
相邻的时间段合并成一个班次,所以 13:00 和 13:30 会变成 13:00 到 14:00。在同一天选择两段不相连的时间(比如上午和下午),这一天就会得到两个条目、两个班次。
使用场景:每个休假日一条记录
休假通常按天记录:工资按天计算,部分批准的申请也必须按天拆分。这种情况甚至不需要解析器。Date 组件还会输出 selectedDates,这是一个包含所有所选日期的纯文本列表,日期范围会逐日展开。
直接循环遍历这个列表即可。唯一要注意的是,每个条目都是 2026-11-09 这样的文本,所以要先用一行公式 DATEVALUE({!Loop_Days}) 把它转换成日期,再由分配元素复制到记录上。
使用场景:每个日期范围一条记录
有些事情跨越多天,但本质上是一件事:为期三天的研讨会、一次设备租借、从周一持续到周三的一次现场走访。这些需要的是一条带开始日期和结束日期的记录,而不是三条。
这就要用到 selectedDateRangesJson 输出。日历会把相邻日期合并成一个范围,所以选择 9 日、10 日和 11 日,会得到一个从 9 日到 11 日的条目。解析、循环,再把 fromDate 和 toDate 复制到开始和结束字段上。
现成 Flow:Record per Range
选择日期和日期范围,然后每个范围保存一条带开始和结束日期的记录。MDP_Starter_Record_Per_Range.flow-meta.xml
bookingSuccessCount 告诉 Flow 保存了多少条、通过 bookingConflictDates 告诉 Flow 哪些日期有冲突。在您的组织中使用现成 Flow
这些现成 Flow 保存到 MultiDatePick 自带的 Schedule 和 Event 对象,因此可以原样部署,安装后立即运行。看过它们的效果后,再换成您自己的对象。
- 复制或下载上方的 Flow XML。
- 从 VS Code 部署。用 VS Code 部署 Flow 会一步步带您完成。
- 在 Flow Builder 中打开它,单击第一个屏幕上的日历。输入您在设置向导中保存的配置或从 Config Library 导入的配置的 Config Name(配置名称),即可应用您的设置。
- 如果不使用 Schedule 和 Event,让它指向您的对象:更改记录变量的对象,以及分配中的字段。
- 激活它,然后用 Flow 组件或以操作的形式添加到记录页面。它会从
recordId变量读取记录的 Id。
会浪费您一下午的错误
- 在循环内保存。测试时用三个日期没问题,到了生产环境用四十个就会报超出限制的错误。
- 忘了把记录添加到集合中。分配需要两步:先设置字段,再把记录变量添加到集合中。少了第二步,最后的保存就没有任何内容可保存。
- 把文本赋给日期字段。
selectedDates列表是文本。先用DATEVALUE()包一下每个条目。 - 没有开启 Output As JSON。只有在日历的 Output As JSON 设置开启时,JSON 输出才会有值。现成 Flow 已将其开启。
- 从错误的位置启动。Flow 会把每条记录关联到
recordId。请从记录所属的职位、活动或人员启动它,否则关联会是空的。
常见问题
如何用一个 Salesforce 屏幕 Flow(Screen Flow) 创建多条记录?
在一个屏幕上收集所有选择,然后循环遍历。在循环中用“分配”元素填写记录变量,并把它添加到记录集合中。循环结束后,用一个“创建记录”元素一次保存整个集合。
“创建记录”应该放在 Flow 循环里面吗?
不应该。放在循环里的“创建记录”每个条目都要保存一次,而一个事务最多只允许 150 次这样的保存,所以列表一长就会失败,而且无论长短都会更慢。应在循环中构建记录集合,等循环结束后一次保存。
如何在 Salesforce Flow 中循环遍历 JSON?
Flow 本身无法读取 JSON,需要先把它转换成集合。MultiDatePick 自带一个操作 Parse Date Entries from JSON,可以把日历输出的 JSON 转换成条目列表,每个条目包含 fromDate、toDate、startTime 和 endTime,“循环”元素即可逐条遍历。
如何在 Salesforce 中为一个职位添加多个班次?
在从职位记录启动的屏幕 Flow 中放一个日期和时间选择器,让招聘人员选择班次的日期和时段,将所选内容解析成列表,再循环遍历,每天生成一条关联到该职位的班次记录。循环结束后,用一个“创建记录”全部保存。
循环遍历所选日期需要 Apex 吗?
不需要。解析操作随 MultiDatePick 一起提供,循环、分配和保存都是标准的 Flow 元素。如果只是整天,甚至不需要这个操作:日历还会输出一个简单的所选日期列表。
一个屏幕,生成它该生成的每一条记录。
复制上面的现成 Flow,或先在在线演示中试用日历。
- $20/用户/月,全部功能
- 30 天免费试用,无需信用卡
- 100% Salesforce 原生
- 无需 Apex
- 即将登陆 Salesforce AppExchange