@Gabe,我已在您的示例电子表格中添加了一张工作表(“Erik 帮助”)。里面有三个公式。
在 A2 中:
=UNIQUE(FILTER('Raw Data'!A2:A,'Raw Data'!B2:B<>""))
这只是从“原始数据”生成学生的唯一姓名列表。
在B1:
=FILTER('Raw Data'!B1:1,ISNUMBER('Raw Data'!B1:1))
这会从“原始数据”的第一行生成所有日期的列表。
在 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"))
至于这个较长的公式是如何工作的,虽然我通常会留下详细的解释,但老实说,我现在太累了,无法完成完整的 shebang。但我会解释基础知识。
您会注意到FILTER(FILTER(...)) 出现了两次。首先是确保让公式只关注每个工作表中实际有数据的单元格。这将有助于加快处理速度。
IF(NOT(ISERROR(VLOOKUP(...)))) 分解为“如果你能找到这个……做 X。”
我们正在寻找的是由结果 A2:A 中的每个名称与 B1:1 中的每个数据与 "P" 连接的每个可能组成的字符串;实际上(即在内存中),这些结果将在结果中使用此类连接填充 2D 网格(例如,网格中的 B2 将存储“Jon44170P”,C3 将存储“Barbara44171P”等)。
这些字符串中的每一个都将在 FLATTENed 虚拟列中进行 VLOOKUP 处理,该列由“原始数据”中的每个名称与“原始数据”中的每个数据与实际“P”连接或“原始数据”网格的其余部分中的“A”。
如果 VLOOKUP 成功(即IF(NOT(ISERROR(VLOOKUP(...))))),则在该日期为该名称找到一个“P”。如果未找到,则分配默认的“A”。
由于这些公式是自扩展的,因此您可以根据需要将数据添加到“原始数据”中,而无需将公式拖到任何地方。
我还添加了条件格式以在数据扩展或收缩时扩展或收缩背景填充颜色。