如何根据非连续数字列表创建范围显示?
How can I create a range display from a list of non consecutive numbers?
我制作了一个 bash 脚本来显示范围内的数字,我想知道是否可以在不编写脚本的情况下在表格中执行相同的操作。
我在一列(比方说 A)中得到了一个数字列表,例如:
001
002
004
012
013
014
...
我在单元格中有一个变量前缀(假设 B1="PREFIX")
有没有办法显示如下结果:
PREFIX001-PREFIX002
PREFIX004
PREFIX012-PREFIX014
...
预先感谢您的帮助!
可以做到。例如 A3:A
范围有数字,B1
将是前缀,B3:B
将有结果行。
公式仅在B3
中(因为它是一个数组公式):
=ARRAYFORMULA(
TRANSPOSE(SPLIT(
REGEXREPLACE(
REGEXREPLACE(
TEXTJOIN(
",",
True,
IF(
NOT(ISNUMBER(A3:A)),
"",
IF(
NOT(ISNUMBER({""; OFFSET(A3:A, 0, 0, ROWS(A3:A) - 1)}))
+ NOT(ISNUMBER({A4:A; ""}))
+ ( ISNUMBER({""; OFFSET(A3:A, 0, 0, ROWS(A3:A) - 1)})
* (A3:A <> {""; OFFSET(A3:A, 0, 0, ROWS(A3:A) - 1)} + 1))
+ ( ISNUMBER({A4:A; ""})
* (A3:A <> {A4:A; ""} - 1)),
TEXT(A3:A, "00#"),
""
)
)
& IF(
ISNUMBER({A4:A; ""})
* (A3:A = {A4:A; ""} - 1),
"-",
""
)
),
"(?:-,)+",
"-"
),
"\d+",
B1 & "[=10=]"
),
","
))
)
这是一个示例 sheet,其中包含对解决方案的逐步说明:link。
@kishkin
非常感谢您抽出宝贵时间来做这件事!我复印了一份来检查一下,你太好了!
我用多列创建了我的列,但方式很糟糕(我对表格很陌生,但到目前为止我很喜欢它):
对连续数字进行分组:
=IF(CNUM(V2)=CNUM(V1)+1,IF(REGEXMATCH(W1,"-"),LEFT(W1,CHERCHE("-",W1)-1)&"-"&V2,V1&"-"&V2),V2)
替换范围内的孤独:
=IF(LEFT(W3,2)=LEFT(W2,2),0,W2)
稍后拆分范围以计算范围值:
=SPLIT(X2,"-")
计算除 0 值以外的范围:
=IF(Z2-Y2+1<0,1,Z2-Y2+1)
删除所有 0,只保留范围:
=filter(X2:X,X2:X>0)
将总计与范围对齐(对项目的团体预订很有用)
=filter(AA2:AA,X2:X>0)
在那之后,它只是添加前缀和一些文本(对不起法语)。
正如我告诉你的那样,它不像你的解决方案那么性感^^
我制作了一个 bash 脚本来显示范围内的数字,我想知道是否可以在不编写脚本的情况下在表格中执行相同的操作。
我在一列(比方说 A)中得到了一个数字列表,例如:
001
002
004
012
013
014
...
我在单元格中有一个变量前缀(假设 B1="PREFIX")
有没有办法显示如下结果:
PREFIX001-PREFIX002
PREFIX004
PREFIX012-PREFIX014
...
预先感谢您的帮助!
可以做到。例如 A3:A
范围有数字,B1
将是前缀,B3:B
将有结果行。
公式仅在B3
中(因为它是一个数组公式):
=ARRAYFORMULA(
TRANSPOSE(SPLIT(
REGEXREPLACE(
REGEXREPLACE(
TEXTJOIN(
",",
True,
IF(
NOT(ISNUMBER(A3:A)),
"",
IF(
NOT(ISNUMBER({""; OFFSET(A3:A, 0, 0, ROWS(A3:A) - 1)}))
+ NOT(ISNUMBER({A4:A; ""}))
+ ( ISNUMBER({""; OFFSET(A3:A, 0, 0, ROWS(A3:A) - 1)})
* (A3:A <> {""; OFFSET(A3:A, 0, 0, ROWS(A3:A) - 1)} + 1))
+ ( ISNUMBER({A4:A; ""})
* (A3:A <> {A4:A; ""} - 1)),
TEXT(A3:A, "00#"),
""
)
)
& IF(
ISNUMBER({A4:A; ""})
* (A3:A = {A4:A; ""} - 1),
"-",
""
)
),
"(?:-,)+",
"-"
),
"\d+",
B1 & "[=10=]"
),
","
))
)
这是一个示例 sheet,其中包含对解决方案的逐步说明:link。
@kishkin
非常感谢您抽出宝贵时间来做这件事!我复印了一份来检查一下,你太好了! 我用多列创建了我的列,但方式很糟糕(我对表格很陌生,但到目前为止我很喜欢它):
对连续数字进行分组:
=IF(CNUM(V2)=CNUM(V1)+1,IF(REGEXMATCH(W1,"-"),LEFT(W1,CHERCHE("-",W1)-1)&"-"&V2,V1&"-"&V2),V2)
替换范围内的孤独:
=IF(LEFT(W3,2)=LEFT(W2,2),0,W2)
稍后拆分范围以计算范围值:
=SPLIT(X2,"-")
计算除 0 值以外的范围:
=IF(Z2-Y2+1<0,1,Z2-Y2+1)
删除所有 0,只保留范围:
=filter(X2:X,X2:X>0)
将总计与范围对齐(对项目的团体预订很有用)
=filter(AA2:AA,X2:X>0)
在那之后,它只是添加前缀和一些文本(对不起法语)。 正如我告诉你的那样,它不像你的解决方案那么性感^^