在三个不同的工作表中过滤最新版本的行

Filtering with newest version of rows in three different sheets

我的问题是找到一个可行的解决方案,用于在三个不同的传播 sheet 中识别 ID 列,然后 return 具有最新更新时间的行。

下面是示例,代表了不同的点差sheet。 sheet 中还有更多的列,但这是测量的两列(它们采用日期时间格式 IRL)。前两个是事件触发的,第三个是手动的。

NEW DEAL CREATED         NEW STAGE UPDATE       IMPORT (DATAPROOFING)               
+--------+------------+  +-------+-----------+  +-------+-----------+
| ID     |UPDATE TIME |  |ID     |UPDATE TIME|  |ID     |UPDATE TIME|
+--------+------------+  +-------+-----------+  +-------+-----------+
| 233    | 21/05/2015 |  |233    |21/05/2015 |  |233    |01/04/2015 |
| 234    | 22/05/2016 |  |233    |22/05/2015 |  |143    |31/02/2016 |
| 325    | 02/05/2016 |  |234    |22/05/2015 |  |847    |11/07/2015 |
| 326    | 01/01/2016 |  |234    |23/05/2015 |  |746    |19/08/2016 |
| 327    | 03/04/2016 |  |233    |24/05/2015 |  |432    |05/03/2015 |
| 328    | 05/03/2015 |  |233    |24/05/2015 |  |342    |20/01/2016 |
+--------+------------+  +-------+-----------+  +-------+-----------+

然后我想要的数据是每个 ID 的一行,return使用最新更新日期 sheet 的行。

我正在使用 Google Spreadsheets 对公司的 CRM 进行分析。在这里,我从客户那里导入交易,但我必须同时使用 Zapier 和手动导入,这意味着很多重复项,尽管使用了不同的 sheets。

我没有成功创建过滤函数,但是我现在的是这样的:

=iferror(
if(
iferror(
index(Import!$N:$N,(match(Calculations!$B110,Import!$A:$A,0)),1),"IMPORTERROR")=MAX({index(Import!$N:$N,(match(Calculations!$B110,Import!$A:$A,0)),1),iferror(index(Zapier!$BV:$BV,(match(Calculations!$B110,Zapier!$A:$A,0))),""),index(Pipedrive!$BV:$BV,(match(Calculations!$B110,Pipedrive!$A:$A,0)))}),
"ImportConvert",
(if(
iferror(
index(Zapier!$BV:$BV,(match(Calculations!$B110,Zapier!$A:$A,0))),"ZAPIERERROR")=MAX({index(Import!$N:$N,(match(Calculations!$B110,Import!$A:$A,0)),1),iferror(index(Zapier!$BV:$BV,(match(Calculations!$B110,Zapier!$A:$A,0))),""),index(Pipedrive!$BV:$BV,(match(Calculations!$B110,Pipedrive!$A:$A,0)))}),
"Zapier",
(if(
iferror(
index(Pipedrive!$BV:$BV,(match(Calculations!$B110,Pipedrive!$A:$A,0))),"PIPEDRIVEERROR")=MAX({index(Import!$N:$N,(match(Calculations!$B110,Import!$A:$A,0)),1),iferror(index(Zapier!$BV:$BV,(match(Calculations!$B110,Zapier!$A:$A,0))),""),index(Pipedrive!$BV:$BV,(match(Calculations!$B110,Pipedrive!$A:$A,0)))}),
"Pipedrive",
"NONE"))))),"")

它不太有效,因为它要求 ID 出现在所有 sheet 中。事实并非如此,因为手动导入并不经常填写。

我不擅长编程,认识到可能存在数组解决方案。

简而言之答案:

=max(ARRAYFORMULA(if(Sheet2!A:A = A1,Sheet2!B:B,0)),ARRAYFORMULA(if(Sheet3!A:A = A1,Sheet3!B:B,0)),ARRAYFORMULA(if(Sheet4!A:A = A1,Sheet4!B:B,0)))

如果您得到一堆数字而不是日期,则强制将列的格式设置为日期。这些公式有时似乎会混淆自动格式化。

一点解释:

此公式假设当前sheet上的A1为身份证号码

max(ARRAYFORMULA(if(Sheet3!A:A = A1,Sheet3!B:B,0)))

数组公式将 if 应用于 sheet3 中 A 列中的每个单元格,并将结果放入 list/array。该列表将包含 sheet3 中与 A1 中的 ID 匹配的每个 ID 的日期和一串零。取该列表的最大值为我们提供了 sheet3.

中该 ID 的最高(最近)日期

然后我们为每个其他 sheet 提供最大数组公式,我们将获得与任何 sheet 上的 ID 关联的最新日期

=max(ARRAYFORMULA(if(Sheet2!A:A = A1,Sheet2!B:B,0)),ARRAYFORMULA(if(Sheet3!A:A = A1,Sheet3!B:B,0)),ARRAYFORMULA(if(Sheet4!A:A = A1,Sheet4!B:B,0)))

求最老的:

将 if 中的 0 更改为 NOW() 或 NOW() + 如果您使用的是未来日期并采用 min

=min(ARRAYFORMULA(if(Sheet2!A:A = A1,Sheet2!B:B,NOW())),ARRAYFORMULA(if(Sheet3!A:A = A1,Sheet3!B:B,NOW())),ARRAYFORMULA(if(Sheet4!A:A = A1,Sheet4!B:B,NOW())))

备选方案: 如果您想知道日期所在的 sheet 和单元格,您必须使用嵌套的 IF 和匹配项:

=if(AND(max(ARRAYFORMULA(if(Sheet3!A:A = A1,Sheet3!B:B,0))) > max(ARRAYFORMULA(if(Sheet2!A:A = A1,Sheet2!B:B,0))), max(ARRAYFORMULA(if(Sheet3!A:A = A1,Sheet3!B:B,0))) > max(ARRAYFORMULA(if(Sheet4!A:A = A1,Sheet4!B:B,0)))),"Sheet3!B"&match(max(ARRAYFORMULA(if(Sheet3!A:A = A1,Sheet3!B:B,0))),Sheet3!B:B),if(max(ARRAYFORMULA(if(Sheet4!A:A = A1,Sheet4!B:B,0))) > max(ARRAYFORMULA(if(Sheet2!A:A = A1,Sheet2!B:B,0))),"Sheet4!B"&match(max(ARRAYFORMULA(if(Sheet4!A:A = A1,Sheet4!B:B,0))),Sheet4!B:B),"Sheet2!B"&match(max(ARRAYFORMULA(if(Sheet2!A:A = A1,Sheet2!B:B,0))),Sheet2!B:B)))

一些可能有用的东西:

我这样做是为了用来自其他三个 sheet 的非重复 ID 列表填充我的 Sheet1 上的 A 列。

=sort(UNIQUE({UNIQUE(Sheet2!A:A); UNIQUE(Sheet3!A:A);UNIQUE(Sheet4!A:A)}))