将长公式转换为 ARRAYFORMULA

Convert long formula into an ARRAYFORMULA

文档:https://docs.google.com/spreadsheets/d/1N4cGw5eUq_3gCJh1w39qVatX9KV1_Hr-AqRHj_nbckA/edit#gid=1770960621


问题

如何将 Schedule!C20:I29 处的以下简单公式转换为 Schedule!C20 处的单个简单 ARRAYFORMULA?

=Count(Filter(Students!$B:$B, Find(C6, 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)))), " )") ,"")
.

优点

缺点

我喜欢输出,但我不喜欢缺点,所以我开始创建一个更适合编辑的代码版本,我基本上可以接受。此代码位于 Current Class!L6(第二个副本位于 Schedule!C33 - 它将被删除。)它在 Current Class!L6 处有一个 单一 公式。 ..

=arrayformula(if(COUNTIF(Meta!$B:$B, ("=" & Timetable_Code)), (Timetable_Code & "     ( " & Timetable_StudentCount & " )") ,""))
.

优点

缺点

同样,我喜欢输出,但我真的不喜欢第二个助手 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 帮助单元格存储 filterindex & 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 第三个也是最终版本

  • 另请查看选项卡 MetaSchedule 了解差异。

注:绿色为旧数据,红色为新数据