Google sheets 将arrayformula与countif一起使用(如果仅限于某一行)

Google sheets 将arrayformula与countif一起使用(如果仅限于某一行),google-sheets,Google Sheets,我有一个带有数据列的工作表,其中条目是两个字符串中的一个,为了简单起见,我们将使用“a”和“B”。我想要另一列计算数据,它是到目前为止“A”的数量和“B”的数量之间的差值,所以只需要一个countif()-countif(),范围增加一行。我可以使用=countif(A$2:A2,“A”)-countif(A$2:A2,“B”)来实现这一点,但这意味着我必须不断填充该等式以覆盖任何新输入的数据,因此我认为数组公式将是不必这样做的最佳选择。但是,当我尝试使用=arrayformula(counti

我有一个带有数据列的工作表,其中条目是两个字符串中的一个,为了简单起见,我们将使用“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”))
时,它只使用计算整个列的差值填充单个单元格。是否有一种方法可以使用数组公式,使其填充的每一行的范围增加一行?

试试:

=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)))
=数组公式(
国家(A2:A,A2:A,A2:A,“A”,行(A2:A),”
这将为正确的范围提供一个动态字符串,从理论上讲,您应该能够使用该字符串进行包装,以插入
COUNTIF

但是
COUNTIF
仅在使用数组公式的某些情况下有效 不幸的是,AFAIK,仅当您使用COUNTIF时,如下所示:

=ARRAYFORMULA(COUNTIF(A1:A100,A1:A100))
它将作为数组公式工作。请注意参数中的两个范围是如何相同的

使用
MMULT
,可能有一种方法:

=ARRAYFORMULA(
    MMULT(
        (A2:A100 = TRANSPOSE(A2:A100)) * (ROW(A2:A100) >= TRANSPOSE(ROW(A2:A100))),
        SIGN(ROW(A2:A100))
    )
)
但我无法实现这一点,因为我无法100%确定如何以这种方式使用MMULT,但我在其他地方见过这种类型的解决方案

应用程序脚本解决方案 正如您所看到的,您希望通过工作表函数实现的功能很快变得非常复杂。如果您想使用更多的字母或不同的规则,则很难维护。应用程序脚本可以使这些功能变得更简单

下面是一个自定义应用程序脚本函数:

函数myFunction(){
//初始化
让file=SpreadsheetApp.getActive();
let sheet=file.getSheetByName(“Sheet1”);
var lastRow=sheet.getLastRow();
//这是As和Bs的范围
让range=sheet.getRange(2,1,parseInt(lastRow)-1,1)
让rows=range.getValues();
//创建对象以跟踪计数
让tracker={}
//这将是输出列
让newCol=[]
rows.forEach(row=>{
跟踪器[行[0]]+=1
//向输出中添加行
newCol.push([tracker.A-tracker.B])
})
返回纽科尔
}
将其粘贴到脚本编辑器中,您可以这样使用它:

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

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

工具书类

共享一份包含所需结果示例的工作表,并欢迎使用SO!虽然此代码可以回答问题,但提供有关如何和/或为什么解决问题的附加上下文将提高答案的长期价值。请阅读,脚本版本工作得很好,非常感谢!有趣的是,我玩了一个使用
INDIRECT
函数进行循环,虽然您显示的级联地址工作得很好,但只要我尝试将
INDIRECT
调用添加到数组公式中,它就只返回一个值。