重复日历事件预测:基于三种模式生成后续10个预约日期
Google Sheets 调度日历日期生成方案
核心需求
从"Unit Log"工作表提取指定单元的最后一次预约日期,根据选中的三种模式之一生成后续10个预约日期,支持模式快速切换。
模式定义
- 固定间隔:按设定的固定天数(如7天)重复生成日期(已实现,以下补充完整公式)
- 模式化间隔:按自定义的天数循环序列(如
2,2,1)生成日期 - 指定工作日:仅在选中的工作日(如周一、周五)生成日期
公式实现(假设单元格映射:指定单元=A1,固定间隔天数=B1,模式化序列=C1,指定工作日=D1,模式选择=E1)
1. 获取指定单元最后预约日期
基础公式,后续模式将复用该逻辑:
=MAXIFS('Unit Log'!B:B, 'Unit Log'!A:A, A1)
2. 分模式生成日期
固定间隔模式
用SEQUENCE快速生成等间隔日期:
=SEQUENCE(10, 1, MAXIFS('Unit Log'!B:B, 'Unit Log'!A:A, A1)+B1, B1)
- 逻辑:从最后日期+间隔天数开始,生成10行1列的序列,步长为设定的间隔天数
模式化间隔模式
利用SCAN累加循环的间隔序列:
=LET( last_date, MAXIFS('Unit Log'!B:B, 'Unit Log'!A:A, A1), pattern, SPLIT(C1, ","), pattern_len, COUNTA(pattern), ARRAYFORMULA( last_date + SCAN(0, SEQUENCE(10), LAMBDA(acc, i, acc + INDEX(pattern, MOD(i-1, pattern_len)+1))) ) )
- 逻辑:将输入的模式字符串拆分为数组,通过
MOD实现序列循环,SCAN累加间隔天数得到最终日期
指定工作日模式
通过WORKDAY.INTL结合自定义掩码生成目标工作日:
=LET( last_date, MAXIFS('Unit Log'!B:B, 'Unit Log'!A:A, A1), target_days, SPLIT(D1, ","), // 生成WORKDAY.INTL所需掩码:0代表可用工作日,1代表休息日 mask, JOIN("", ARRAYFORMULA(IF(ISNUMBER(XMATCH(SEQUENCE(7), target_days+1)), "0", "1"))), WORKDAY.INTL(last_date, SEQUENCE(10), mask) )
- 逻辑:将输入的工作日(周一=1,周五=5)转换为
WORKDAY.INTL识别的掩码,直接生成第1到第10个符合条件的工作日
3. 模式切换总公式
用SWITCH整合三种模式,实现一键切换:
=SWITCH( E1, "固定间隔", SEQUENCE(10, 1, MAXIFS('Unit Log'!B:B, 'Unit Log'!A:A, A1)+B1, B1), "模式化间隔", LET(last_date, MAXIFS('Unit Log'!B:B, 'Unit Log'!A:A, A1), pattern, SPLIT(C1, ","), pattern_len, COUNTA(pattern), ARRAYFORMULA(last_date + SCAN(0, SEQUENCE(10), LAMBDA(acc, i, acc + INDEX(pattern, MOD(i-1, pattern_len)+1))))), "指定工作日", LET(last_date, MAXIFS('Unit Log'!B:B, 'Unit Log'!A:A, A1), target_days, SPLIT(D1, ","), mask, JOIN("", ARRAYFORMULA(IF(ISNUMBER(XMATCH(SEQUENCE(7), target_days+1)), "0", "1"))), WORKDAY.INTL(last_date, SEQUENCE(10), mask)), "请选择模式" )
- 使用说明:在E1单元格选择对应模式名称(如"固定间隔"),公式将自动切换计算逻辑
内容的提问来源于stack exchange,提问作者Vic7152
相关产品推荐
相关产品推荐

