MultiDatePick 用户指南

按管理员遇到的顺序,讲清每个组件、每项设置和每个常见陷阱。无需 Apex。

1. 三个组件:各自的适用场景

MultiDatePick 提供三个基于同一底层的 Lightning Web Components。选择与您的数据相符的那一个。

Date

在构建器中显示为:MultiDatePick - Dates

一次选择多个日期。最适合活动回复、出勤、休假、禁用日期和节假日日历。

Date 组件 →

Date Time

在构建器中显示为:MultiDatePick - Dates & Times

日期加时间段。最适合课程、预约、培训时间段和排班。

Date Time 组件 →

Booking

在构建器中显示为:MultiDatePick - Resource Booking

日期、时间和资源。最适合会议室、设备、人员以及任何有容量限制的资源。

Booking 组件 →

功能对比

功能逐级叠加。Date 的所有功能 Date Time 和 Booking 都有。Date Time 增加了时间,Booking 增加了资源和容量。

功能 Date Date Time Booking
三个组件均提供
日期选择✓✓✓
五种视图✓✓✓
状态颜色✓✓✓
屏蔽日期✓✓✓
加载现有记录✓✓✓
编辑模式✓✓✓
循环模式✓✓✓
仅限 Date Time 和 Booking
时间段✓✓
子块记录✓✓
仅限 Booking
资源选择器✓
容量标记✓

2. 记录结构:各自的适用场景

记录结构决定所选内容如何变成记录。它由三个相互独立的选择组成,任意组合都可行。

选择 1
时间

Date:只有日期,没有时间。

Date Time / Booking:每条记录都有开始和结束时间。

附加选项:开启合并时间跨度,整个时间范围生成一条父记录,其中的每个空档各生成一条子块子记录。

选择 2
资源

无:不带资源的 Date、Date Time 或 Booking。

单个资源:带资源下拉列表的 Booking。

多个资源:带复选框的 Booking,每个勾选的资源一条记录。

选择 3
日期范围

按点击:每个所选日期各为一条记录。点击五次,生成五条记录。

按范围:连续的日期合并为一条带开始和结束日期的记录。需设置 End Date Field API Name(结束日期字段 API 名称)。

设置向导定义了六种结构:每个日期一条记录、每个日期范围一条记录、每个时间段一条记录、父记录加子块、单个资源和多个资源。

实例:回答这 3 个问题

每个场景回答三个问题,就能确定结构。设置向导问的也是这三个问题。

Salesforce 中的 MultiDatePick 设置向导:“引导我完成设置”中关于时间、资源和日期范围的问题,每张答案卡片上都有一个小的记录结构示意图
“引导我完成设置”会在您的组织中问同样的 3 个问题,并为您选好结构。

休假申请

需要时间吗?不需要,只要日期。

需要资源选择器吗?不需要。

相邻日期要合并吗?要。周一到周五的休假应该是一条记录。

→ 按范围:一条记录,从周一开始,到周五结束。

会议室预订

需要时间吗?需要,每个预订都有开始和结束时间。

需要资源选择器吗?需要,选择一个会议室。

相邻日期要合并吗?不要,每个预订各为一条记录。

→ 单个资源:每个日期 × 时间段一条记录,关联到该会议室。

跨 3 个会议室的培训

需要时间吗?需要,每天的开始和结束时间相同。

需要资源选择器吗?需要,用复选框选择多个会议室。

相邻日期要合并吗?要,培训从周一持续到周五。

→ 多个资源,按范围:每个会议室一条覆盖整周的记录。

含午休的全天培训

需要时间吗?需要,上午 9 点到下午 5 点,中间有午休空档。

需要资源选择器吗?不需要。

空档需要单独记录吗?需要,作为一条独立的子记录。

→ 父记录加子块:一条从上午 9 点到下午 5 点的父记录,午休为一个子块。

组合表:所有组合一览

按您对时间和资源的需求选择行。列取决于是否设置了 End Date Field API Name。每个单元格都是有效的设置。

时间 + 资源 按点击
(未设结束日期字段)
按范围
(已设结束日期字段)
Date
无时间。Date 组件。
每个日期一条记录
1 个日期 → 1 条记录。
用途:活动回复、出勤、每日签到。
每个日期范围一条记录
连续日期 → 1 条带开始和结束日期的记录。
用途:休假、出差、多晚住宿。
Date Time
每条记录一个时间段。Date Time 组件。
每个时间段一条记录
1 个日期 × 1 个时间段 = 1 条记录。
用途:工时表、班次分段、培训时段。
共用时间段的日期范围。时间相同的连续日期 → 1 条记录。
用途:每天时间相同的多日培训。
Date Time + 合并时间跨度
父记录加表示空档的子块子记录
父记录加子块
一条父记录覆盖整个时间范围,其中每个空档成为一条子块子记录。
用途:含午休的培训、站点之间有路程的外勤路线。
Booking,单个资源
一个资源下拉列表。Booking 组件。
单个资源
每个日期 × 时间段 1 条记录,关联到该资源。
用途:会议室、培训师排程。
单个资源的日期范围。同一资源上的连续日期 → 每个范围 1 条记录。
用途:多晚的房间住宿、多日设备借用。
Booking,多个资源
资源复选框(允许选择多个资源)
多个资源
每个资源 × 日期 × 时间段 1 条记录。
用途:并行的团队会议、多会议室培训。
多资源的日期范围。N 个资源上的连续日期 → N 条记录,每个资源一条。
用途:同时在 3 个会议室进行的一周培训。
Booking + 合并时间跨度
父预订加表示空档的子块子记录
Booking 父记录加子块。资源全天被预订,休息时段也有记录。
用途:有维护时段的实验室设备。

总结:三个选择的任意组合都可行。如果您的场景不属于上面列出的模式,分别设置每个选择,其余交给组件即可。

3. 设置向导详解

设置向导只需保存一次配置。在任意页面或 Flow 屏幕的 Config Name(配置名称)中输入它的名称,该位置就会使用这个配置。修改配置后,所有使用它的位置都会随之更新。

  1. 1 名称与类型
  2. 2 对象与字段
  3. 3 时间字段
  4. 4 状态与显示
  5. 5 审阅与保存

选择起点

新建选项卡提供两种方式。引导我完成设置会问三个问题,然后选好组件和结构。配置所有属性会打开所有设置。旁边还有两个选项卡:现有配置用于编辑已保存的配置,导入用于粘贴来自 Config Library 的配置。

Salesforce 中的 MultiDatePick 设置向导:起始屏幕,提供“引导我完成设置”和“配置所有属性”两种方式
“引导我完成设置”会依次问这 3 个问题;“配置所有属性”直接进入步骤 1。

步骤 1:名称与类型

选择组件(Date、Date Time 或 Booking)并为配置命名。这个名称就是之后在 Config Name 中输入的内容。此步骤还设置视图:默认视图、切换器提供哪些视图,以及时间轴和日程的选项。

Salesforce 中的 MultiDatePick 设置向导“名称与类型”步骤:Date、Date Time 和 Booking 组件类型选择器,以及配置名称和标签输入框
步骤 1:选择组件,为配置命名。
MultiDatePick Salesforce 设置向导的视图选项:视图切换器选中日历、时间轴和日程,时间轴分组依据设为 Advisor Specialty 选项列表,日程字段选中 Client Name、Meeting Type 和 Status
视图选项:选择切换器中的视图,按任意选项列表或查找字段对时间轴行分组,从列表中选择日程的列。

步骤 2:对象与字段

最关键的一步。选择存放记录的对象、它的日期字段,以及指回父记录的关系字段。可选字段用于添加日期范围、资源、容量、子块和屏蔽日期。Booking 配置也在这里设置资源对象、容量字段和营业时间。

Salesforce 中的 MultiDatePick 设置向导“对象与字段”步骤:相关对象、日期字段、关系字段和结束日期字段选择器,以及放置位置选择器
步骤 2:向导读取您组织的架构,为每个字段提供下拉列表。
MultiDatePick Salesforce 设置向导“对象与字段”步骤:每个字段都是按所选对象(此处为 Advisor Appointment 和 Advisor)筛选的下拉列表,展开的容量字段列表只显示 Advisor 的数字字段
无需查找 API 名称。每个列表只显示类型正确的字段,因此容量字段只列出数字字段。
MultiDatePick Salesforce 设置向导的屏蔽日期部分:选择 Advisor Closure 对象作为来源,选好其 Closure Date、Start Time 和 End Time 字段,展开的资源字段列表显示其查找字段
屏蔽日期可以来自任何对象。选好对象后,日期、时间和资源列表会自动填充。

