将 arrayformula 与 countif 结合使用,最多只能到某一行

时间:2021-02-01 22:11:04

标签: google-sheets

我有一个包含一列数据的工作表,其中条目是两个字符串之一,为简单起见,我们将说“A”和“B”。我想要另一列计算数据,它是“A”的数量和“B”的数量之间的差异,直到那个点,所以只是一个 countif()-countif() ,范围增加一行。我可以使用 =countif(A$2:A2, "A") - countif(A$2:A2, "B") 来做到这一点,但这意味着我必须不断填充该方程以覆盖任何新输入的数据,因此我认为数组公式将是不必这样做的最佳选择。但是,当我尝试使用 =arrayformula(countif(A$2:A, "A") - countif(A$2:A, "B")) 时,它只填充单个单元格,差异计数整列。有没有办法使用数组公式,以便为填充的每一行将范围增加一行?

2 个答案:

答案 0 :(得分:1)

=ARRAYFORMULA("A2:A"&ROW(A2:A))

这将为正确的范围提供一个动态字符串,理论上,您应该能够用 INDIRECT 包裹,以插入 COUNTIF

但是 COUNTIF 仅在使用数组公式的某些情况下有效

不幸的是,AFAIK,仅当您像这样使用 COUNTIF 时:

=ARRAYFORMULA(COUNTIF(A1:A100,A1:A100))

它是否可以用作数组公式。请注意参数中的两个范围是如何相同的。

MMULT

MMULT 可能有这样的方法:

=ARRAYFORMULA(
    MMULT(
        (A2:A100 = TRANSPOSE(A2:A100)) * (ROW(A2:A100) >= TRANSPOSE(ROW(A2:A100))),
        SIGN(ROW(A2:A100))
    )
)

但我无法让它工作,因为我不是 100% 确定如何以这种方式使用 MMULT,但我在其他地方看到过这种类型的解决方案。

Apps 脚本解决方法

如您所见,您想通过工作表函数实现的目标很快变得非常复杂。如果你想使用更多的字母或不同的规则,维护起来会很困难。 Apps 脚本可以让这些事情变得更简单。

这里是一个自定义的 Apps 脚本函数:

function myFunction() {
  // Initializing
  let file = SpreadsheetApp.getActive();
  let sheet = file.getSheetByName("Sheet1");
  var lastRow = sheet.getLastRow();

  // This is the range of the As and Bs
  let range = sheet.getRange(2,1, parseInt(lastRow) - 1,1)
  let rows = range.getValues();

  // Creating an object to keep track of the count
  let tracker = {}

  // This will be the output column
  let newCol = []

  rows.forEach(row => {
    tracker[row[0]] += 1
    // Adding a row to the output
    newCol.push([tracker.A - tracker.B]) 
  })

  return newCol
}

将其粘贴到脚本编辑器中,您可以像这样使用它:

演示:

enter image description here

您可以根据需要在脚本编辑器中更改函数的名称,只需记住在工作表中使用该名称调用它即可。

参考资料

答案 1 :(得分:0)

试试:

=ARRAYFORMULA(
 COUNTIFS(A2:A, A2:A, A2:A, "A", ROW(A2:A), "<="&ROW(A2:A))- 
 COUNTIFS(A2:A, A2:A, A2:A, "B", ROW(A2:A), "<="&ROW(A2:A)))