Google 工作表 INDEX/MATCH 有多个结果

Google Sheets INDEX/MATCH with multiple results

test spreadsheet

选项卡 'Raw Data' 包含来自多个活动的“出勤表”的组合。学生在同一日期参加多项活动。

选项卡 'Result' 列出所有唯一的学生和日期。

目标: 'Result'!B3:D11 如果该学生在 any[= 中得分为 P,则标记为 P 或 A 34=] 当天的活动。

例如: 12 月 5 日,Evan 在他的活动中被标记为 A、A 和 P - 因此他应该在该日期被标记为 P。

如果这些是数字,我想我可以将 SMALL 或 LARGE 与 INDEX/MATCH 结合使用来计算结果...但我不确定如何使这个公式与 A 一起使用和 P。

由于在您的示例 sheet 中您没有使用针对唯一学生的公式我建议 - 在单元格 F3- 您使用

=UNIQUE(FILTER($A:$A,B2:B33<>""))

我们现在可以在单元格 G2 中将上面的公式用作下面公式的一部分,以获得所需的结果

=ArrayFormula({B1;IF(COUNTIFS($A:$A,"="&UNIQUE(FILTER($A:$A,B2:B<>"")),B2:B,"=P")>0,"P","A")})

将上面的内容拖动到右侧的相邻单元格,以获得其余的列。

(请根据您的需要调整范围)

使用的函数:

@Gabe,我在你的样本传播sheet 中添加了 sheet(“Erik Help”)。里面有三个公式。

在 A2 中:

=UNIQUE(FILTER('Raw Data'!A2:A,'Raw Data'!B2:B<>""))

这只会生成来自 'Raw Data' 的学生的唯一姓名列表。

在 B1:

=FILTER('Raw Data'!B1:1,ISNUMBER('Raw Data'!B1:1))

这会从 'Raw Data' 的第一行生成所有日期的列表。

在 B2 中:

=ArrayFormula(IF(NOT(ISERROR(VLOOKUP(FILTER(FILTER(A2:A&B1:1&"P",A2:A<>""),ISNUMBER(B1:1)),FLATTEN(FILTER(FILTER('Raw Data'!A2:A&'Raw Data'!B1:1&INDIRECT("Raw Data!B2:"&ROWS('Raw Data'!A:A)),'Raw Data'!A2:A<>""),ISNUMBER('Raw Data'!B1:1))),1,FALSE))),"P","A"))

至于这个更长的公式是如何工作的,虽然我通常会留下详细的解释,但老实说,我现在太累了,无法完成所有的工作。但我会解释基础知识。

您会注意到 FILTER(FILTER(...)) 出现了两次。首先是确保让公式只关注每个 sheet 中实际有数据的单元格。这将有助于加快处理速度。

IF(NOT(ISERROR(VLOOKUP(...)))) 分解为“如果你能找到这个...做 X”。

我们正在寻找的是结果 A2:A 中的每个名称与来自 B1:1 的每个数据连接并与“P”连接的每个可能的字符串;实际上(即在内存中),这些结果将填充具有此类连接的结果中的二维网格(例如,网格中的 B2 将存储“Jon44170P”,C3 将存储“Barbara44171P”等)。

这些字符串中的每一个都将在 FLATTENed 虚拟列中进行 VLOOKUP,该虚拟列由 'Raw Data' 中的每个名称与 'Raw Data' 中的每个数据与 实际 'P' 或 'A' 在 'Raw Data' 网格的其余部分。

如果 VLOOKUP 成功(即 IF(NOT(ISERROR(VLOOKUP(...))))),则在该日期为该名称找到“P”。如果未找到,则分配默认的“A”。

因为这些公式是自扩展的,所以您可以根据需要向 'Raw Data' 添加数据,而无需将公式拖到任何地方。

我还添加了条件格式以在数据扩展或收缩时扩展或收缩背景填充颜色。

尝试:

=ARRAYFORMULA(QUERY(REGEXREPLACE(SORTN(SORT(UNIQUE(SPLIT(FLATTEN(
 IF('Raw Data'!B2:D="",, 'Raw Data'!B1:D1&"♂"&TEXT('Raw Data'!B1:D1, "m/d")&
 "♀"&'Raw Data'!B1:D1&"♂"&'Raw Data'!A2:A&"♀"&'Raw Data'!B2:D)), "♀")), 3, 0, 2, 1), 
 9^9, 2, 2, 1), "(\d+♂)", ), 
 "select Col2,max(Col3)
  where not Col1 matches '#VALUE!' 
  group by Col2 
  pivot Col1"))