步骤 3:时间字段

仅限 Date Time 和 Booking。映射开始和结束时间字段,然后设置时间间隔(任意间隔均可,常用 15、30 或 60 分钟)、最早和最晚时间、显示模式,以及发生冲突时的处理方式。

Salesforce 中的 MultiDatePick 设置向导“时间字段”步骤:开始和结束时间字段、30 分钟时间间隔、网格显示模式、08:00 至 18:00、冲突行为为“阻止”、冲突前瞻 90 天,下方为实时预览
步骤 3:时间字段、间隔和冲突规则,下方为实时预览。

步骤 4:状态与显示

状态字段和颜色、要隐藏的状态、用户可选的状态、悬停字段、编辑模式、记录命名、按钮标签、日历大小,以及 Max Dates Allowed(最大选择数) 等限制。

Salesforce 中的 MultiDatePick 设置向导“状态与显示”步骤:状态字段、带色块的状态颜色映射,以及隐藏指定状态的预订
状态颜色会读取状态字段的选项列表值,并为每个值分配一个色块。
Salesforce 中的 MultiDatePick 设置向导“状态与显示”步骤:记录命名、悬停字段、日历大小、星期标题格式和功能开关
显示选项和功能开关,下方为实时预览。

步骤 5:审阅与保存

检查摘要,试用实时预览,然后单击保存配置。向导会在 30 到 60 秒内为您部署配置。完成后可添加一段可选描述。

Salesforce 中的 MultiDatePick 设置向导“审阅与保存”步骤:所有已选设置的摘要、已配置日历的可用预览,以及“保存配置”按钮
步骤 5:所有设置汇总在一个列表中,并附有可用的预览。单击“保存配置”之前不会保存任何内容。

现有配置与导入

已保存的配置列在现有选项卡中:单击某个配置即可编辑或导出。导入选项卡接受任意 Config Library 卡片中的 JSON,或从其他组织导出的配置。

Salesforce 中的 MultiDatePick 设置向导:“导入”选项卡中用于粘贴 JSON 配置的输入框,以及导入后的描述卡片
导入:粘贴 JSON 配置,在任何地方部署相同的设置。
Salesforce 中的 MultiDatePick 设置向导:“现有”选项卡列出已保存的配置及其组件类型、标签和描述
现有配置:所有已保存的配置,随时可以编辑或导出。
在屏幕 Flow(Screen Flow)中,只需设置 Config Name。所有复选框都来自配置,因此您永远不需要 $GlobalConstant。将父记录绑定到 Parent Record Id。

4. 权限集与访问权限

软件包附带四个权限集。在“设置”的“权限集”中分配。

权限集分配对象设置向导使用日历
MultiDatePick - Setup创建配置的管理员✓ 是否
MultiDatePick - User所有使用日历的人否✓ 是
MultiDatePick - All Access既创建配置又使用日历的管理员✓ 是✓ 是
MultiDatePick - Guest公共 Experience Cloud 站点的访客用户否✓ 查看和预订

组件以每个用户自己的权限运行,因此用户还需要拥有对您的对象和字段的访问权限:

  • 对象:对保存记录的对象拥有“读取”和“创建”权限,并对日历读取的任何资源、闭馆或子对象拥有“读取”权限。
  • 字段,读取:日历显示的每个字段(日期、状态、悬停字段)。
  • 字段,编辑:组件写入的每个字段(日期、时间、状态、第二个选项列表、名称字段、父级查找字段)。只要有一个字段用户无法编辑,保存就会失败,即使读取正常。
  • 被引用的记录:对新记录所指向的父记录和资源至少拥有“读取”权限。
管理员也需要字段访问权限。新建的自定义字段在权限集授予访问权限之前对所有人都不可见,包括系统管理员。如果保存时某个字段似乎不存在,请先检查字段级安全性。

每条错误消息及其原因见故障排除:访问错误。访客站点需要额外几个步骤:参阅公共访客页面。

5. 点击保存与 Flow 管理保存

保存方式有两种。根据放置位置选择合适的一种。

点击保存(Click to Save)

组件自行写入记录。填写四项设置后,组件自带的保存按钮就会出现。单击它即可创建子记录。无需 Flow 元素,也无需代码。

适用于:记录页面、应用程序页面、主页、Experience 站点,以及带父记录的 Flow 屏幕。

Flow 管理保存(Flow-Managed Save)

组件将所选内容交给您的 Flow。使用随附的 Parse Date Entries from JSON 操作,再接上您自己的“循环”和“创建记录”元素。

适用于:需要完全掌控的 Flow 屏幕:审批、按条件创建记录、额外验证。

点击保存:四项设置

设置向导会自动填写这些设置。四项都有值时,“保存”按钮就会出现。

设置项包含内容API 名称
Child Object API Name保存记录的对象relatedObjectApiName
Date Field API Name该对象上的日期字段dateFieldApiName
Relationship Field API Name指回父记录的查找字段relationshipFieldApiName
Parent Record Id 或 Static Parent Record Id父记录。在记录页面上自动填写。在 Flow 中绑定 Parent Record Id。在应用程序页面、主页和 Experience 页面上,将 Id 输入 Static Parent Record Id。recordId / staticRecordId
Flow 屏幕中的两个按钮。开启点击保存后,组件的保存负责写入记录,Flow 的下一步只负责前进。用户需先单击“保存”,再单击“下一步”。

页面使用哪条父记录,以及何时改为在 Flow 中选择,请参阅应用程序页面、主页和 Experience 页面。

Flow 管理保存:输出

将四项设置留空。“保存”按钮会隐藏,所选内容通过以下 Flow 输出传出:

输出内容组件
Selected Dates (Output)日期文本集合(YYYY-MM-DD)Date、Date Time
Date Ranges JSON (Output)按范围分组的连续日期Date、Date Time
Dates With Times JSON (Output)每个日期及其时间Date Time
Successful Bookings Count / Conflict DatesBooking 自行保存后的结果Booking

将 JSON 传给 Parse Date Entries from JSON。它返回一个可以循环遍历的列表,每一项都包含开始日期、结束日期、开始时间、结束时间和资源 Id。分步说明见Flow 示例。

保存只会新增

点击保存只会创建新记录。取消选择日期绝不会删除已保存的记录,因此误点不会丢失数据。要修改或删除记录,请使用编辑模式或相关列表。

6. 状态颜色与编辑模式

状态颜色与筛选

按对象上的任意选项列表为记录着色,隐藏部分值,并限制终端用户可选的值。

设置项作用API 名称
状态字段决定颜色的选项列表,例如 Confirmed / Tentative / Cancelled。statusField
状态颜色(Status Colors)为每个值指定一种颜色,例如 Confirmed:#22C55E, Tentative:#fbbf24。留空则自动配色。statusColors
状态颜色显示颜色的显示位置:日历、网格或两者。留空则客户页面干净简洁,不显示颜色。statusColorDisplay
忽略的状态(Ignored Statuses)隐藏具有这些值的记录(例如 No-Show,Cancelled),它们既不显示在日历上,也不计入容量。hideBookingsWithStatus
可选状态(Selectable Statuses)限制终端用户可选择的值,例如只允许 Requested,而员工可以看到全部值。selectableStatuses
两个页面,同一个对象。客户页面可以不显示颜色,只允许选择 Requested 状态,并隐藏 No-Show 和 Cancelled。基于同一批记录的后台页面则开启颜色并提供所有状态。

编辑模式

开启启用编辑模式后,会出现编辑按钮。在编辑模式下,用户可以:

  • 以卡片形式查看现有记录及其日期和状态
  • 单击日期,将其记录加入编辑集合
  • 修改日期、时间、资源或状态,记录随即更新
  • 删除需两次点击确认,不会误删
