将长公式转换为 ARRAYFORMULA
Convert long formula into an ARRAYFORMULA
问题
如何将 Schedule!C20:I29
处的以下简单公式转换为 Schedule!C20
处的单个简单 ARRAYFORMULA?
=Count(Filter(Students!$B:$B, Find(C6, Filter(Students!$J:$O,Students!$J:$O = 'Current Class'!$B))))
.
注意:
- 以上代码只是部分解决方案。我将替换代码的ARRAYFORMULA版本到
Current Class!L6
处代码的正确部分
上面的 C6
引用可以包含 Schedule!C6:I15
之间的任何单元格。我将该范围命名为 Timetable_Code
。 我以为我可以做到以下几点,但我错了...
=Arrayformula(Count(Filter(Students!$B:$B, Find(Timetable_Code, Filter(Students!$J:$O,Students!$J:$O = 'Current Class'!$B)))))
背景
最初,我创建了一个 table,现在位于 1st Version - Current Class!L6
。此选项卡仅供您参考,很快就会被删除。每个单元格都有一个稍作修改的公式。 这个公式可以正常工作;然而,它是一个庞然大物,很难修改...
=if(COUNTIF(Meta!$B:$B, CONCATENATE("=",if(L = "THURSDAY", "TH", if(L = "SUNDAY", "SU", left(L,1))), if(left($K6, 2) = "12", 0, left($K6, 1)))), CONCATENATE(if(L = "THURSDAY", "TH", if(L = "SUNDAY", "SU", left(L,1))), if(left($K6, 2) = "12", 0, left($K6, 1)), " ( ", Count(Filter(Students!$B:$B, Find(CONCATENATE(if(L = "THURSDAY", "TH", if(L = "SUNDAY", "SU", left(L,1))), if(left($K6, 2) = "12", 0, left($K6, 1))), Filter(Students!$J:$O,Students!$J:$O = $B)))), " )") ,"")
.
优点
- 我不需要创建任何辅助数据。
- 所有计算都是"in-memory"
缺点
- 太大
- 难以修改
我喜欢输出,但我不喜欢缺点,所以我开始创建一个更适合编辑的代码版本,我基本上可以接受。此代码位于 Current Class!L6
(第二个副本位于 Schedule!C33
- 它将被删除。)它在 Current Class!L6
处有一个 单一 公式。 ..
=arrayformula(if(COUNTIF(Meta!$B:$B, ("=" & Timetable_Code)), (Timetable_Code & " ( " & Timetable_StudentCount & " )") ,""))
.
优点
- 非常容易理解
- 非常容易修改
- 无需将公式复制到其他单元格
缺点
- 创建了两个 ( 2 ) 个助手 table(我认为不需要其中一个)
同样,我喜欢输出,但我真的不喜欢第二个助手 table (Schedule!C20
)。我感觉这个table可以消除,但是一直没弄明白怎么办。
如果您真的想使用 arrayformula
,就在这里。对于 Schedule!C20
.
=arrayformula((len(concatenate(index(Students!J5:O, , match('Current Class'!$B, Students!J4:O4, 0))))-len(substitute(concatenate(index(Students!J5:O, , match('Current Class'!$B, Students!J4:O4, 0))),C6:I15,"")))/len(C6:I15))
也许你可以使用 filter
(就像你以前做的那样)而不是 index & match
部分,但我更喜欢 index & match
并且不想挖掘更多。您也可以使用 one 帮助单元格存储 filter
或 index & match
结果以缩短公式。
核心思想是计算字符串中给定字符的出现次数,即len(a1) - len(substitute(a1, ...
。你可以在网上找到很多关于它的文档。
总之,如果我是你,我对现在的状态已经很满意了。只需锁定并隐藏帮助表或工作表。没有人关心隐藏的工作表,如果发生不好的事情,您可以还原任何更改。
在得到@Sangbok Lee 的一个很好的回答后,我决定将他给我的函数的每个部分拆分开来。在这样做的同时,我发现与我上周在 Google 表格中所做的一些工作不太可能相关。我在另一个选项卡中的帮助列有点做了 Sangbok Lee 试图做的事情。我所要做的就是将该辅助列拆分为两列(1 用于之前的最终计算,1 用于)并计算一个额外的计数列
在修改我们的两个公式并测试结果后,我找到了一个更令我满意的解决方案!
=arrayformula(if(countif(Meta!$B:$B, (Timetable_Code)), (Timetable_Code & " ( " & vlookup(Timetable_Code, StudentCount_Lookup, 2, false) & " )") ,""))
.
查看 Google Sheet
中的差异
- 查看第一个版本的
1st Version - Current Class!L6
选项卡
- 第二版请看
Current Class!L6
查看 Current Class!U6
第三个也是最终版本
另请查看选项卡 Meta
和 Schedule
了解差异。
注:绿色为旧数据,红色为新数据
问题
如何将 Schedule!C20:I29
处的以下简单公式转换为 Schedule!C20
处的单个简单 ARRAYFORMULA?
=Count(Filter(Students!$B:$B, Find(C6, Filter(Students!$J:$O,Students!$J:$O = 'Current Class'!$B))))
.
注意:
- 以上代码只是部分解决方案。我将替换代码的ARRAYFORMULA版本到
Current Class!L6
处代码的正确部分
上面的
C6
引用可以包含Schedule!C6:I15
之间的任何单元格。我将该范围命名为Timetable_Code
。 我以为我可以做到以下几点,但我错了...=Arrayformula(Count(Filter(Students!$B:$B, Find(Timetable_Code, Filter(Students!$J:$O,Students!$J:$O = 'Current Class'!$B)))))
背景
最初,我创建了一个 table,现在位于 1st Version - Current Class!L6
。此选项卡仅供您参考,很快就会被删除。每个单元格都有一个稍作修改的公式。 这个公式可以正常工作;然而,它是一个庞然大物,很难修改...
=if(COUNTIF(Meta!$B:$B, CONCATENATE("=",if(L = "THURSDAY", "TH", if(L = "SUNDAY", "SU", left(L,1))), if(left($K6, 2) = "12", 0, left($K6, 1)))), CONCATENATE(if(L = "THURSDAY", "TH", if(L = "SUNDAY", "SU", left(L,1))), if(left($K6, 2) = "12", 0, left($K6, 1)), " ( ", Count(Filter(Students!$B:$B, Find(CONCATENATE(if(L = "THURSDAY", "TH", if(L = "SUNDAY", "SU", left(L,1))), if(left($K6, 2) = "12", 0, left($K6, 1))), Filter(Students!$J:$O,Students!$J:$O = $B)))), " )") ,"")
.
优点
- 我不需要创建任何辅助数据。
- 所有计算都是"in-memory"
缺点
- 太大
- 难以修改
我喜欢输出,但我不喜欢缺点,所以我开始创建一个更适合编辑的代码版本,我基本上可以接受。此代码位于 Current Class!L6
(第二个副本位于 Schedule!C33
- 它将被删除。)它在 Current Class!L6
处有一个 单一 公式。 ..
=arrayformula(if(COUNTIF(Meta!$B:$B, ("=" & Timetable_Code)), (Timetable_Code & " ( " & Timetable_StudentCount & " )") ,""))
.
优点
- 非常容易理解
- 非常容易修改
- 无需将公式复制到其他单元格
缺点
- 创建了两个 ( 2 ) 个助手 table(我认为不需要其中一个)
同样,我喜欢输出,但我真的不喜欢第二个助手 table (Schedule!C20
)。我感觉这个table可以消除,但是一直没弄明白怎么办。
如果您真的想使用 arrayformula
,就在这里。对于 Schedule!C20
.
=arrayformula((len(concatenate(index(Students!J5:O, , match('Current Class'!$B, Students!J4:O4, 0))))-len(substitute(concatenate(index(Students!J5:O, , match('Current Class'!$B, Students!J4:O4, 0))),C6:I15,"")))/len(C6:I15))
也许你可以使用 filter
(就像你以前做的那样)而不是 index & match
部分,但我更喜欢 index & match
并且不想挖掘更多。您也可以使用 one 帮助单元格存储 filter
或 index & match
结果以缩短公式。
核心思想是计算字符串中给定字符的出现次数,即len(a1) - len(substitute(a1, ...
。你可以在网上找到很多关于它的文档。
总之,如果我是你,我对现在的状态已经很满意了。只需锁定并隐藏帮助表或工作表。没有人关心隐藏的工作表,如果发生不好的事情,您可以还原任何更改。
在得到@Sangbok Lee 的一个很好的回答后,我决定将他给我的函数的每个部分拆分开来。在这样做的同时,我发现与我上周在 Google 表格中所做的一些工作不太可能相关。我在另一个选项卡中的帮助列有点做了 Sangbok Lee 试图做的事情。我所要做的就是将该辅助列拆分为两列(1 用于之前的最终计算,1 用于)并计算一个额外的计数列
在修改我们的两个公式并测试结果后,我找到了一个更令我满意的解决方案!
=arrayformula(if(countif(Meta!$B:$B, (Timetable_Code)), (Timetable_Code & " ( " & vlookup(Timetable_Code, StudentCount_Lookup, 2, false) & " )") ,""))
.
查看 Google Sheet
中的差异- 查看第一个版本的
1st Version - Current Class!L6
选项卡 - 第二版请看
Current Class!L6
查看
Current Class!U6
第三个也是最终版本另请查看选项卡
Meta
和Schedule
了解差异。
注:绿色为旧数据,红色为新数据