【问题标题】:Convert a row into fix number of multiple rows and columns Google Sheets将一行转换为固定数量的多行和多列 Google 表格
【发布时间】:2021-04-13 18:23:45
【问题描述】:

我有一排看起来像这样:

|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|

如何在 Google 表格中实现这一点?

Example Sheet

【问题讨论】:

    标签: google-sheets google-sheets-formula


    【解决方案1】:

    在你的情况下,我认为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}) 被用作正则表达式。
    • 这个公式的流程如下。
      1. 通过使用TEXTJOIN 忽略空单元格来连接所有单元格值。
      2. 使用REGEXREPLACE@ 放入6 列的连接文本值中。
      3. 使用SPLIT 将文本值与@ 分开。
      4. 使用TRANSPOSE 转置拆分后的值。
      5. 使用, 将每一行与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:88 的参数分别是范围和拆分的数字。这样,你的目标就可以实现了。

        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]);
          });
        

    【讨论】:

    • 有什么方法可以让第一列被排序?
    • @Lily 感谢您的回复。关于您的其他问题,我又添加了一个示例。你能确认一下吗?如果这不是您期望的方向,我深表歉意。
    【解决方案2】:

    或尝试:

    =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)
    

    【讨论】:

      猜你喜欢
      • 2022-07-24
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多