Salesforce 日历上 MultiDatePick 编辑模式的动画演示:选中两天 Requested 状态的预约,单击“全选”选中这两个预订,将状态改为 Confirmed,单击“应用更改”后两天都由蓝色变为绿色
批量更改状态:选中这些天,单击“全选”,选择状态,单击“应用”。
Salesforce 日历上 MultiDatePick 编辑模式的动画演示:选中某天的客户预约,在“移动到日期”中输入第二天,单击“应用更改”后该预订从 10 月 30 日移到 10 月 31 日,只有这一天仍被选中
移动预订:选中那一天,选择新日期,单击“应用”。同一个面板还可以更改资源或时间。
每天带状态颜色并打开编辑模式的 Salesforce 预订日历:所选日期列出每个预订的状态、时间和会议室,可批量更改状态、移动或重新分配
状态颜色为每一天着色。编辑模式列出当天的记录,随时可以修改。

7. 视图:一个组件,五种布局

每个组件都能呈现五种布局。它们通过相同的字段映射读取同一批记录,遵循相同的冲突规则、屏蔽日期和营业时间,保存方式也相同。切换视图只改变记录的外观,不改变记录的含义。

五种视图及其各自回答的问题

视图(View)回答的问题布局可写入?
日历14 号有什么安排?一次显示一个月,每天显示状态颜色。是。默认视图。
时间轴哪个资源有空,什么时候有空?左侧列出资源,顶部是日期。多日记录显示为一条横条。是
周周四下午 2 点谁有空?横向七天,纵向营业时间。可同时跨天和跨小时拖动选择。是
使用率谁超出了容量?按资源、按天显示容量使用情况的热力图。否,只读
日程接下来有什么安排?按顺序列出接下来 60 天。否,只读
不要把预订页面的默认视图设为使用率或日程。两者都是只读的,页面会因此失去主要用途。可以在可用视图中提供它们,但默认打开可写入的视图。

设置

设置项默认值作用
Viewview日历组件打开时显示的布局。
Available ViewsavailableViews留空切换器提供的视图,例如 calendar,timeline,agenda。留空则提供全部五种。默认视图始终包含在内,因此只需列出额外的视图。
Timeline Window (Days)timelineWindowDays14时间轴一次显示的天数。显示整月时,每个预订只有约二十像素宽,标签会被截断。设为 0 则显示整月。内侧箭头每次移动一个窗口,外侧箭头每次移动一个月。
Resource RowsresourceViewFilterallbooked 只显示当前视图中有预订的资源。这是缩短长列表的最佳方式,因为空行不包含任何信息。当所有资源都没有预订时,会重新显示全部资源。
Max View ResourcesmaxViewResources0(全部)限制时间轴和使用率显示的资源行数,最忙的排在前面。所有资源仍会计入统计。建议优先使用 Resource Rows,它只隐藏空行。
Agenda FieldsagendaFields留空每个日程行上的额外字段,最多四个。留空则沿用Hover Popover Fields。日期、时间和名称本来就在行上。
Capacity FieldcapacityField留空不属于视图设置,但使用率需要它才能显示百分比而非原始数量。

每个页面使用不同的视图

视图是每个放置位置上的设置,因此同一批记录在不同位置可以呈现不同外观。只需安装一次,一套字段映射。

放置位置视图(View)可用视图(Available Views)
招聘人员的面试页面周calendar,agenda
行政部门的会议室预订页面日历timeline,utilization
班次经理的排班表时间轴week,agenda
运营大屏日程utilization,timeline
公共 Experience Cloud 页面日历留空,或尽量精简

编辑模式在所有视图中都可用

开启启用编辑模式后,所有视图都会显示“编辑”按钮。在时间轴、周或日程视图中单击一条记录即可将其加入编辑集合,就像在月历上单击日期一样。在时间轴中批量更改状态,效果与在日历中完全相同。

时间轴:折叠行

当某个资源有重叠的预订时,它的行会折叠成一条,并显示同时 N 个标签。单击展开箭头,每个预订各占一道。折叠的行仍支持拖动、悬停和单击。

Salesforce 时间轴视图:重叠的多日预订在每个资源下分道堆叠,每个多道行都有展开箭头,顶部有一条合并容量条
重叠的预订分道堆叠。顶部的条显示每天的饱和程度。

时间轴:拖动改期

开启启用编辑模式后,时间轴上的横条可以拖动。拖住中间可将预订移到其他日期;拖住边缘可更改开始或结束。横条会显示将落在何处,松开即保存。在“日”缩放级别下,同样的操作会更改时间。

在 MultiDatePick Salesforce 时间轴上改期的动画演示:拖动一个项目的右边缘将其延长两天,再拖动另一个项目整体推后两天,松开即保存,横条上显示新日期
从边缘拉长一个预订,再把另一个滑到后面的日期。每次松开都会保存。

不只排会议室,也能排人

Resource Object API Name(资源对象 API 名称)可以是任何对象。将其设为 User,时间轴就变成排班表,周视图变成班次网格,使用率变成团队容量仪表板。

  • User 没有标准的容量字段。添加一个自定义字段(例如 Daily Capacity),即可以百分比查看使用率。
  • 将 Business Hours Start Field(营业时间开始字段)和 Business Hours End Field(营业时间结束字段)映射到 User 字段,周网格就会按每个人自己的工作时间显示。

Config Library 中有两个现成示例:团队容量规划 和 员工排班表。

MultiDatePick 以全部五种视图显示 Salesforce 预订:资源时间轴、月历、使用率热力图、周网格和日程列表
同一批预订,五种视图。

8. 资源预订与容量(Booking 组件)

单个资源

用户从下拉列表中选择一个资源,时间网格随即加载该资源的预订和容量。

多个资源

开启允许选择多个资源,下拉列表就会变成复选框。网格只显示所有勾选资源都空闲的时间段,单击“保存”即可一次性全部预订。

多资源模式下的 Salesforce 预订日历:勾选了两个资源,显示合并容量网格,每个时间段都有 X/Y 标记
勾选了两个资源。每个标记显示两者合计的已预订数和容量。

容量

允许多个预订共享同一时间段,并实时显示 3/5 这样的标记。时间段订满后不再接受预订。

设置项作用API 名称
容量字段资源上的一个数字字段,例如 Capacity = 5。capacityField
显示可用性(Show Availability Count)显示 X/Y 标记。showAvailabilityCount
容量汇总方式(Capacity Aggregation)Combined(默认)将所勾选资源的预订数和容量相加:两个容量为 5 的会议室显示 0/10。Distinct 把跨多个资源预订的同一活动只算一次,并取单个资源的最大容量:一门在 4 个教室上的课显示 1/5,而不是 4/20。capacityAggregation
容量功能需要两个预订时间字段。没有 Booking Start Time Field(预订开始时间字段)和 Booking End Time Field(预订结束时间字段),就没有可计数的时间段,组件会显示一条琥珀色横幅,而不是日历。

冲突

冲突行为决定所选时间段已被占用时如何处理。Conflict Look-Ahead Days 设置向前检查多少天(默认 360 天)。

值结果适用场景
Block(默认)已占用的时间段无法选择;保存时会停止并高亮显示冲突。大多数预订页面
Skip保存空闲时间段,跳过已占用的时间段。被跳过的日期通过 Conflict Dates (Output) 返回。在大量日期中抢占所有仍空闲的时间段
Allow不检查冲突,预订可以超出容量。有意超额预订

闭馆设置始终优先。即使设为 Allow,也无法在被屏蔽的时间段上保存。

9. 限制用户可选的内容

按日期数或时间段数,限制每个人最多能选多少。

设置项作用API 名称
Max Dates Allowed
Booking:Max Dates Per Booking
用户最多可选择的日期数。0 表示不限。maxSelections
最大时间段数(Max Time Slots)所有日期合计最多可选的时间段数。0 表示不限。设为 1 即每人只能预约一次。maxTimeSlotSelection
最早 / 最晚可选日期将固定日期范围以外的日期置灰。minDate / maxDate
最多提前预订 / 最短提前通知滚动窗口:最多提前 N 天预订,且至少提前 N 小时。maxDaysAhead / minNoticeHours
预订之间的缓冲时间在每个预订之后预留周转时间。bufferMinutes
添加到日历单击“保存”后,为刚保存的全部内容生成一个 .ics 文件。showAddToCalendar
允许过去日期关闭时只能选今天及以后。Date 和 Date Time 默认开启,Booking 默认关闭。allowPastDates
Max Dates Allowed 限制的是日期,不是时间段。即使上限为 1,用户仍可在这一天选择多个时间段。如需限制预订数量,请再设置最大时间段数。

