在三个不同的工作表中过滤最新版本的行
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)}))
我的问题是找到一个可行的解决方案,用于在三个不同的传播 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)}))