【问题标题】:ARRAYFORMULA() does not work with SPLIT()ARRAYFORMULA() 不适用于 SPLIT()
【发布时间】:2014-11-26 01:01:34
【问题描述】:

当我使用 =arrayformula(split(input!G2:G, ",")) 时,为什么拆分公式没有扩展到整个列?

我只得到输入!G2 单元格的结果,而不是 G 列中的其余部分。像=arrayformula(find(",", input!G2:G)) 这样的其他公式似乎可以正常工作并且可以毫无问题地扩展。

【问题讨论】:

    标签: split google-sheets array-formulas


    【解决方案1】:

    现在,应用于垂直数组的 SPLIT 确实有效。 (2017 年 1 月 4 日)

    =ArrayFormula(SPLIT(input!G2:G,","))

    或用于错误屏蔽

    =ArrayFormula(IFERROR(SPLIT(input!G2:G,",")))

    注意:结果数组的宽度与 SPLITted 元素的最大数量一样宽。


    (答案的其余部分不再适用,而是出于……历史目的而保留?)

    这将被视为一个非常糟糕的答案,但是:事实并非如此。

    我怀疑这可能是因为它可能会产生一个锯齿状数组(每行中的元素数量不同),这可能被认为是有问题的。但是,以前版本的表格中曾经“工作”的“数组 SPLIT”(尽管存在一个错误,即它不能在数组的第一个元素上正常工作)。

    SPLIT 并不是唯一一个不能在数组上迭代的函数(例如 INDIRECT、INDEX、SUMIFS)。


    一种解决方法(2017 年 1 月 4 日编辑):

    =ArrayFormula(REGEXREPLACE(input!G2:G&REPT(",",6),REPT("([^,]*),",6)&",*","$"&COLUMN(OFFSET(A1,,,1,6))))

    OFFSET(A1,,,1,6) 和 REPT 函数中的 6 决定了 SPLIT 中的最大元素数。您可以注入一个表达式来计算数据列中的最大元素数,但性能会受到更大的影响。

    另外,这里需要注意的是,它只支持按单个字符(在本例中为逗号)分割。

    或者,您可以查看 Google Apps 脚本自定义函数。


    以前的解决方法不再有效,因为 REGEXEXTRACT 似乎不再支持第二个参数的数组 - 无论如何它在 2017 年 1 月的情况。

    =ArrayFormula(IFERROR(REGEXEXTRACT(","&input!G2:G,"^"&REPT(",+[^,]+",COLUMN(OFFSET(A1,,,1,6))-1)&",+([^,]+)")))

    【讨论】:

    • 感谢您的回答。有解决方法吗?如果有,你把它放在这里,我会认为它是一个非常好的答案! :)
    • 我同意@pnuts - 因此接受答案。
    • 我尝试了您的解决方法并遇到了一个问题,如果您愿意帮助我,我会发布一个新问题,非常欢迎您! stackoverflow.com/questions/30200697/…
    • +myroslav 谢谢 - Google 表格似乎改变了 REGEXEXTRACT 的行为。发布了新的解决方法。
    • 更重要的是,我注意到数组 SPLIT 现在确实有效。
    【解决方案2】:

    你可以使用这个脚本:

    function better_split(col, separator) {
      var new_col = [];
      for (var r = 0; r < col.length; r++) {
        if (col[r]) {
          new_col.push(col[r][0].split(separator));
        }
      }
      return new_col;
    }
    

    像这样使用它(出于性能原因):

    =better_split(filter(A2:A, len(A2:A)>0), "/")
    

    【讨论】:

    • 鉴于问题的原始措辞,我仍然使用@AdamL 答案。但这是一个很好的选择!您不考虑创建一个问题然后自行回答吗?我相信很多人会发现它很有用。我至少赞成。
    • @jakub 可以自我回答问题吗?无论如何,我会留意这个问题,如果我找到一个,然后参考这个线程。顺便说一句,感谢您的投票。
    【解决方案3】:

    另一种解决方法是首先使用 ARRAYFORMULA 加入带有逗号的 G2:G 列。 然后你可以拆分它。 最后,您可以选择将其转回一列(否则它将作为一行输出)。

    =TRANSPOSE(SPLIT(ARRAYFORMULA(JOIN(",",FILTER(G2:G,NOT(ISBLANK(G2:G))))),","))
    

    【讨论】:

      【解决方案4】:

      不需要数组公式,因为数据 > 将文本拆分为列...无需任何函数或公式即可工作。

      【讨论】:

        【解决方案5】:

        它可以工作,但你必须填充和约束以使其成为方形结果。

        获取这些数据:

                   ColA             COLB
            Row1   Data             ={"Head1","Head2","Head3","Head4","Head5","Head6","Head7";ARRAY_CONSTRAIN(ARRAYFORMULA(SPLIT(A$2:A&" , , , , , , ",",",FALSE,FALSE)),COUNTA(A2:A),7)}
            Row2   1,2,3,4,5,6,7,a
            Row3   1,2,3,5
        

        给你这个:

                   ColA                   COLB
            Row1   Data             Head1 Head2 Head3 Head4 Head5 Head6 Head7 
            Row2   1,2,3,4,5,6,7,a  1     2     3     4     5     6     7
            Row3   1,2,3,5          1     2     3     4     5
        

        这是公式:

        ={"Head1","Head2","Head3","Head4","Head5","Head6","Head7";ARRAY_CONSTRAIN(ARRAYFORMULA(SPLIT(A$2:A&" , , , , , , ",",",FALSE,FALSE)),COUNTA(A2:A),10)}
        

        首先,我们使用 ARRAY_CONSTRAIN 将结果限制为可接受的最大结果。您可以计算最大值或对其进行硬编码。我使用了 7 列和尽可能多的行。 ARRAYFORMULA 用来运行它。 SPLIT 文本值用空值填充,以确保它超过约束值。这允许在 ColA 中容纳不同长度的值。 FALSE 我认为可以避免它们被修剪和扰乱数组。可能没必要,我没测试。

        【讨论】:

          猜你喜欢
          • 2020-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-09
          • 1970-01-01
          相关资源
          最近更新 更多