如何让用户在 Salesforce 屏幕 Flow(Screen Flow)中选择多个日期
Flow 的每个屏幕元素只提供一个日期字段。如果有人需要选九天,这就成了问题。下面是各种方案及其利弊。
每位管理员迟早都会遇到这个问题。休假申请、空闲时间表、培训报名:用户需要选择几个不一定连续的日期,而 Flow 的标准日期组件只能采集一个。
各种变通办法,以及它们的痛点
| 方案 | 做法 | 代价 |
|---|---|---|
| 一个屏幕上放多个日期字段 | 日期 1、日期 2、日期 3、日期 4…… | 数量有上限、不美观,而且大多空着 |
| 用循环一次问一个 | “还要添加日期吗?”然后回到屏幕 | 超过三个日期左右就很痛苦 |
| 一个自由文本字段 | 用户以文本形式输入日期 | 无法解析、无法用于报表、容易出错 |
| 只用开始和结束日期 | 当作一个连续的范围处理 | 只要日期不连续就是错的 |
| 日期的多选选项列表 | 预先生成日期值 | 很快过时,需要不断维护 |
| 多日期日历组件 | 在一个屏幕上单击需要的每个日期 | 返回一个集合,可直接循环 |
开始加结束日期的变通办法最常见,也最容易在不知不觉中出错。“我 3 号、4 号、11 号和 18 号要请假”变成了 3 号到 18 号,相当于默认缺勤十六天。数据看起来很整齐,但就是错的。
真正的解决办法:一个返回集合的屏幕组件
Flow 真正需要的,是一个让用户想选多少日期就选多少、然后交回一个集合的屏幕组件。有了它,Flow 的其余部分就很普通了:循环遍历集合,每个日期创建一条记录,完成。
MultiDatePick 会根据您采集的内容返回多个输出:
| 输出 | 包含内容 | API 名称 |
|---|---|---|
| Selected Dates | ISO 日期组成的文本集合,可直接循环 | selectedDates |
| Date Ranges JSON | 合并后的范围,适用于连续日期应合并为一条记录的情况 | selectedDateRangesJson |
| Dates With Times JSON | 每个日期的开始和结束时间 | selectedDatesWithTimesJson |
| Successful Bookings Count、Conflict Dates | 哪些已保存,哪些有冲突 | bookingSuccessCount |
把 JSON 变回记录
其中两个输出是 JSON,因为 Flow 没有“由多个含若干字段的对象组成的列表”这种原生类型。您不需要在公式里解析文本。安装包附带一个 Flow 操作 Parse Date Entries from JSON,它接收 JSON 并返回一个规范的集合,包含 From Date、To Date、Start Time 和 End Time。像其他集合一样循环遍历即可。
一个会浪费大家一小时的坑
设置 Config Name(配置名称),而不是复选框。这个组件有一长串开关属性,而在 Flow Builder 中,留空的复选框输入是“空”而不是 false。这些都可以跳过:在设置向导中构建日历,然后把该配置的名称填入 Config Name 属性。所有开关设置随即来自配置,少数仅限 Flow 的设置(Required、Show Inline、Output Date Ranges as JSON)保持关闭,除非您主动开启。只有在不用 Config Name、全部手动设置时,才需要在您关心的复选框上使用
$GlobalConstant.True 或 $GlobalConstant.False。
想让组件自己保存记录?把父记录的 Id 传入 Parent Record Id,它就会为每个日期创建一条子记录。留空则可以循环遍历输出,按您自己的方式创建记录。
构建之前先决定记录形状
同样选中的九个日期,可以变成九条记录;如果连续日期合并成范围,可以变成四条记录;也可以是一条父记录加子块。每种都适合不同的报表。请在构建 Flow 之前就决定,因为事后再改,除了编辑 Flow 还得迁移数据。