10. 屏蔽日期、时间和资源(闭馆设置)

任何日历都可以从另一个对象读取闭馆记录,并将其覆盖的日期、时间段或资源置灰,这样用户只能在您营业时预订。将几项设置指向闭馆对象,其余交给组件即可。整天屏蔽适用于全部三个组件;按时间和按资源屏蔽需要 Date Time 或 Booking 的时间网格。

屏蔽与隐藏有什么区别?

两者听起来相似,作用却恰恰相反。屏蔽是减少可用性:时间段仍然显示,但无法预订。隐藏是把记录移出视图,从而释放其占用的时间段。

屏蔽(闭馆设置) 隐藏(按状态)
控制什么哪些日期、时间和资源可以预订哪些已保存的记录会显示
设置项屏蔽日期对象及其日期、时间和资源字段忽略的状态(Ignored Statuses)
依据闭馆或节假日列表:可以是单独的对象,也可以是经过筛选的预订对象记录本身的状态值
用户看到什么时间段仍在,但带删除线、置灰且无法点击记录从日历上消失
对容量的影响减少可用性释放可用性:隐藏的记录不再计入
数据并不存在预订,只是将其标记为禁止预订记录仍保存在 Salesforce 中
用途节假日、维护时段、关闭的会议室或区域已取消或已拒绝的预订,不应占据网格,也不应计入容量
同一个状态两种用法都可以,取决于您把它接到哪个功能上。以一个 Cancelled 预订为例:
  • Ignored Statuses = Cancelled → 该预订消失,其时间段重新开放。
  • 屏蔽日期对象 = 您的预订对象,并筛选 Status = Cancelled → 该预订屏蔽其日期,没人能再预订。
想释放时间段就隐藏,想继续禁止预订就屏蔽。

屏蔽日期设置

设置项作用API 名称
屏蔽日期对象存放闭馆记录的对象,例如 Office Closure 对象或您的预订对象。设置后即开启屏蔽。blockedDatesSourceObject
屏蔽日期的日期字段该对象上的日期字段。blockedDatesDateField
屏蔽日期开始 / 结束时间字段可选的时间字段。两者都设置则为部分时段屏蔽;留空则为整天屏蔽。适用于 Date Time 和 Booking。blockedDatesStartTimeField / blockedDatesEndTimeField
屏蔽日期资源字段可选的查找字段,将闭馆限定到某一个资源。留空表示闭馆适用于所有资源。适用于 Booking。blockedDatesResourceField
屏蔽日期筛选字段 / 筛选值可选的范围限定,例如 Region = North 或 Status = Cancelled。一张闭馆表就是靠它服务多个日历。blockedDatesFilterField / blockedDatesFilterValue

三个屏蔽级别

  1. 整天:不带时间的闭馆记录会将整个日期置灰。适用于全部三个组件。已关闭的日期即使已有预订,也保持关闭。
  2. 部分时段:带开始和结束时间的闭馆记录只屏蔽这些时间段,当天其余时间仍可预订。选中日期后即可看到被屏蔽的时间段。
  3. 单个资源:指向某个资源的闭馆记录只关闭该资源。在单资源视图中,该时间段带删除线;在合并视图中,它会显示一个小角标,并且在其他空闲资源上仍可预订。

使用时间网格?那就用部分时段屏蔽。整天屏蔽更适合只选日期的选择器。

闭馆对象的两种模式

  • 同一对象,用状态标记:将屏蔽日期对象指向您的预订对象并筛选 Status = Cancelled,已取消的预订就兼作闭馆记录。这种方式最简单,但该对象上的所有日历都会共用这些记录。请参阅 Config Library 中的 避开节假日的预约排期 配置。
  • 专用的闭馆对象:一个 Office Closure 对象,包含日期、可选的开始和结束时间、Region 字段以及可选的资源查找字段。每个日历按自己的区域筛选,闭馆记录也可以只针对某一个资源。请参阅 按小时关闭资源 配置。

如果想让员工自行屏蔽时间(比如负责人屏蔽某个上午),在内部页面或站点上放置一个保存到闭馆对象的 Date Time 组件即可。

被屏蔽时间段的表现

  • 外观:完全关闭的时间段带删除线并置灰。只对部分所选资源关闭的时间段会显示角标。
  • 选择:完全关闭的时间段无法单击,也无法拖过。
  • 保存:任何内容都不会保存到已关闭的资源、日期和时间上。选择多个资源时,只排除已关闭的那个,其余空闲资源照常预订。

一张闭馆表,多个日历

为闭馆对象添加一个标签字段(Region、Location、Building),并在资源上添加同样的字段。每个日历随后用资源筛选字段 / 筛选值显示自己的资源,用屏蔽日期筛选字段 / 筛选值读取自己的闭馆记录。

11. 公共访客页面(Experience Cloud)

将组件放到 Experience Cloud 站点上,任何人无需登录即可预订。以访客身份测试前,请完成以下全部五个步骤。

  1. 对象权限。为站点的访客用户授予每个对象的“读取”权限;如果访客要提交,还需授予“创建”权限。Salesforce 绝不允许访客编辑或删除记录,因此编辑、取消和删除页面应只给登录用户使用。
  2. 为组件涉及的每个字段设置字段级安全性,包括资源的营业时间字段和闭馆时间字段。缺少任何一个字段,资源或闭馆查询都会失败。
  3. 创建访客共享规则(读取),让访客能看到记录。对象的外部组织范围默认设置必须为私有,规则才会生效。以元数据部署的规则需要在“设置”的“共享设置”中单击一次重新计算。
  4. 为站点的访客用户分配 MultiDatePick - Guest 权限集。它包含组件加载数据所需的 Apex 类访问权限。
  5. 激活站点。发布和激活是两个独立的步骤。
访客看到的日历是空的?如果对象、字段和类访问权限都没问题,几乎总是第 3 步的共享重新计算没做。第 4 步和第 5 步是其次最常被遗漏的。
  • 访客看到哪条记录:公共页面使用 Static Parent Record Id,因此所有访客都针对同一条父记录预订(一个办公室、地点或资源)。如需每位访客对应一条记录,请用 Flow 配合 URL 参数来实现。真正的按用户日历需要登录用户。
  • 联系人和客户:Salesforce 对访客访问这两个对象有严格限制。请将访客预订保存到自定义对象,或使用需要登录的站点。
  • 同一页面上的多个组件:它们不会实时同步。请在组件之间加一个刷新提示,这样在一个组件中做的屏蔽才会显示在下一个组件中。

放置步骤见应用程序页面、主页和 Experience 页面。完整的站点示例见 Experience Cloud 预订。

12. 常见陷阱(FAQ)

看到横幅提示、找不到“保存”按钮或日历是空的?故障排除页面配有每条消息的截图和解决方法。

状态颜色没有生效
检查三点。(a) Status Field(状态字段)是否是准确的选项列表 API 名称?区分大小写。(b) Status Colors 是否使用 Value:#hex, Value:#hex 格式且不带引号?写成 'Confirmed':'#22C55E' 会在不报错的情况下失效。(c) 记录在该选项列表中是否真的有值?
保存的记录名称和预期不同
检查 Record Name Field(记录名称字段):如果字段长度较短,长名称会被截断。检查 Append Date to Record Name:开启后,每个名称都会附加所选日期和时间。
如何在容量网格中隐藏 Cancelled 记录?
将 Ignored Statuses 设为 Cancelled,或 Cancelled,Rejected 这样的列表。这些记录将从日历和容量统计中移除。
屏蔽和隐藏有什么区别?
屏蔽(闭馆设置)让日期、时间或资源保持可见但不可预订:节假日、维护、关闭的会议室。隐藏则把 Cancelled 等记录从日历和容量中移除,从而释放时间段。请参阅屏蔽与隐藏。
没有出现“编辑”按钮
开启启用编辑模式即可,这是三个组件唯一的要求。状态字段是可选的,它只会在编辑器中添加一个状态下拉列表。如果按钮仍然不显示,说明页面或配置中关闭了“启用编辑模式”。
我只想显示部分资源(会议室,不要设备)
使用资源筛选字段和资源筛选值。单个值:字段 Active__c,值 true。多个值(或):North,South。多个字段(且):字段 Type__c;Active__c,值 Conference Room;true。
Date Time 总是显示一个共用的时间选择器
应使用的设置是时间显示模式:网格或下拉。在网格模式下,所有日期共用一个网格。如需每个日期各自设置时间,请选择下拉,并开启允许每个日期使用不同时间。
如何从 Flow 管理保存改为点击保存?
填写 Parent Record Id、Child Object API Name、Date Field API Name(日期字段 API 名称)和 Relationship Field API Name(关系字段 API 名称)。删除 Parse Date Entries from JSON 操作以及创建记录的循环。之后由组件自带的“保存”按钮写入记录。
弹出了错误提示,但没有任何详细信息
打开浏览器的开发者控制台,查找以 [MDP:ERROR] 开头的行。即使提示很简短,完整错误也一定会记录在那里。

