请参阅添加的工作表“Erik 帮助”,单元格 A1,了解以下数组公式:
=ArrayFormula(QUERY({{"Employee";UNIQUE(QUERY({Sheet1!E2:E;Sheet1!H2:H;Sheet1!K2:K;Sheet1!N2:N;Sheet1!Q2:Q;Sheet1!T2:T;Sheet1!W2:W;Sheet1!Z2:Z;Sheet1!AC2:AC;Sheet1!AF2:AF},"Select * Where Col1 Is Not Null",0))},{"Projects";COUNTIF({Sheet1!E2:E&Sheet1!H2:H&Sheet1!K2:K&Sheet1!N2:N&Sheet1!Q2:Q&Sheet1!T2:T&Sheet1!W2:W&Sheet1!Z2:Z&Sheet1!AC2:AC&Sheet1!AF2:AF},"*"&UNIQUE(QUERY({Sheet1!E2:E;Sheet1!H2:H;Sheet1!K2:K;Sheet1!N2:N;Sheet1!Q2:Q;Sheet1!T2:T;Sheet1!W2:W;Sheet1!Z2:Z;Sheet1!AC2:AC;Sheet1!AF2:AF},"Select * Where Col1 Is Not Null",0))&"*")}},"Select * Order By Col2 Desc"))
我会在这里分解一些,如果需要更深入的学习,然后鼓励你进一步剖析它。
显然,这是一个数组公式。在这种情况下,这意味着一个公式正在生成整个报告。
最外层的 QUERY 只是将结果放在双花括号 {{ }} 中,按项目数量排序:QUERY( {{...}} ,"Select * Order By Col2 Desc")
您会看到那些双花括号。但实际上,它是一组外部大括号,其中包含另外两组大括号: { {...},{...} } 内部的两个数组分别创建报告的第一列和第二列。逗号表示将它们并排放置。您会注意到,每个内部数组的第一个元素都会为各个列(即“Employee”和“Projects”)生成标题。
每个标题后面的分号表示将后面的内容放在下面,而不是并排放置。你会注意到第一个内部数组中有很多分号。因为你说在任何一个项目上工作的人永远不会超过 10 人,所以我们可以预先确定所有可能包含名称的列,并用这些分号虚拟“堆叠”它们,形成一个长的虚拟列。当然,其中许多列将是空的,因为许多项目不会有完整的十个人的名字。所以这个名称的虚拟列被包装在它自己的查询中,它将清除空值:
QUERY({Sheet1!E2:E;Sheet1!H2:H;Sheet1!K2:K;Sheet1!N2:N;Sheet1!Q2:Q;Sheet1!T2:T;Sheet1!W2:W;Sheet1!Z2:Z;Sheet1!AC2:AC;Sheet1!AF2:AF},"Select * Where Col1 Is Not Null",0)
为此,我应用了 UNIQUE,它提供唯一名称的第一列列表(而不是每次出现名称时):
UNIQUE(QUERY({Sheet1!E2:E;Sheet1!H2:H;Sheet1!K2:K;Sheet1!N2:N;Sheet1!Q2:Q;Sheet1!T2:T;Sheet1!W2:W;Sheet1!Z2:Z;Sheet1!AC2:AC;Sheet1!AF2:AF},"Select * Where Col1 Is Not Null",0))
所以完整的 first 内部虚拟数组(形成最终报告的完整第一列)如下所示:
{"Employee";UNIQUE(QUERY({Sheet1!E2:E;Sheet1!H2:H;Sheet1!K2:K;Sheet1!N2:N;Sheet1!Q2:Q;Sheet1!T2:T;Sheet1!W2:W;Sheet1!Z2:Z;Sheet1!AC2:AC;Sheet1!AF2:AF},"Select * Where Col1 Is Not Null",0))}
第二个内部虚拟数组使用与号将分配给每个项目的所有名称加入到一个长字符串中。因此,例如,如果 Chris、John 和 Ryan 都参与了一个项目(其中一些人多次参与),他们的行(看不见的)连接可能如下所示:ChrisChrisJohnChrisRyanChris。
我们在每个由此类连接组成的虚拟数组上运行一个 COUNTIF,您将看到的条件主要由第一个内部虚拟数组中的整个 UNIQUE 子句组成(这是所有可能名称的候选名单)。您会注意到它的前后都附加了这样的星号: ""&UNIQUE(...)&"" 星号是任意数量字符的通配符。所以本质上这将搜索那些长连接的字符串以查找每个名称 anywhere 的外观;并且一旦找到一个名称,COUNTIF 就会将其注册为 TRUE...一次(不是每次出现在字符串中)。
所以第二个内部虚拟数组孤立地看起来像这样:
{"Projects";COUNTIF({Sheet1!E2:E&Sheet1!H2:H&Sheet1!K2:K&Sheet1!N2:N&Sheet1!Q2:Q&Sheet1!T2:T&Sheet1!W2:W&Sheet1!Z2:Z&Sheet1!AC2:AC&Sheet1!AF2:AF},"*"&UNIQUE(QUERY({Sheet1!E2:E;Sheet1!H2:H;Sheet1!K2:K;Sheet1!N2:N;Sheet1!Q2:Q;Sheet1!T2:T;Sheet1!W2:W;Sheet1!Z2:Z;Sheet1!AC2:AC;Sheet1!AF2:AF},"Select * Where Col1 Is Not Null",0))&"*")}
如果没有我前面提到的最外层 QUERY,您仍然可以获得准确的结果;它们只会以 UNIQUE 名称列表碰巧出现在项目中的任何顺序显示。我觉得无论谁拥有最多的项目或最少的人,都可以发送更多订单。