Google Sheets中如何在日期区间内重复元素并匹配对应日期(无需辅助列F实现)
当然可以!我们完全能去掉辅助列F,把计数逻辑直接整合到日期生成的公式里,甚至还能把ID和日期的生成合并成更简洁的一键公式。下面给你两种实现方式:
方式1:保留原ID列(E列),修改日期列公式
原来的E列生成ID的公式可以继续使用:
=ARRAYFORMULA(TRIM(TRANSPOSE(SPLIT(QUERY(REPT(A2:A&"~", IF(A2:A="",,C2:C-B2:B+1)),,9^9), "~"))))
然后把G列的公式替换成下面这个,直接在公式内计算每个ID的出现次数,无需额外辅助列:
=ARRAYFORMULA(IFERROR(VLOOKUP(E2:E, A:B, 2, 0) + COUNTIFS(E2:E, E2:E, ROW(E2:E), "<="&ROW(E2:E)) - 1))
这里的COUNTIFS(E2:E, E2:E, ROW(E2:E), "<="&ROW(E2:E))会逐行统计当前ID从E2到当前行的出现次数,完美替代了原来辅助列F的功能。
方式2:用单个公式直接生成ID和日期两列
如果想更高效,甚至可以用一个公式直接输出最终的两列结果(比如放在E2单元格,自动生成ID和对应日期):
=ARRAYFORMULA( LET( ids, A2:A, starts, B2:B, ends, C2:C, // 计算每个ID需要展开的日期数量 lengths, IF(ids="",,ends-starts+1), // 生成展开后的ID列表 expanded_ids, TRIM(TRANSPOSE(SPLIT(QUERY(REPT(ids&"~", lengths),,9^9), "~"))), // 计算每个ID对应的日期偏移量 offsets, COUNTIFS(expanded_ids, expanded_ids, ROW(expanded_ids), "<="&ROW(expanded_ids)) - 1, // 匹配开始日期并加上偏移量生成对应日期 dates, VLOOKUP(expanded_ids, A:B, 2, 0) + offsets, // 组合成最终的两列结果 HSTACK(expanded_ids, dates) ) )
这个公式用LET函数把各步骤封装起来,逻辑更清晰:先定义输入数据,计算每个ID的展开长度,生成ID列表,计算日期偏移量,最后组合成你需要的两列输出。
最终效果验证
不管用哪种方式,都会得到你期望的输出:
ID Date
ST00 May 15 2022
TE01 May 23 2022
TE01 May 24 2022
TE01 May 25 2022
TO01 May 16 2022
TO01 May 17 2022
TO01 May 18 2022
TO01 May 19 2022
内容的提问来源于stack exchange,提问作者Mike Steelson
相关产品推荐
相关产品推荐

