如何查找数字列表中任意范围的连续数字序列及实现公式
谷歌表格连续数字区间识别方案
操作前先确认:待识别的数字统一放在A列,A1可以留作表头,数字从A2开始向下填充。建议先把A列做升序排序、删除重复值,能避免大部分识别误差。
下面给两种实现方案,按需选择即可。
方案1:单公式一键输出所有区间
找个空白列的起始单元格(比如C2),直接粘贴下面的公式,不需要手动下拉,会自动按「起始数字 - 结束数字」的格式输出所有连续数字段:
=ARRAYFORMULA( LET( nums, SORT(UNIQUE(FILTER(A:A,A:A<>"",ISNUMBER(A:A)))), grp, SUMIF(ROW(nums),"<="&ROW(nums),IF(MMULT(N(ROW(nums)>=TRANSPOSE(ROW(nums))),N(nums-TRANSPOSE(nums)=ROW(nums)-TRANSPOSE(ROW(nums))))=1,0,1)), starts, MAP(UNIQUE(grp),LAMBDA(g,MIN(FILTER(nums,grp=g)))), ends, MAP(UNIQUE(grp),LAMBDA(g,MAX(FILTER(nums,grp=g)))), FILTER(starts&" - "&ends, starts<>"") ) )
公式逻辑:先把所有有效数字去重、按升序排列,给每一段连续的数字分配同一个分组标记,最后提取每个分组的最小值当区间起点、最大值当区间终点,直接拼接成要求的输出格式。
方案2:辅助列分步实现(适合新手排查问题)
如果单公式运行报错,或者想看清每一步的计算逻辑,可以用辅助列拆分操作:
- 第一步:排序去重。在B2单元格输入公式
=SORT(UNIQUE(FILTER(A:A,A:A<>"",ISNUMBER(A:A)))),会自动把A列所有有效数字去重后按升序排列在B列 - 第二步:标记区间起点。在C2单元格输入公式
=IF(ROW()=2,1,IF(B2-B1<>1,1,0)),下拉到B列有数据的最后一行,单元格值为1的位置,就是一段连续数字的起始位置 - 第三步:生成分组ID。在D2单元格输入公式
=SUM(C$2:C2),下拉到对应行,同一段连续数字的分组ID完全相同 - 第四步:拼接输出区间。找空白单元格输入下面的公式,就能得到所有格式化后的连续区间:
=ARRAYFORMULA( LET( g, UNIQUE(FILTER(D:D,D:D<>"")), MAP(g,LAMBDA(x, MIN(FILTER(B:B,D:D=x))&" - "&MAX(FILTER(B:B,D:D=x)))) ) )
注意事项
- 如果是16位以上的长数字编码(比如示例中的16位编号),先把存放数字的列格式设置为「纯文本」再导入数据,避免数字精度丢失导致连续判定出错
- 公式会自动过滤原始数据里的空白单元格、非数字内容,不需要手动提前清理
- 默认按相邻数字差值为1判定为连续,如果你的连续规则是其他步长(比如步长为2),把公式里判断差值的
<>1改成对应步长值即可
内容的提问来源于stack exchange,提问作者Isuru
相关产品推荐
相关产品推荐

