Google sheets 将一行转换为固定数量的多行和多列

Google sheets 将一行转换为固定数量的多行和多列,google-sheets,google-sheets-formula,Google Sheets,Google Sheets Formula,我有一行是这样的: |Data A-1|Data A-2|Data A-3|Data A-4|Data A-5|Data A-6|Data B-1|Data B-2|Data B-3|Data B-4|Data B-5|Data B-6|Data C-1|Data C-2|Data C-3|Data C-4|Data C-5|Data C-6| |Data A-1|Data A-2|Data A-3|Data A-4|Data A-5|Data A-6| |Data B-1|Data B-2|

我有一行是这样的:

|Data A-1|Data A-2|Data A-3|Data A-4|Data A-5|Data A-6|Data B-1|Data B-2|Data B-3|Data B-4|Data B-5|Data B-6|Data C-1|Data C-2|Data C-3|Data C-4|Data C-5|Data C-6|
|Data A-1|Data A-2|Data A-3|Data A-4|Data A-5|Data A-6|
|Data B-1|Data B-2|Data B-3|Data B-4|Data B-5|Data B-6|
|Data C-1|Data C-2|Data C-3|Data C-4|Data C-5|Data C-6|
有5列与每个数据相关。我需要将一行中的所有数据转换为如下所示的固定行和列:

|Data A-1|Data A-2|Data A-3|Data A-4|Data A-5|Data A-6|Data B-1|Data B-2|Data B-3|Data B-4|Data B-5|Data B-6|Data C-1|Data C-2|Data C-3|Data C-4|Data C-5|Data C-6|
|Data A-1|Data A-2|Data A-3|Data A-4|Data A-5|Data A-6|
|Data B-1|Data B-2|Data B-3|Data B-4|Data B-5|Data B-6|
|Data C-1|Data C-2|Data C-3|Data C-4|Data C-5|Data C-6|
我如何在谷歌表单中实现这一点


在你的情况下,我认为这可能是可以使用的

示例公式1: 对于您问题中的目标,以下示例公式如何

=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A1:1),"(([\w\s\S]+?,){6})","$1@"),"@")),",")))
=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A8:8),"(([\w\s\S]+?,){8})","$1@"),"@")),",")))
在这种情况下,使用一行。因此,使用A1:1作为范围。但是当您有多行时,请修改范围。并且,该行被6列分割。所以[\w\s\s]+?,{6}被用作正则表达式。 该公式的流程如下所示。 通过使用TEXTJOIN忽略空单元格来连接所有单元格值。 使用REGEXREPLACE将@设置为6列的连接文本值。 用@using Split拆分文本值。 使用转置对拆分的值进行转置。 使用“拆分”将每行拆分为。 结果: 示例公式2: 对于共享的电子表格,下面的示例公式如何

=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A1:1),"(([\w\s\S]+?,){6})","$1@"),"@")),",")))
=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A8:8),"(([\w\s\S]+?,){8})","$1@"),"@")),",")))
在这种情况下,使用一行。因此,A8:8被用作范围。但是当您有多行时,请修改范围。并且,该行被8列分割。所以[\w\s\s]+?,{8}被用作正则表达式。 结果: 注: 在本例中,由于REGEXREPLACETEXTJOIN、TRUE、A8:8、[\w\s\s]+?、{8}、$1@,当字符数超过50000时,会发生错误。在这种情况下,我建议使用GoogleApps脚本作为自定义函数。示例脚本如下所示。请将以下脚本复制并粘贴到电子表格的脚本编辑器中,并在使用共享电子表格时将=SAMPLEA8: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
  });
参考资料: 补充: 关于你的补充问题,请回答如下:


有没有办法让第一列进行排序

下面的示例公式怎么样

=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A1:1),"(([\w\s\S]+?,){6})","$1@"),"@")),",")))
=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A8:8),"(([\w\s\S]+?,){8})","$1@"),"@")),",")))
样本配方: 在这种情况下,行按第一列升序排序

当您使用由Google Apps脚本创建的自定义公式时,您还可以按如下方式使用排序

  =SORT(SAMPLE(A8:8, 8),1,TRUE)
或者,您也可以使用以下脚本。使用时,请将=SAMPLE2A8: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]);
  });

在你的情况下,我认为这可能是可以使用的

示例公式1: 对于您问题中的目标,以下示例公式如何

=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A1:1),"(([\w\s\S]+?,){6})","$1@"),"@")),",")))
=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A8:8),"(([\w\s\S]+?,){8})","$1@"),"@")),",")))
在这种情况下,使用一行。因此,使用A1:1作为范围。但是当您有多行时,请修改范围。并且,该行被6列分割。所以[\w\s\s]+?,{6}被用作正则表达式。 该公式的流程如下所示。 通过使用TEXTJOIN忽略空单元格来连接所有单元格值。 使用REGEXREPLACE将@设置为6列的连接文本值。 用@using Split拆分文本值。 使用转置对拆分的值进行转置。 使用“拆分”将每行拆分为。 结果: 示例公式2: 对于共享的电子表格,下面的示例公式如何

=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A1:1),"(([\w\s\S]+?,){6})","$1@"),"@")),",")))
=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A8:8),"(([\w\s\S]+?,){8})","$1@"),"@")),",")))
在这种情况下,使用一行。因此,A8:8被用作范围。但是当您有多行时,请修改范围。并且,该行被8列分割。所以[\w\s\s]+?,{8}被用作正则表达式。 结果: 注: 在本例中,由于REGEXREPLACETEXTJOIN、TRUE、A8:8、[\w\s\s]+?、{8}、$1@,当字符数超过50000时,会发生错误。在这种情况下,我建议使用GoogleApps脚本作为自定义函数。示例脚本如下所示。请将以下脚本复制并粘贴到电子表格的脚本编辑器中,并在使用共享电子表格时将=SAMPLEA8: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
  });
参考资料: 补充: 关于你的补充问题,请回答如下:


有没有办法让第一列进行排序

下面的示例公式怎么样

=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A1:1),"(([\w\s\S]+?,){6})","$1@"),"@")),",")))
=ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN(",",TRUE,A8:8),"(([\w\s\S]+?,){8})","$1@"),"@")),",")))
样本配方: 在这种情况下,行按第一列升序排序

当您使用由Google Apps脚本创建的自定义公式时,您还可以按如下方式使用排序

  =SORT(SAMPLE(A8:8, 8),1,TRUE)
或者,您也可以使用以下脚本。使用时,请将=SAMPLE2A8: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]);
  });
或者尝试:

=QUERY(
 {FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-1, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-2, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-3, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-4, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-5, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-6, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-7, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-8, 8)=0))}, 
 "where Col1 is not null", 0)
或者尝试:

=QUERY(
 {FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-1, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-2, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-3, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-4, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-5, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-6, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-7, 8)=0)), 
  FLATTEN(FILTER(A8:15, MOD(COLUMN(A1:1)-8, 8)=0))}, 
 "where Col1 is not null", 0)

有没有办法让第一列进行排序?@Lily谢谢你的回复。关于你的补充问题,我又添加了一个示例。你能确认一下吗?如果这不是你所期望的方向,我很抱歉。有没有办法让第一列进行排序?@Lily谢谢你的回答。关于你的补充问题,我又添加了一个示例。你能确认一下吗?如果这不是你期望的方向,我道歉。