【问题标题】:arrayformula sum in Google spreadsheetGoogle 电子表格中的数组公式总和
【发布时间】:2014-02-15 12:36:26
【问题描述】:

你怎么arrayformula()一个sum()比如:

=sum(A1:H1)

我需要往下走 1000 行。

【问题讨论】:

  • 这是一个非常简单的问题,不需要复杂化。让我们不要把这复杂化。只需将括号放在范围内的每个数组中。 =arrayformula(Sum((A1:A1000):(H1:H1000))
  • =arrayformula( Sum( (A1:A1000):(H1:H1000) ) 虽然简单,但截至今天在工作表中不起作用。似乎对整个范围 A1:H1000 求和。
  • 一般来说,ArrayFormula 在围绕本身接受 Range 参数的函数组合时不会计算正确的结果。 range 参数被带有 ArrayFormula 的函数“抓取”(该函数用作 ArrayFormula 的参数),并使用它进行计算,返回其结果(通常是标量)。 ArrayFormula 永远不会看到输入范围,也无法根据需要替换它。这就是它无法与 Or()、And() 等一起使用的原因。
  • 为实验创建了示例 Google 表格 docs.google.com/spreadsheets/d/…

标签: google-sheets


【解决方案1】:

另一种选择:

=ArrayFormula(SUMIF(IF(COLUMN(A1:H1),ROW(A1:A1000)),ROW(A1:A1000),A1:H1000))

【讨论】:

  • 你太棒了。工作。我现在正在使用新的 Google 电子表格。如果我将公式更改为更通用的=ArrayFormula(SUMIF(IF(COLUMN(A1:H),ROW(A1:A)),ROW(A1:A),A1:H)),右上方的加载栏会继续运行并且永远不会加载。这是为什么?即使是新的 Google 电子表格也需要进行太多计算?
  • 这是我之前升级的问题。 IMO,与旧表格相比,引用大型数组的数组公式在新表格中的性能似乎明显较差。像这样引用整列时,尽量确保空行尽可能少。
  • 知道他们何时可以让importrange() 处理新的 Google 电子表格吗?
  • 我不明白您为什么要使用column() 的范围。它不会一直是 1 吗?
  • 您能解释一下为什么会这样吗?为什么你不能只做=ArrayFormula(Sum(A1:H1))
【解决方案2】:

在 Jacob Jan Tuinstra 和 AdamL 这两个有效答案中,Jacob 给出了更好的答案。 Jacob's 跑得更快,更容易记住。

但是,既然充分利用 Google 表格要容易得多,为什么还要使用疯狂的公式呢?

=ARRAYFORMULA(A2:A+B2:B+C2:C+D2:D+E2:E+F2:F+G2:G+H2:H) 

在上述公式中,您可以使用命名范围而不是引用范围。

=ARRAYFORMULA(range1+range2+range3+range4+range5+range6+range7+range8) 

此外,您可以对跨工作表的行求和,而不是被困在同一个工作表中的列上。

要修复公式以阻止为空白行返回零,请使用:

=arrayFormula(if(isNumber(A2:A),A2:A+B2:B+C2:C+D2:D+E2:E+F2:F,G2:G,H2:H))

见:See Ahab's answer on Google Forums

一个很酷的累加公式,见Otávio Alves Ribeiro's answer on Google Forums

【讨论】:

  • 同时,这个答案是完全有用的,比其他答案更有用。当一个人只需要这样做时,为什么还要费心去记住或查找一个复杂的公式模式:=ARRAYFORMULA(IF(test for data in rows, A2:A+B2:B))
  • 哦,好吧。它适用于任何以“时间就是金钱”为座右铭的人。
  • 是的,但技术债务也是(负)钱。
  • 由于您的解决方案适用于 8 列,因此当有 100 列时它就没有那么有用了。
【解决方案3】:

这就是你要找的:

=MMULT(A1:H1000,TRANSPOSE(ARRAYFORMULA(COLUMN(A1:H1000)^0)))

在我给出的 Web 应用程序上查看此答案:https://webapps.stackexchange.com/a/53419/29140

注意:在新的 Google 电子表格上尝试过,但没有成功。

【讨论】:

  • 在新表格中,如果数组中有空白单元格,MMULT 将失败。解决方法是将第一个参数包装在 VALUE() 中。
  • 一般建议可能不重复范围而只写MMULT(A1:H,{1;1;1;1;1;1;1;1})
【解决方案4】:

将 A-H 水平求和并向下运行 523 行:

=ARRAYFORMULA(iferror(mmult(A1:H523;TRANSPOSE(column(A1:H1))^0)))

【讨论】:

    【解决方案5】:

    如果我看一下这个公式,我真的认为以下可能更简单。将此添加到工具 > 脚本编辑器:

    function row_sum(range_to_sum_per_row) {
      var result_column = [];
      for (var r = 0; r < range_to_sum_per_row.length; r++) {
        var row_sum = parseFloat(0);
        for (var c = 0; c < range_to_sum_per_row[r].length; c++) {
            row_sum += range_to_sum_per_row[r][c] || 0;
        }
        result_column.push([row_sum]);
      }
      return result_column;
    }
    

    出于性能原因,这样使用,其中 C:H 是您要总结的范围,A:A 是不包含空字符串的列:

    =row_sum(filter(C2:H, len(A2:A)>0))
    

    【讨论】:

      【解决方案6】:

      如果您希望能够为 A1:H 中的所有值添加行并对最后一行求和,您可以使用:

       =ArrayFormula(SUMIF(IF(COLUMN(A1:H1),ROW(A1:A)),ROW(A1:A),A1:H))
      

      或者,如果您希望能够在电子表格中添加行和列并将两者的最后一个相加,也可以这样做。将以下代码粘贴到任何单元格中,它将为粘贴单元格下方和右侧每行中的所有单元格创建一列总和值:

      =arrayformula(SUMIF(IF(COLUMN(indirect(concatenate(REGEXREPLACE(address(row(),column()+1),"[^[:alpha:]]", ""),VALUE(REGEXREPLACE(address(row(),column()),"[^[:digit:]]", "")),":",VALUE(REGEXREPLACE(address(row(),column()),"[^[:digit:]]", ""))))),ROW(indirect(concatenate(REGEXREPLACE(address(row(),column()+1),"[^[:alpha:]]", ""),VALUE(REGEXREPLACE(address(row(),column()),"[^[:digit:]]", "")),":",REGEXREPLACE(address(row(),column()+1),"[^[:alpha:]]", ""))))),ROW(indirect(concatenate(REGEXREPLACE(address(row(),column()+1),"[^[:alpha:]]", ""),VALUE(REGEXREPLACE(address(row(),column()),"[^[:digit:]]", "")),":",REGEXREPLACE(address(row(),column()+1),"[^[:alpha:]]", "")))),indirect(concatenate(concatenate(REGEXREPLACE(address(row(),column()+1),"[^[:alpha:]]", ""),VALUE(REGEXREPLACE(address(row(),column()),"[^[:digit:]]", "")),":"),address(rows($A:$A),columns($1:$1))))))
      

      【讨论】:

        【解决方案7】:

        使用查询

        =INDEX(TRANSPOSE(
          QUERY(TRANSPOSE(FILTER(A2:H,A2:A<>"")),
          "select sum(Col"&JOIN("), sum(Col",SEQUENCE(COUNTA(A2:A)))&")",0)
        ),,2)
        

        注释:

        • 动态生成查询字符串

        【讨论】:

          【解决方案8】:

          使用DSUM

          =ARRAYFORMULA(DSUM(
            TRANSPOSE(FILTER({A2:A,A2:H},A2:A<>"")),
            SEQUENCE(COUNTA(A2:A)),{IFERROR(1/0);IFERROR(1/0)}))
          

          注释:

          • {IFERROR(1/0);IFERROR(1/0)} 是为DSUM 设置零标准。

          • {A2:A,A2:H} -- 为 DSUM 添加假列以模仿标题列。

          • 可以将公式转换为DMAXDAVERAGE

          【讨论】:

            【解决方案9】:

            答案类似于@adamL 建议,但删除了内部if

            =ArrayFormula(
                 sumif(ROW(A1:A10)*COLUMN(A1:H1)^0,ROW(A1:A10),A1:A10)
             )
            

            在这种情况下,我使用ROW(A1:A10) * COLUMN(A1:H1)^0 来生成行号矩阵。要了解它的工作原理,您可以在 Google 表格中仅测试这一部分:

            = ArrayFormula(ROW(A1:A10) * COLUMN(A1:H1)^0)
            

            所以,用你的行矩阵,sumif可以对每一行进行运算,是行有匹配的行号,就会被求和。

            【讨论】:

              【解决方案10】:

              我们不要让这件事复杂化。 只需将括号放在范围内的每个数组中即可。

              =arrayformula( Sum( (A1:A):(H1:H) )
              

              这不仅跨越了 1000 行,而且跨越了无穷大。

              如果你真的想限制,那就去吧

              =arrayformula( Sum( (A1:A1000):(H1:H1000) )
              

              【讨论】:

              • 如果其中一列具有非数字值而不是返回错误,则返回一个数字。你知道为什么吗?
              • 这似乎不适用于谷歌表格。也许过去一年发生了一些变化,但现在拥有 =SUM(($B1:$B10):($D1:$D10)) 是完全有效的,这可能破坏了 ARRAYFORUMLA 包装器。
              • Google 表格在数组公式中将 (A1:A):(H1:H) 评估为 (A1:H) :(
              猜你喜欢
              • 2016-05-29
              • 1970-01-01
              • 2020-03-22
              • 1970-01-01
              • 2020-08-10
              • 1970-01-01
              • 2016-03-25
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多