13. Flow 示例

以下内容全部在 Flow Builder 中完成,无需 Apex。

循环遍历所选日期

  1. 添加一个带 Date Time 组件的屏幕,将点击保存相关设置留空。
  2. 在屏幕之后添加 Parse Date Entries from JSON 操作,并传入 Dates With Times JSON (Output)。
  3. 循环遍历该操作返回的列表。每一项都包含开始日期、结束日期、开始时间和结束时间。
  4. 在循环内将值赋给记录变量,并加入一个集合。循环结束后一次性创建记录。

将最早和最晚日期汇总到父记录

想让父记录显示子记录的最早和最晚日期?根据您的数据选择合适的无代码方式。

您的设置做法
主从关系在父对象上添加两个汇总字段:日期字段的 MIN 和日期字段的 MAX。就这么简单。
查找关系在子对象上创建记录触发的 Flow(保存后)。用“获取记录”查询同一父记录下的子记录,按日期升序排列,只取第一条;再按降序做一次同样的查询。用这两个日期更新父记录的开始和结束日期。

更多 Flow 模式:屏幕 Flow 指南。

14. 对象与字段映射

每个组件页面都有完整的对象与字段映射图:

组件适用于任何对象。软件包中的示例对象(Schedule、Event、Resource、Sub Block)只是默认值。将设置指向您自己的、带有合适字段的自定义对象或标准对象即可。

15. 全部属性参考

三个组件的每一项设置,按您在 Lightning App Builder、Experience Builder 和 Flow Builder 中看到的标签列出。每个标签下方是其 API 名称。

