Google 表 ARRAYFORMULA + SUMIFS 处理日期时
Google sheets ARRAYFORMULA + SUMIFS when working with dates
我正在尝试弄清楚在处理日期时如何使用 arrayformula + SUMIFS
这是一个演示 sheet
https://docs.google.com/spreadsheets/d/1ttoA9EfMdYJHolcRVrLfpDA2GqYtt19gJruDogzGSf8/edit?usp=sharing
我需要什么:
在O栏我需要当付款日期<今天()时客户逾期的余额
我需要一个数组公式,因为它是一个非常大的数据集
尝试使用 arrayformula + sumifs 不扩展
尝试使用 arrayformula + sumif 并使用 & 符号不起作用可能是因为我只需要 when is < today ()
={"overdue";ARRAYFORMULA(IF(LEN(A2:A), (SUMIF(R:R&A:A,Q:Q&"<"&TODAY(),V:V))-M2:M ,))}
我正在寻找替代方法,我们将不胜感激
谢谢!
我已将新的 sheet(“Erik Help”)添加到您的样本传播sheet。以下数组公式在O2中:
=ArrayFormula({"Overdue"; IF(A2:A="",, MMULT( TRANSPOSE(U2:U) * (TRANSPOSE(Q2:Q)=A2:A) * (TRANSPOSE(P2:P)<=TODAY() ),SEQUENCE( ROWS(U2:U), 1, 1, 0)) - M2:M)})
大括号{}之间形成了一个虚拟数组。
先设置表头(可在公式内随意更改)
如果 A2:A 中的任何单元格为空,则 O2:O 中的相应单元格也将为空。
MMULT
执行 M
atric MULT
iplication。在这里,我用它来将 U2:U 中金额的 TRANSPOSE
d 版本乘以两个 TRANSPOSE
d 条件语句(每个条件语句的结果都是 TRUE 的 1 或 0如果为假)。如果两个语句都为 TRUE,则 U2:U 中的值将保留(即 X * 1 * 1);但如果任一语句为 FALSE,则 U2:U 行的结果将为 0(例如,X * 0 * 1 -or- X * 1 * 0 -或- X * 0 * 0).
条件语句检查 1.) 查看客户名称是否与当前行相同;和 2.) 查看日期是否小于或等于 TODAY().
重要的是这三个读数是 TRANSPOSE
d,以便形成二维虚拟网格。
经过上述处理后的剩余值将在与每个实际行平行的虚拟水平行中。这些构成了第一个矩阵。
第二个矩阵由 SEQUENCE
组成,只是简单地将数字 1 与 sheet 中 A2:A 的行数一样高的堆栈。
因为任何乘以 1 都是原始数字,所以返回第一个矩阵的所有 0 或值结果然后添加(这是 MMULT
的功能) .
由此可以减去M2:M中的值。
我认为你只需要从总数中减去按字母顺序排列较早的客户和按字母顺序排列较晚的 client/dates 客户,仍然使用 sumif:
=ArrayFormula(if(A2:A="",,sum(V2:V)-sumif(R2:R,"<"&A2:A,V2:V)-sumif(R2:R&Q2:Q,">"&A2:A&today(),V2:V)-M2:M))
I need an arrayformula since is a very big data set
当数据集超过3162行时,mmult()
函数会报错。为避免这种情况,请使用 vlookup()
和 query()
,如下所示:
=arrayformula(
{
"Overdue";
iferror(
vlookup(
A2:A,
query(
Q2:V,
"select R, sum(V)
where Q <= date" & text(today(), " 'yyyy-MM-dd' ") & "
group by R",
0
),
2, false
)
- M2:M
)
}
)
参见 doubleunary sheet。
我正在尝试弄清楚在处理日期时如何使用 arrayformula + SUMIFS
这是一个演示 sheet
https://docs.google.com/spreadsheets/d/1ttoA9EfMdYJHolcRVrLfpDA2GqYtt19gJruDogzGSf8/edit?usp=sharing
我需要什么:
在O栏我需要当付款日期<今天()时客户逾期的余额 我需要一个数组公式,因为它是一个非常大的数据集
尝试使用 arrayformula + sumifs 不扩展
尝试使用 arrayformula + sumif 并使用 & 符号不起作用可能是因为我只需要 when is < today ()
={"overdue";ARRAYFORMULA(IF(LEN(A2:A), (SUMIF(R:R&A:A,Q:Q&"<"&TODAY(),V:V))-M2:M ,))}
我正在寻找替代方法,我们将不胜感激
谢谢!
我已将新的 sheet(“Erik Help”)添加到您的样本传播sheet。以下数组公式在O2中:
=ArrayFormula({"Overdue"; IF(A2:A="",, MMULT( TRANSPOSE(U2:U) * (TRANSPOSE(Q2:Q)=A2:A) * (TRANSPOSE(P2:P)<=TODAY() ),SEQUENCE( ROWS(U2:U), 1, 1, 0)) - M2:M)})
大括号{}之间形成了一个虚拟数组。
先设置表头(可在公式内随意更改)
如果 A2:A 中的任何单元格为空,则 O2:O 中的相应单元格也将为空。
MMULT
执行 M
atric MULT
iplication。在这里,我用它来将 U2:U 中金额的 TRANSPOSE
d 版本乘以两个 TRANSPOSE
d 条件语句(每个条件语句的结果都是 TRUE 的 1 或 0如果为假)。如果两个语句都为 TRUE,则 U2:U 中的值将保留(即 X * 1 * 1);但如果任一语句为 FALSE,则 U2:U 行的结果将为 0(例如,X * 0 * 1 -or- X * 1 * 0 -或- X * 0 * 0).
条件语句检查 1.) 查看客户名称是否与当前行相同;和 2.) 查看日期是否小于或等于 TODAY().
重要的是这三个读数是 TRANSPOSE
d,以便形成二维虚拟网格。
经过上述处理后的剩余值将在与每个实际行平行的虚拟水平行中。这些构成了第一个矩阵。
第二个矩阵由 SEQUENCE
组成,只是简单地将数字 1 与 sheet 中 A2:A 的行数一样高的堆栈。
因为任何乘以 1 都是原始数字,所以返回第一个矩阵的所有 0 或值结果然后添加(这是 MMULT
的功能) .
由此可以减去M2:M中的值。
我认为你只需要从总数中减去按字母顺序排列较早的客户和按字母顺序排列较晚的 client/dates 客户,仍然使用 sumif:
=ArrayFormula(if(A2:A="",,sum(V2:V)-sumif(R2:R,"<"&A2:A,V2:V)-sumif(R2:R&Q2:Q,">"&A2:A&today(),V2:V)-M2:M))
I need an arrayformula since is a very big data set
当数据集超过3162行时,mmult()
函数会报错。为避免这种情况,请使用 vlookup()
和 query()
,如下所示:
=arrayformula(
{
"Overdue";
iferror(
vlookup(
A2:A,
query(
Q2:V,
"select R, sum(V)
where Q <= date" & text(today(), " 'yyyy-MM-dd' ") & "
group by R",
0
),
2, false
)
- M2:M
)
}
)
参见 doubleunary sheet。