请求修复Google Sheets中车型年份序列中断复现后的失效公式
修复Google Sheets摩托车年份序列格式化问题
需求总结
手头有大量摩托车品牌/车型数据,现有公式在年份序列出现「连续-中断-再连续」的情况时无法正常工作,需要实现:
- 自动识别年份序列的中断点,拆分独立序列
- 连续年份合并为
起始-结束格式(如1974-1977) - 非连续年份/序列用逗号分隔,单个年份保留原数值
替代公式方案
单列已排序年份场景
假设年份数据在A2:A列,且已按升序排序(空值已过滤),使用以下公式即可生成格式化后的年份字符串:
=LET( sorted_years, SORT(FILTER(A2:A, A2:A<>"")), group_ids, SCAN(0, sorted_years, LAMBDA(prev, curr, IF(curr=prev+1, prev, curr))), grouped_ranges, BYROW(UNIQUE(group_ids), LAMBDA(gid, LET( group_years, FILTER(sorted_years, group_ids=gid), min_y, MIN(group_years), max_y, MAX(group_years), IF(min_y=max_y, min_y, min_y&"-"&max_y) ) )), TEXTJOIN(", ", TRUE, grouped_ranges) )
公式逻辑:
- 先过滤空值并排序年份,确保序列有序
- 用
SCAN给每个连续年份组标记唯一起始ID,中断点会生成新ID - 对每个分组,取首尾年份,相同则显示单个值,不同则生成范围字符串
- 最后用
TEXTJOIN把所有结果用逗号连接
按品牌/车型分组处理场景
如果需要按品牌(B列)、车型(C列)分别处理对应年份(A列),可以用BYROW结合上述逻辑,示例如下(假设D列是唯一品牌-车型组合,可通过UNIQUE(B2:B&"|"&C2:C)生成):
=BYROW(D2:D, LAMBDA(item, IF(item="", "", LET( brand, INDEX(SPLIT(item, "|"),1), model, INDEX(SPLIT(item, "|"),2), sorted_years, SORT(FILTER(A:A, B:B=brand, C:C=model, A:A<>"")), group_ids, SCAN(0, sorted_years, LAMBDA(prev, curr, IF(curr=prev+1, prev, curr))), grouped_ranges, BYROW(UNIQUE(group_ids), LAMBDA(gid, LET( group_years, FILTER(sorted_years, group_ids=gid), min_y, MIN(group_years), max_y, MAX(group_years), IF(min_y=max_y, min_y, min_y&"-"&max_y) ) )), TEXTJOIN(", ", TRUE, grouped_ranges) ) ) ))
旧版Google Sheets兼容方案
如果你的Google Sheets版本不支持LET/LAMBDA函数,使用以下兼容公式:
=TEXTJOIN(", ", TRUE, ARRAYFORMULA(IF( ISNA(MATCH(FILTER(A2:A, A2:A<>"")-1, FILTER(A2:A, A2:A<>""), 0)), IF(ISNA(MATCH(FILTER(A2:A, A2:A<>"")+1, FILTER(A2:A, A2:A<>""), 0)), FILTER(A2:A, A2:A<>""), FILTER(A2:A, A2:A<>"")&"-"&LOOKUP(1, 0/(MATCH(FILTER(A2:A, A2:A<>"")+ROW(INDIRECT("A1:A"&COUNTA(A2:A))), FILTER(A2:A, A2:A<>""), 0)=0), FILTER(A2:A, A2:A<>"")) ), "" )))
兼容版通过匹配前后年份标记连续序列的起始和结束,适配旧版本。
内容的提问来源于stack exchange,提问作者Marty
相关产品推荐
相关产品推荐