全部属性 100 多个属性 单击展开:可搜索
属性 Date Date Time Booking 类型 默认值 说明
设置
Config NameconfigName✓✓✓String留空可选:由设置向导创建的 Config__mdt 记录的 DeveloperName。设置后,该配置中的所有字段和对象设置都会作为默认值应用。您在这里设置的文本和数字属性会覆盖配置。复选框则始终来自配置,因为未勾选的复选框与从未设置的复选框无法区分。
视图
Viewview✓✓✓Stringcalendar使用哪种视图呈现。calendar 是月网格(默认);timeline 以资源为行、日期为列;week 是按天、按小时的网格;utilization 是容量热力图,只读;agenda 是按时间顺序的列表,只读。
Available ViewsavailableViews✓✓✓String留空切换器中提供的视图,以逗号分隔,例如 calendar,timeline,agenda。留空则提供全部五种。上面的默认 View 始终包含在内。
Timeline Window (Days)timelineWindowDays✓✓✓Integer14时间轴视图一次显示的天数。显示整月时每个预订只有约二十像素宽,所有标签都会被截断,因此默认值为 14。设为 0 则显示整月。
Timeline ZoomtimelineZoom✓✓✓Stringweek时间轴视图的初始缩放级别:day(一天中的各小时)、week(Timeline Window 设置的天数)或 month。用户查看时可以切换缩放。
Timeline Group By FieldtimelineGroupByField✓✓✓String留空资源对象上某个字段的 API 名称(例如 Building__c),用于将时间轴行分组到带容量条的标题下。留空则显示为一个平铺列表。
Max View ResourcesmaxViewResources✓✓✓Integer0时间轴和使用率视图最多显示的资源行数,最忙的排在前面。避免资源过多时两个视图变成一堵无法阅读的墙。
Agenda FieldsagendaFields✓✓✓String留空日程视图每行在记录名称之后显示的字段,以逗号分隔。留空则沿用悬停字段。日期、时间和记录名称字段会自动跳过,因为行上已经显示了它们。
Resource RowsresourceViewFilter✓✓✓Stringall哪些资源在时间轴和使用率中占一行。all 显示所有资源;booked 只显示当前窗口内有预订的资源。缩短长资源列表时更推荐后者,因为隐藏空行不会丢失任何信息。
显示与布局
Button Labellabel✓✓✓StringDate:Select Dates;Date Time:Select Dates & Times;Booking:Book Resource打开日期选择器的按钮上显示的文本。示例:'Choose Dates' 或 'Add Dates'
Calendar TitlemodalTitle✓✓✓StringDate:Select Dates;Date Time:Select Dates & Times;Booking:Book Resource日历弹窗顶部显示的标题。
Show Inline (Always Visible)也显示为 Show Inline (No Button)showInline✓✓✓Booleantrue开启时,日历始终可见,无需单击按钮。关闭时,通过按钮在弹窗中打开日历。
Two-Month ViewtwoMonthView✓✓✓Booleanfalse开启时并排显示两个月,便于选择日期范围。关闭时一次显示一个月。
Calendar SizecalendarSize✓✓✓Stringmedium控制日历的整体尺寸。有效值:tiny、xsmall(很小)、small、medium、large。默认为 medium。tiny 或 xsmall 适合实用工具栏、侧边栏和仪表板磁贴,small 适合空间紧凑的位置,medium 适合大多数布局,large 适合触屏操作。
Day Header FormatdayHeaderFormat✓✓✓String3星期标题的长度。有效值:3、2、1。默认为 3。3 = SUN MON TUE,2 = SU MO TU,1 = S M T。
Week Starts on MondayweekStartsOnMonday✓✓✓Booleanfalse开启时,每周从周一开始(ISO 标准)。关闭时,每周从周日开始(美国标准)。
Show Recurring Pattern ButtonshowRecurringPattern✓✓✓Booleantrue开启时显示一个按钮,让用户快速选择截至某个结束日期的所有工作日、周末或一周中的指定几天。
Show Selection SummaryshowSelectedSummary✓✓✓Booleantrue开启时显示摘要,列出已选几个日期以及具体是哪些。
Show Done Button in Inline ModeshowDoneButtonInline✓✓✓Booleanfalse开启且启用了 Show Inline 时,显示一个“完成”按钮,单击后日历收起为摘要视图。
Show In-Component ToastshowSuccessToast✓✓✓Booleanfalse在组件内部显示成功/错误提示(Experience 站点需要此项,因为标准提示在那里不显示)。在记录页面上同样有效。
Show Add to Calendar After SavingshowAddToCalendar✓✓✓Booleanfalse保存成功后,“添加到日历”按钮会下载一个日历文件(.ics),刚保存的每条记录各对应一个事件。可在 Outlook、Google 日历和 Apple 日历中打开,Experience Cloud 访客也能使用。仅含日期的记录成为全天事件,带时间的记录保留其时间。
Calendar File Location FieldcalendarLocationField✓String留空资源对象上某个字段的 API 名称,其值会成为“添加到日历”文件中每个事件的地点,例如会议室的地址,或用 Name 表示会议室本身。如果资源是人员(例如顾问或技术人员),请留空:事件标题中已经有他们的名字,而人并不是地点。需要开启 Show Add to Calendar After Saving。
Success Toast Message (optional)successToastMessage✓✓✓String留空可选:保存成功时显示的自定义消息。留空则使用默认消息。
选择规则
Requiredrequired✓✓✓Booleanfalse开启时,用户必须至少选择一个日期,Flow 才能进入下一个屏幕。
Max Dates Allowed也显示为 Max Dates Per BookingmaxSelections✓✓✓Integer0用户最多可选择的日期数。0 = 不限。
Max Time SlotsmaxTimeSlotSelection✓✓Integer0用户总共(所有日期合计)最多可选择的时间段数。0 = 不限。
Allow Past DatesallowPastDates✓✓✓BooleanDate:true;Date Time:true;Booking:false开启时,用户可以选择任何过去的日期。关闭时,只能选择今天及以后的日期。
Earliest Selectable Date也显示为 Earliest Bookable DateminDate✓✓✓Date留空用户可选择的最早日期,此前的日期置灰。如果想禁止当天预订,请改用 Minimum Notice:它会随时间自动向前推移。
Latest Selectable Date也显示为 Latest Bookable DatemaxDate✓✓✓Date留空用户可选择的最晚日期,此后的日期置灰。
Book Up To (Days Ahead)maxDaysAhead✓✓✓Integer0滚动预订时间窗:最晚可选日期为今天加上这个天数,并且每天自动向前推移。0 表示不限。如果同时设置了 Latest Selectable Date,以两者中较早的为准。
Minimum Notice (Hours)minNoticeHours✓✓✓Integer0开始时间早于“当前时间加上这个小时数”的内容都不能选择或保存。更早的日期置灰,截止当天较早的时间段会关闭。保存时还会再检查一次,因此即使页面开了一整夜,也无法在通知期内预订。0 表示没有最短要求。
Pre-Selected DatesdefaultDates✓✓✓String[]留空日历打开时已选中的日期。使用 ISO 格式(YYYY-MM-DD)。
Blocked DatesdisabledDates✓✓✓String[]留空不能选择的特定日期(显示为灰色)。用于节假日或禁用日期。使用 ISO 格式(YYYY-MM-DD)。
Only These Dates Are SelectableavailableDates✓✓✓String[]留空设置后,只有这些日期可选,其他日期全部置灰。使用 ISO 格式(YYYY-MM-DD)。适合有效日期来自 Flow 中其他来源的情况。
Auto-Jump to First Available DateautoJumpToFirstAvailable✓✓✓Booleanfalse开启且设置了 'Only These Dates Are Selectable' 时,日历会自动打开到第一个可用日期所在的月份。
Allow Whole-Day (No Times)allowWholeDayNoTimes✓✓Booleanfalse开启时,选择未带时间段的日期会保存一条全天记录(屏蔽或预订整天)。带时间段的日期保存为带时间的记录。
记录与保存
Parent Record IdrecordId✓✓✓String留空设置后,组件以点击保存模式运行,写入关联到该父记录的子记录。传入来自“获取记录”或 recordCreate 输出的记录 Id(例如 {!recordVar.Id})。留空则使用标准的“解析 + 循环 + 创建”模式。
Static Parent Record IdstaticRecordId✓✓✓String留空特殊情况:硬编码一个记录 Id,将此日历固定到单条父记录。适用于记录页面、应用程序页面(需要静态 Id)、主页(需要静态 Id)和 Experience 站点(需要静态 Id)。在记录页面上请留空:页面的记录会自动注入。
Parent Record Id FieldparentRecordIdField✓✓✓String留空仅当此组件位于与父对象不同的另一个对象的记录页面上时才需要。输入指向真正父记录的查找字段的 API 名称。如果组件就在父对象的页面上,请留空。
Child Object API Name也显示为 Related Booking Object API Name;Child Object API Name (for preload)relatedObjectApiName✓✓✓String留空每个所选日期保存为记录时所用对象的 API 名称。示例:Appointment__c、Schedule_Entry__c。点击保存必填。
Date Field API Name也显示为 Date Field API Name (for preload)dateFieldApiName✓✓✓String留空子对象上存储所选日期的日期字段的 API 名称。示例:Event_Date__c、Start_Date__c
End Date Field API Name也显示为 End Date FieldendDateField✓✓✓String留空子对象上结束日期字段的 API 名称。设置后,相邻的所选日期会合并为一条带开始和结束日期的记录,而不是每个日期一条记录。示例:End_Date__c
Relationship Field API Name也显示为 Parent Record Relationship FieldrelationshipFieldApiName✓✓✓String留空子对象上指回父记录的查找字段的 API 名称。示例:Account__c、Contact__c、Order__c
Load Existing Dates也显示为 Load Existing BookingspreloadExistingDates✓✓✓Booleantrue开启时,加载时查询现有子记录,并在日历中显示其日期。需要设置 Child Object、Date Field 和 Relationship Field。
Existing Dates Mode也显示为 Existing Bookings ModepreloadMode✓✓✓Stringeditable控制已加载日期的显示方式。仅在开启 Load Existing Dates 时生效。有效值:editable、readonly。默认:editable。editable = 日期处于选中状态,可以更改。readonly = 日期显示为灰色,无法移除。在 Flow 中这是一个自由文本输入框,请准确输入上述值之一。
Save Button LabelsaveButtonLabel✓✓✓String保存点击保存模式下保存按钮上的文本。示例:'Save Dates'、'Confirm Selection'
Record Name FieldrecordNameField✓✓✓String留空子对象上用于保存记录标签的文本字段的 API 名称。设置后会出现一个文本框,供用户输入标签。
Default Record NamedefaultRecordName✓✓✓String留空预先填入记录名称输入框,用户在运行时可以修改。示例:'PTO Day'、'Team Meeting'。
Append Date/Time to Record Name也显示为 Append Date to Record NameappendDateTimeToName✓✓✓Booleantrue开启时,在记录名称后附加日期。
状态与编辑
Status FieldstatusField✓✓✓String留空子对象上选项列表/状态字段的 API 名称。配置后,记录名称输入框旁会出现状态下拉列表,用户选择日期时即可指定状态。Status Colors、Ignored Statuses、Status Field Label 和 Enable Edit Mode 都需要此项。示例:Status__c
Status ColorsstatusColors✓✓✓String留空状态值到十六进制颜色的映射,以逗号分隔。格式:Value:#hex。状态颜色显示在日历的日期单元格上。需要 Status Field。示例:Confirmed:#22C55E, Tentative:#fbbf24, Pending:#60a5fa, Cancelled:#a1a8b5
Status Color DisplaystatusColorDisplay✓✓✓StringDate:calendar;Date Time:both;Booking:both状态颜色的显示位置。Dates 组件只能使用 'calendar':日历上的日期单元格按其状态着色。
Ignored Statuses也显示为 Ignored StatuseshideBookingsWithStatus✓✓✓String留空以逗号分隔的状态值列表,具有这些状态的记录会从日历中隐藏。隐藏的记录不参与显示,但仍保留在 Salesforce 中。需要 Status Field。示例:Cancelled, Rejected
Selectable Statuses (Status Picker)selectableStatuses✓✓✓String留空预订状态选择器可设置的状态值,以逗号分隔。留空则允许全部(适合后台)。客户站点可设为 'Scheduled' 等。只有一个状态可选时会自动选中,并隐藏选择器。需要 Status Field。
Second Picklist FieldsecondStatusField✓✓✓String留空可选:用户保存时选择的第二个选项列表字段的 API 名称(例如 Reason__c)。不参与着色,日历颜色由 statusField 决定。将其加入 Hover Popover Fields 即可显示。适用于 Flow、App Builder 和 Communities。
Second Picklist LabelsecondStatusFieldLabel✓✓✓String留空可选:第二个选项列表下拉框的显示标签。留空则组件会根据字段 API 名称自动生成易读的名称。
Selectable Second-Picklist ValuesselectableSecondStatuses✓✓✓String留空可选:以逗号分隔的白名单,列出用户可为第二个选项列表选择的值。留空则允许全部。只列出一个值时会自动选中,并隐藏选择器。
Status Field LabelstatusFieldLabel✓✓✓String留空可选:向终端用户显示的状态下拉框标签。请不要在此输入字段 API 名称:这里只是显示标签。留空则组件会根据 Status Field 的 API 名称自动生成易读的名称。
Hover Popover FieldshoverFields✓✓✓String留空以逗号分隔的字段 API 名称列表,鼠标悬停在已有记录的日历日期上时显示。字段从子对象查询,支持关系字段。只有在加载了现有记录(通过 Load Existing Dates)时才会显示数据。示例:Name, Status__c, Notes__c。留空则禁用悬停弹窗。
Enable Edit ModeenableEditMode✓✓✓Booleantrue开启时,用户可以单击已有日期来编辑日期值或状态,或删除记录。需要同时配置 Status Field 和 Status Colors。
Edit Button LabeleditButtonLabel✓✓✓String留空编辑模式切换按钮的自定义标签。留空则默认为“编辑日期”。
Edit Record DisplayeditRecordDisplay✓✓✓String留空以逗号分隔的关键字,控制编辑模式记录列表中显示哪些字段及其顺序。关键字:name、status、time、date、resource。留空时默认为:name, status, time。示例:name, date, status
时间段
Time Display ModetimeDisplayMode✓Stringgrid时间的呈现方式。有效值:grid、dropdown。默认:grid。grid = 可视化时间段网格,用户单击或拖动即可选择时间段。dropdown = lightning-input 时间选择器。在 dropdown 模式下,用 Allow Different Times Per Date 控制共用一个选择器还是每个日期各一个。在 Flow 中这是自由文本输入框,请准确输入上述值之一。
Time Interval (Minutes)也显示为 Time Slot Interval (Minutes)timeInterval✓✓Integer30时间段之间相隔的分钟数。任何整数均可,常用 15、30 或 60 分钟。示例:30 显示为 9:00、9:30、10:00。
Earliest TimeminTime✓String09:00时间选择器中显示的最早时间。使用 24 小时制(HH:mm)。示例:08:00 = 上午 8:00,13:00 = 下午 1:00。留空则从凌晨 12:00 开始。
Latest TimemaxTime✓String18:00时间选择器中显示的最晚时间。使用 24 小时制(HH:mm)。示例:17:00 = 下午 5:00,20:00 = 晚上 8:00。留空则到晚上 11:30 结束。
Start Time Field也显示为 Start Time Field API NamestartTimeField✓String留空子对象上存储时间段开始时间的时间字段的 API 名称。示例:Start_Time__c
End Time Field也显示为 End Time Field API NameendTimeField✓String留空子对象上存储时间段结束时间的时间字段的 API 名称。示例:End_Time__c
Allow Different Times Per DateallowDifferentTimes✓✓Booleanfalse开启且 Time Display Mode 为 'dropdown' 时,每个日期都有自己的时间选择器(按周分组)。关闭时,所有日期共用一个时间。Time Display Mode 为 'grid' 时无效。
Enable End TimeenableEndTime✓Booleantrue开启时,在开始时间旁显示单独的结束时间下拉框,并在 JSON 输出中同时输出 startTime 和 endTime。仅在 dropdown 模式(Time Display Mode = 'dropdown')下生效,grid 模式下无效。
Group Time Slots by PeriodgroupTimeSlotsByPeriod✓✓Booleanfalse开启时,时间段分为上午、下午和晚上三组。关闭时(默认)显示为平铺网格。仅在 Time Display Mode 为 'grid' 时生效。
Time Grid OnlytimeGridOnly✓✓Booleanfalse开启时,完全隐藏日历,只显示某个隐含日期的时间段网格。用户选择时间段后,记录通过点击保存写入宿主记录(没有选择日期这一步)。隐含日期依次取自 Time Grid Date、Time Grid Date Field,都没有则为今天。
Time Grid DatetimeGridDate✓✓String留空可选:Time Grid Only 开启时,明确指定隐含日期的 ISO 日期(YYYY-MM-DD),优先级最高。留空则从 Time Grid Date Field 读取,或回退到今天。
Time Grid Date FieldtimeGridDateField✓✓String留空可选:Time Grid Only 开启时(记录页面场景),从宿主记录上哪个日期字段读取隐含日期,填写其 API 名称。仅在 Time Grid Date 为空时使用。示例:Appointment_Date__c
Disable Time Slot Grid (Full-Day Mode)disableTimeSlotGrid✓Booleanfalse开启时隐藏时间段网格,适用于只关心日期的整天预订场景。关闭时(默认)显示时间段网格,可按时间精细预订。
资源与容量
Resource Object API NameresourceObjectApiName✓String留空存储可预订资源的对象的 API 名称。每条记录 = 下拉列表中一个可预订的资源。示例:Room__c、Equipment__c、Vehicle__c、Staff__c
Resource Name FieldresourceNameField✓StringName包含资源显示名称的字段的 API 名称,通常为 'Name'。
Resource Filter Field (optional)resourceFilterField✓String留空资源对象上用于限制选择器中显示哪些资源的字段的 API 名称,与 Resource Filter Value 配合使用。用 ';' 组合多个字段(且)。示例:'Active__c'(一个布尔字段)、'Type__c'(一个选项列表)、'Type__c;Building__c'(两个字段以“且”组合)。留空则显示所有资源。
Resource Filter Value (optional)resourceFilterValue✓String留空筛选字段必须等于的值。同一字段内的多个值用 ',' 分隔,表示“或”(IN 子句)。值之间用 ';' 分隔,表示跨多个字段的“且”(数量必须与 Resource Filter Field 中的字段数一致)。示例:'true':Active=true。'Conference Room':Type=Conference Room。'North,South':Building 为 North 或 South。'Conference Room;North':Type=Conference Room 且 Building=North。'Conference Room;North,South':Type=Conference Room 且 Building 为 North 或 South。
Business Hours Start FieldbusinessHoursStartField✓String留空资源对象上定义每天开始可用时间的时间字段的 API 名称。示例:Business_Hours_Start__c(设为 08:00:00.000Z 表示上午 8:00)。留空则时间段覆盖配置的完整区间。
Business Hours End FieldbusinessHoursEndField✓String留空资源对象上定义每天最后可用时间的时间字段的 API 名称。示例:Business_Hours_End__c(设为 18:00:00.000Z 表示下午 6:00)。
Allow Multiple Resources也显示为 Allow Booking Multiple ResourcesallowMultipleResources✓Booleanfalse开启时,用户可以用复选框选择多个资源并同时全部预订。时间网格只显示所有所选资源都可用的时间段。示例:同时预订一间会议室和一台投影仪。
Allow No Resource也显示为 Allow Save Without Picking a ResourceallowNoResource✓Booleanfalse开启时,用户可以不选任何资源就保存:保存的记录的资源查找字段为空。适用于写入闭馆或禁用日期的场景,其中空资源表示“适用于所有人”。下游日历按资源筛选读取闭馆记录(blockedDatesResourceField)时,会把空资源视为整个区域,因此与 allowNoResource 配合即可实现“可选按顾问限定”的模式。在必须选择资源的常规预订场景中,请保持关闭(默认)。
Booking Object API NameresourceBookingObject✓String留空创建预订记录的对象的 API 名称。每个资源每个日期一条记录。示例:Room_Booking__c、Equipment_Reservation__c
Booking Date FieldbookingDateField✓String留空预订对象上日期字段的 API 名称。必须是 Date 类型(不能是 DateTime)。示例:Booking_Date__c
Booking Resource FieldbookingResourceField✓String留空预订对象上指向资源的查找字段的 API 名称。示例:Room__c(从 Room_Booking__c 指向 Room__c 的查找字段)
Booking Start Time FieldbookingStartTimeField✓String留空预订对象上开始时间字段的 API 名称。示例:Start_Time__c。对于不带时间段、只按日期的预订,请留空。
Booking End Time FieldbookingEndTimeField✓String留空预订对象上结束时间字段的 API 名称。示例:End_Time__c。系统会根据所选时间段计算结束时间。
Book Button LabelresourceBookButtonLabel✓StringBook确认预订按钮上的文本。示例:'Book Now'、'Reserve'、'Confirm Booking'
Capacity FieldcapacityField✓String留空资源对象上数字字段的 API 名称,定义每个时间段可同时容纳的最大预订数。设置后,时间段会显示 X/Y 标记,订满前始终可预订。非常适合培训教室、共享工位或课程报名。留空则每个时间段只能预订一次。示例:Capacity__c
Capacity Aggregation (multi-resource)capacityAggregation✓StringCombined仅限容量预订模式(需要 Capacity Field)。控制选择多个资源时 X/Y 容量的计算方式。COMBINED(默认)将预订数和容量分别相加:适合每个资源都是独立库存的情况(例如 4 个容量各为 5 的会议室中有 4 条记录 = 4/20)。DISTINCT 按唯一事件计数(跨资源日期 + 开始时间 + 结束时间都相同的记录算作一个),并取单个资源的最大容量:适合一个活动同时占用多个资源的情况(4 个会议室中的 4 条记录 = 1/5)。
Show Availability CountshowAvailabilityCount✓Booleantrue开启时,在资源面板中显示可用性详情(例如“5 天中有 3 天可用”),帮助用户在预订前选出最合适的资源。需要配置 Resource Object API Name。
冲突
Conflict BehaviorconflictBehavior✓✓Stringblock控制所选日期与现有记录存在时间冲突时如何处理。'block'(默认):阻止保存并高亮显示冲突日期。'skip':继续保存,但跳过冲突日期。'allow':不检查冲突。仅在共用网格模式下生效(Time Display Mode='grid' 且 Allow Different Times Per Date=OFF)。
Buffer Between Bookings (Minutes)bufferMinutes✓✓Integer0每个现有预订之后预留的空闲分钟数,用于整理或周转;在 Booking 中按资源计算。凡是会落在缓冲时间内开始的时间,在所有显示可用性的地方(时间网格、容量计数、周视图拖动)以及保存时都视为已占用,具体如何处理由 Conflict Behavior 决定。示例:15 表示同一会议室的两场会议之间留出一刻钟。
Conflict Look-Ahead DaysconflictLookAheadDays✓✓Integer360向前检查时间段冲突并加载可用性的天数。默认:360。对于数据量大的对象,可调小此值以提升性能。
子块
Consolidate Time SpanconsolidateTimeSpan✓✓Booleanfalse开启时,所选时间段输出为一个从第一个时间段开始到最后一个时间段结束的完整跨度。所选时间段之间的空档会自动变为橙色,并作为子块记录。适用于既需要完整班次跨度(例如上午 9 点到下午 5 点)、又要单独记录休息时间的排班场景。仅在 grid 模式下生效。
Sub-Block Button LabelsubBlockModeButtonLabel✓✓String留空设置后会添加一个切换按钮,让用户手动将时间段标记为子块(橙色)。适合位于工作跨度两端的子块。留空则只使用自动橙色标记。示例:'Mark as Break'、'Mark as Lunch'。需要开启 Consolidate Time Span。
Show Sub-Block Toggle ButtonshowSubBlockButton✓✓Booleanfalse开启时,在时间网格标题栏中显示子块切换按钮。需要开启 Consolidate Time Span 并设置 Sub-Block Button Label。
Sub-Block Object API NamesubBlockObjectApiName✓✓String留空子块记录所用子对象的 API 名称。示例:Work_Break__c。需要开启 Consolidate Time Span,并使用点击保存模式(已设置 Parent Record Id)。
Sub-Block Parent Lookup FieldsubBlockParentLookupField✓✓String留空子块对象上链接到父记录的查找字段。示例:Shift__c。设置了 Sub-Block Object 时必填。
Sub-Block Date FieldsubBlockDateField✓✓String留空子块对象上的日期字段。示例:Break_Date__c。设置了 Sub-Block Object 时必填。
Sub-Block Start Time FieldsubBlockStartTimeField✓✓String留空子块对象上的开始时间字段。示例:Break_Start__c。设置了 Sub-Block Object 时必填。
Sub-Block End Time FieldsubBlockEndTimeField✓✓String留空子块对象上的结束时间字段。示例:Break_End__c。设置了 Sub-Block Object 时必填。
Sub-Block Name FieldsubBlockNameField✓✓String留空子块对象上用于存储标签的文本字段。示例:Break_Name__c。设置了 Sub-Block Object 时必填。
屏蔽日期
Blocked Dates ObjectblockedDatesSourceObject✓✓✓String留空要查询的对象的 API 名称,其中的日期将禁止选择。示例:Public_Holiday__c
Blocked Dates Date FieldblockedDatesDateField✓✓✓String留空屏蔽日期对象上日期字段的 API 名称。需要先设置 Blocked Dates Object。
Blocked Dates Start Time FieldblockedDatesStartTimeField✓✓✓String留空可选:屏蔽对象上标记部分时段闭馆开始时间的时间字段。同时设置开始和结束时间字段,且屏蔽记录两者都有值时,当天只关闭该时间范围(其余时间仍可预订)。留空则整天屏蔽。
Blocked Dates End Time FieldblockedDatesEndTimeField✓✓✓String留空可选:屏蔽对象上标记部分时段闭馆结束时间的时间字段。与 Blocked Dates Start Time Field 配合使用。
Blocked Dates Resource FieldblockedDatesResourceField✓✓✓String留空可选:将现有闭馆限定到某一个资源。填写屏蔽对象上查找/资源字段的 API 名称;当屏蔽记录的资源与日历所选资源一致时,只关闭该资源在该时间范围内的预订。留空则每条闭馆记录适用于所有资源(整个区域)。屏蔽功能本身由 Blocked Dates Source Object 开启,而不是此字段。仅在资源预订中有意义。
Blocked Dates Filter FieldblockedDatesFilterField✓✓✓String留空可选:屏蔽对象上的筛选字段。两种模式:(a) 值模式:设置了 Blocked Dates Filter Value 时,按 <field> = <value> 限定屏蔽记录(例如 Status__c = Cancelled)。(b) 父级范围模式:Filter Value 为空时,将此字段视为指向当前记录的查找字段,按 <field> = recordId 限定。留空则全局屏蔽。
Blocked Dates Filter ValueblockedDatesFilterValue✓✓✓String留空可选:用于筛选 Blocked Dates Filter Field 的值。设置后,屏蔽记录必须满足 <filterField> = <filterValue>(例如 Status__c = Cancelled)。这样多种屏蔽类别可以共存于同一张表中,由每个使用它的日历自行选择适用的类别。
Flow 输出
Output Date Ranges as JSONoutputAsJson✓✓Booleanfalse开启时,将连续日期分组为范围,填入 Date Ranges JSON 输出。如果要用 MultiDatePickParser 操作循环遍历日期范围,则必须开启。
Selected Dates (Output)selectedDates✓✓String[]留空输出:所有所选日期的数组,ISO 格式(YYYY-MM-DD)。在 Flow 中用它创建记录或传给下一个屏幕。
Date Ranges JSON (Output)selectedDateRangesJson✓✓String留空输出:将连续日期分组为范围的 JSON。仅在开启 'Output Date Ranges as JSON' 时填充。传给 MultiDatePickParser 即可在 Flow 中循环遍历。
Dates With Times JSON (Output)selectedDatesWithTimesJson✓String留空输出:包含每个日期及其所选时间的 JSON 字符串。传给 MultiDatePickParser 即可在 Flow 中循环遍历。
Sub-Blocks JSON (Output)subBlocksJson✓String留空输出:每个日期的子块(空档/休息)时间窗口的 JSON。仅在开启 Consolidate Time Span 时填充。在 Flow 循环中用它创建子记录。
Successful Bookings Count (Output)bookingSuccessCount✓Integer留空输出:成功创建的预订记录数。在 Flow 中用它显示确认消息。
Conflict Dates (Output)bookingConflictDates✓String[]留空输出:因与现有预订冲突而无法创建预订的日期列表。

16. 安全性与无障碍

  • 已通过 Salesforce AppExchange 安全审查。
  • 100% 原生。您的数据始终留在您的 Salesforce 组织中。没有外部服务器,也没有外部调用 (callout)。请参阅信任与安全。
  • 始终遵循您的权限。每次读取和保存都以用户自己的访问权限运行,因此每条记录都会强制执行对象权限、字段级安全性和共享规则。
  • 无障碍。符合 WCAG 2.1 AA,已使用 axe-core 测试。提供完整的 VPAT 2.5。
  • 9 种语言:英语、西班牙语、法语、德语、日语、印地语、葡萄牙语(巴西)、意大利语、简体中文。

17. 有问题或发现错误?

发现本指南有遗漏,或有功能出错?请发送电子邮件至 support@multidatepick.com。

准备在您的组织中亲自体验?

每用户每月 $20,包含全部功能,30 天免费试用。即将登陆 Salesforce AppExchange。