我有一个包含一列数据的工作表,其中条目是两个字符串之一,为简单起见,我们将说“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"))
时,它只填充单个单元格,差异计数整列。有没有办法使用数组公式,以便为填充的每一行将范围增加一行?
答案 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 脚本函数:
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
}
将其粘贴到脚本编辑器中,您可以像这样使用它:
演示:
您可以根据需要在脚本编辑器中更改函数的名称,只需记住在工作表中使用该名称调用它即可。
答案 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)))