如果所有 non-empty 值都相同,则公式为 return 值,否则 return 为空?
Formula to return value if all non-empty values are same, else return empty?
我有一个 Google Sheet 有很多(很多很多)以下情况的案例:
A B C D E
1 a b1 e1
2 a
3 b2 d e2
4 a e2
基本上每一行都列出了从不同位置抓取的内容(关于研究论文的信息);理论上,每行中的值应该相同,但由于某些位置缺少某些信息,有时信息在某些次要(但可能很重要)方面有所不同,因此并非 100% 一致。
如果该列中的所有 non-empty 值都相同,我希望该组下面的每个单元格显示一个值,如果 non-empty 之间存在差异,则不显示任何值=] 值。请参阅下面的第 5 行:
A B C D E
1 a b1 e1
2 a
3 b2 d e2
4 a e2
5 a d
这基本上是第一个程序化的 clean-up 来协助进一步的体力劳动(这是不可避免的)。
有一个例子 sheet available here - 真实的东西会有大约 18 组值(标题、作者、ISBN、出版物、URL、关键字等),并且270 列(每列用于另一份出版物)。底部的橙色行只是手动粘贴,但显示我想通过公式在蓝色行中获得的值。
我知道这可以用大量的 IF 字符串来完成,但是......肯定有一种方法可以编写一个公式,从一个数组或一组单元格中提取所有 non-empty 值, 将它们相互比较,如果它们都相等,return 一个值?
很遗憾,我画的是一片空白...
这肯定不是最佳解决方案,但它有效
=IF(COUNTIF(A1:A7,first_non_empty_cell)=COUNTA(A1:A7),first_non_empty_cell,"")
您可以考虑将 first_non_empty_cell
替换为
LOWER(INDEX(A1:A7,MATCH(1,INDEX((A1:A7<>0),0),0)))
或包含要用于比较的值的单元格。
Countunique 应该有效:
=if(countunique(A1:A4)=1,sortn(A1:A4,1),"")
我使用 sortn 是因为我想在显示应该是单个非空值的值之前从值列表中删除所有空单元格,这是一种方法(空单元格排序到最后所以不会出现)。
编辑
如果数据包括#N/A,处理它们的最短方法可能是使用(对我来说有点晦涩)函数 countuniqueifs
=if(countuniqueifs(A1:A4,A1:A4,"<>#N/A")=1,sortn(A1:A4,1),"")
空白单元格和#N/A 仍然排在其他所有内容之后,所以我认为 sortn 部分应该仍然有效。
但这还有一个问题 - 如果范围包含从公式返回的空字符串,sortn 部分将无法正常工作,因此必须回退到过滤:
=if(countuniqueifs(C1:C4,C1:C4,"<>#N/A",C1:C4,"<>")=1,filter(C1:C4,C1:C4<>"#N/A",C1:C4<>""),"")
=IFERROR(IF(COUNTA(UNIQUE(FILTER(B2:B5, B2:B5<>"", B2:B5<>"#N/A")))>1, ,
UNIQUE(FILTER(B2:B5, B2:B5<>"", B2:B5<>"#N/A"))))
或更短:
=IF(COUNTUNIQUE(FILTER(D2:D5, D2:D5<>"", D2:D5<>"#N/A"))>1, ,
UNIQUE(FILTER(D2:D5, D2:D5<>"", D2:D5<>"#N/A")))
我有一个 Google Sheet 有很多(很多很多)以下情况的案例:
A B C D E
1 a b1 e1
2 a
3 b2 d e2
4 a e2
基本上每一行都列出了从不同位置抓取的内容(关于研究论文的信息);理论上,每行中的值应该相同,但由于某些位置缺少某些信息,有时信息在某些次要(但可能很重要)方面有所不同,因此并非 100% 一致。
如果该列中的所有 non-empty 值都相同,我希望该组下面的每个单元格显示一个值,如果 non-empty 之间存在差异,则不显示任何值=] 值。请参阅下面的第 5 行:
A B C D E
1 a b1 e1
2 a
3 b2 d e2
4 a e2
5 a d
这基本上是第一个程序化的 clean-up 来协助进一步的体力劳动(这是不可避免的)。
有一个例子 sheet available here - 真实的东西会有大约 18 组值(标题、作者、ISBN、出版物、URL、关键字等),并且270 列(每列用于另一份出版物)。底部的橙色行只是手动粘贴,但显示我想通过公式在蓝色行中获得的值。
我知道这可以用大量的 IF 字符串来完成,但是......肯定有一种方法可以编写一个公式,从一个数组或一组单元格中提取所有 non-empty 值, 将它们相互比较,如果它们都相等,return 一个值?
很遗憾,我画的是一片空白...
这肯定不是最佳解决方案,但它有效
=IF(COUNTIF(A1:A7,first_non_empty_cell)=COUNTA(A1:A7),first_non_empty_cell,"")
您可以考虑将 first_non_empty_cell
替换为
LOWER(INDEX(A1:A7,MATCH(1,INDEX((A1:A7<>0),0),0)))
或包含要用于比较的值的单元格。
Countunique 应该有效:
=if(countunique(A1:A4)=1,sortn(A1:A4,1),"")
我使用 sortn 是因为我想在显示应该是单个非空值的值之前从值列表中删除所有空单元格,这是一种方法(空单元格排序到最后所以不会出现)。
编辑
如果数据包括#N/A,处理它们的最短方法可能是使用(对我来说有点晦涩)函数 countuniqueifs
=if(countuniqueifs(A1:A4,A1:A4,"<>#N/A")=1,sortn(A1:A4,1),"")
空白单元格和#N/A 仍然排在其他所有内容之后,所以我认为 sortn 部分应该仍然有效。
但这还有一个问题 - 如果范围包含从公式返回的空字符串,sortn 部分将无法正常工作,因此必须回退到过滤:
=if(countuniqueifs(C1:C4,C1:C4,"<>#N/A",C1:C4,"<>")=1,filter(C1:C4,C1:C4<>"#N/A",C1:C4<>""),"")
=IFERROR(IF(COUNTA(UNIQUE(FILTER(B2:B5, B2:B5<>"", B2:B5<>"#N/A")))>1, ,
UNIQUE(FILTER(B2:B5, B2:B5<>"", B2:B5<>"#N/A"))))
或更短:
=IF(COUNTUNIQUE(FILTER(D2:D5, D2:D5<>"", D2:D5<>"#N/A"))>1, ,
UNIQUE(FILTER(D2:D5, D2:D5<>"", D2:D5<>"#N/A")))