Google 工作表中列数组的嵌套在 COUNTIF 中的 QUERY 的替代方法
Alternative to QUERY nested in COUNTIF for column array in Google Sheets
目前我有一个运行良好的公式,但是,它使我的工作表变得非常慢,因为我使用了多个 COUNTIF
查询。
=IF($O="YT",COUNTIFS(
QUERY(Contacts!$Q:$EZ, "select V,AC,AJ,AQ,AX,BE,BL,BS, BZ ,CG,CN,CU,DB,DI,DP,DW,ED,EK,ER,EY", 0), $T22,
QUERY(Contacts!$Q:$EZ, "select U,AB,AI,AP,AW,BD,BK,BR,`BY`,CF,CM,CT,DA,DH,DO,DV,EC,EJ,EQ,EX", 0), U),
COUNTIFS(
QUERY(Contacts!$Q:$EZ, "select T,AA,AH,AO,AV,BC,BJ,BQ, BX ,CE,CL,CS,CZ,DG,DN,DU,EB,EI,EP,EW", 0), $O,
QUERY(Contacts!$Q:$EZ, "select V,AC,AJ,AQ,AX,BE,BL,BS, BZ ,CG,CN,CU,DB,DI,DP,DW,ED,EK,ER,EY", 0), $T22,
QUERY(Contacts!$Q:$EZ, "select U,AB,AI,AP,AW,BD,BK,BR,`BY`,CF,CM,CT,DA,DH,DO,DV,EC,EJ,EQ,EX", 0), U))
基本上这是从仪表板的下拉列表中搜索月份,然后通过过滤呼叫类别、销售人员和月份来计算呼叫次数。我有 2 COUNTIF
的原因是第一个基于全年计算因此 YT = "Year Total"
调用来自列数组,因此查询的是不同的列。
任何反馈将不胜感激。
我对功能的掌握比对应用脚本的掌握要好,但总是乐于学习,所以如果有应用脚本的解决方案,我将不胜感激。
期待向您学习。
您能否分享您的数据或至少 post 一张屏幕截图来展示它们的外观?这总是有助于理解你想做什么。
无论如何,我要做的第一件事就是将您的 QUERY()
调用替换为直接 {}
寻址,仅此一项就可以加快处理速度。看看这是否有帮助:
=IF($O="YT",
COUNTIFS(
{V,AC,AJ,AQ,AX,BE,BL,BS,BZ,CG,CN,CU,DB,DI,DP,DW,ED,EK,ER,EY}, $T22,
{U,AB,AI,AP,AW,BD,BK,BR,BY,CF,CM,CT,DA,DH,DO,DV,EC,EJ,EQ,EX}, U),
COUNTIFS(
{T,AA,AH,AO,AV,BC,BJ,BQ,BX,CE,CL,CS,CZ,DG,DN,DU,EB,EI,EP,EW}, $O,
{V,AC,AJ,AQ,AX,BE,BL,BS,BZ,CG,CN,CU,DB,DI,DP,DW,ED,EK,ER,EY}, $T22,
{U,AB,AI,AP,AW,BD,BK,BR,BY,CF,CM,CT,DA,DH,DO,DV,EC,EJ,EQ,EX}, U))
另一种可能的简单加速方法是删除您有数据的最后一行以下的所有行。
您需要删除所有查询公式(所有那些看起来像您问题中的示例的公式)并用此构建替换它们:
=IF($G="Year Total",
COUNTA(FILTER(Contacts!V3:V, Contacts!V3:V=$B12, Contacts!U3:U=E))+
COUNTA(FILTER(Contacts!AC3:AC,Contacts!AC3:AC=$B12,Contacts!AB3:AB=E))+
etc...
,COUNTA(FILTER(Contacts!T3:T, Contacts!T3:T=$G, Contacts!V3:V=$B12, Contacts!U3:U=E))+
COUNTA(FILTER(Contacts!AA3:AA,Contacts!AA3:AA=$G,Contacts!AC3:AC=$B12,Contacts!AB3:AB=E))+
etc...
)
这会给你 ~80% 的提升
目前我有一个运行良好的公式,但是,它使我的工作表变得非常慢,因为我使用了多个 COUNTIF
查询。
=IF($O="YT",COUNTIFS(
QUERY(Contacts!$Q:$EZ, "select V,AC,AJ,AQ,AX,BE,BL,BS, BZ ,CG,CN,CU,DB,DI,DP,DW,ED,EK,ER,EY", 0), $T22,
QUERY(Contacts!$Q:$EZ, "select U,AB,AI,AP,AW,BD,BK,BR,`BY`,CF,CM,CT,DA,DH,DO,DV,EC,EJ,EQ,EX", 0), U),
COUNTIFS(
QUERY(Contacts!$Q:$EZ, "select T,AA,AH,AO,AV,BC,BJ,BQ, BX ,CE,CL,CS,CZ,DG,DN,DU,EB,EI,EP,EW", 0), $O,
QUERY(Contacts!$Q:$EZ, "select V,AC,AJ,AQ,AX,BE,BL,BS, BZ ,CG,CN,CU,DB,DI,DP,DW,ED,EK,ER,EY", 0), $T22,
QUERY(Contacts!$Q:$EZ, "select U,AB,AI,AP,AW,BD,BK,BR,`BY`,CF,CM,CT,DA,DH,DO,DV,EC,EJ,EQ,EX", 0), U))
基本上这是从仪表板的下拉列表中搜索月份,然后通过过滤呼叫类别、销售人员和月份来计算呼叫次数。我有 2 COUNTIF
的原因是第一个基于全年计算因此 YT = "Year Total"
调用来自列数组,因此查询的是不同的列。 任何反馈将不胜感激。
我对功能的掌握比对应用脚本的掌握要好,但总是乐于学习,所以如果有应用脚本的解决方案,我将不胜感激。
期待向您学习。
您能否分享您的数据或至少 post 一张屏幕截图来展示它们的外观?这总是有助于理解你想做什么。
无论如何,我要做的第一件事就是将您的 QUERY()
调用替换为直接 {}
寻址,仅此一项就可以加快处理速度。看看这是否有帮助:
=IF($O="YT",
COUNTIFS(
{V,AC,AJ,AQ,AX,BE,BL,BS,BZ,CG,CN,CU,DB,DI,DP,DW,ED,EK,ER,EY}, $T22,
{U,AB,AI,AP,AW,BD,BK,BR,BY,CF,CM,CT,DA,DH,DO,DV,EC,EJ,EQ,EX}, U),
COUNTIFS(
{T,AA,AH,AO,AV,BC,BJ,BQ,BX,CE,CL,CS,CZ,DG,DN,DU,EB,EI,EP,EW}, $O,
{V,AC,AJ,AQ,AX,BE,BL,BS,BZ,CG,CN,CU,DB,DI,DP,DW,ED,EK,ER,EY}, $T22,
{U,AB,AI,AP,AW,BD,BK,BR,BY,CF,CM,CT,DA,DH,DO,DV,EC,EJ,EQ,EX}, U))
另一种可能的简单加速方法是删除您有数据的最后一行以下的所有行。
您需要删除所有查询公式(所有那些看起来像您问题中的示例的公式)并用此构建替换它们:
=IF($G="Year Total",
COUNTA(FILTER(Contacts!V3:V, Contacts!V3:V=$B12, Contacts!U3:U=E))+
COUNTA(FILTER(Contacts!AC3:AC,Contacts!AC3:AC=$B12,Contacts!AB3:AB=E))+
etc...
,COUNTA(FILTER(Contacts!T3:T, Contacts!T3:T=$G, Contacts!V3:V=$B12, Contacts!U3:U=E))+
COUNTA(FILTER(Contacts!AA3:AA,Contacts!AA3:AA=$G,Contacts!AC3:AC=$B12,Contacts!AB3:AB=E))+
etc...
)
这会给你 ~80% 的提升