在你的情况下,我认为this thread 可能可以使用。
示例公式1:
对于您问题中的目标,以下示例公式怎么样?
=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A1:1),"(([\w\s\S]+?,){6})","$1@"),"@")),",")))
- 在这种情况下,使用一行。所以
A1:1 被用作范围。但是当你有几行时,请修改范围。并且,该行被 6 列分割。所以(([\w\s\S]+?,){6}) 被用作正则表达式。
- 这个公式的流程如下。
- 通过使用
TEXTJOIN 忽略空单元格来连接所有单元格值。
- 使用
REGEXREPLACE 将@ 放入6 列的连接文本值中。
- 使用
SPLIT 将文本值与@ 分开。
- 使用
TRANSPOSE 转置拆分后的值。
- 使用
, 将每一行与SPLIT 分开。
结果:
示例公式2:
对于您的共享电子表格,以下示例公式怎么样?
=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A8:8),"(([\w\s\S]+?,){8})","$1@"),"@")),",")))
- 在这种情况下,使用一行。所以
A8:8 被用作范围。但是当你有几行时,请修改范围。并且,该行被 8 列分割。所以(([\w\s\S]+?,){8}) 被用作正则表达式。
结果:
注意:
-
在这种情况下,由于REGEXREPLACE(TEXTJOIN(",",TRUE,A8:8),"(([\w\s\S]+?,){8})","$1@"),当字符数超过50,000时,就会发生错误。在这种情况下,我想建议使用 Google Apps 脚本作为自定义函数。示例脚本如下。请将以下脚本复制并粘贴到电子表格的脚本编辑器中,并在使用共享电子表格时将=SAMPLE(A8:8, 8) 放入单元格中。在这种情况下,A8:8 和 8 的参数分别是范围和拆分的数字。这样,你的目标就可以实现了。
const SAMPLE = (values, split) => values.flatMap(r => {
const temp = [];
while (r.length > 0) temp.push(r.splice(0, split));
return temp
});
参考资料:
补充:
关于your comment您的附加问题如下,
有什么方法可以让第一列被排序?
下面的示例公式怎么样?
示例公式:
=SORT(ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A8:8),"(([\w\s\S]+?,){8})","$1@"),"@")),","))),1,TRUE)
-
在这种情况下,行按第一列升序排序。
-
当您使用 Google Apps Script 创建的自定义公式时,您还可以使用SORT,如下所示。
=SORT(SAMPLE(A8:8, 8),1,TRUE)
-
或者,您也可以使用以下脚本。使用时请把=SAMPLE2(A8:8, 8)放到一个单元格中。
const SAMPLE2 = (values, split) => values.flatMap(r => {
const temp = [];
while (r.length > 0) temp.push(r.splice(0, split));
return temp.sort((a, b) => a[0] - b[0]);
});