【发布时间】:2014-03-20 21:45:39
【问题描述】:
我正在寻找谷歌电子表格的公式 如果同一列中的值重复,则突出显示单元格
谁能帮我解答这个问题?
【问题讨论】:
标签: google-sheets gs-conditional-formatting
我正在寻找谷歌电子表格的公式 如果同一列中的值重复,则突出显示单元格
谁能帮我解答这个问题?
【问题讨论】:
标签: google-sheets gs-conditional-formatting
试试这个:
Custom formula is
=countif(A:A,A1)>1(或将 A 更改为您选择的列)A1:A100)。将检查 A1:A100 单元格中写入的任何内容,如果存在重复项(出现多次),则会对其进行着色。
对于使用逗号 (,) 作为小数分隔符的语言环境,参数分隔符很可能是分号 (;)。也就是说,请尝试:=countif(A:A;A1)>1,而不是。
对于多列,请使用countifs。
【讨论】:
=COUNTIFS(A:A; A1; B:B; B1)>1,则使用这样的方法
; 导致我出现“无效公式”错误。只需删除它就可以了。还要注意:您指定为countif 的第二个参数的单元格应该是您选择的范围的第一个单元格。
=countif(B:B,B2)>1。这允许在使用绝对与相对单元格引用时进行一些非常高级的格式化。
=COUNTIF(C:C, C1) > 1
解释:这里的C1 不是指C 中的第一行。因为这个公式是通过条件格式规则评估的,相反,当检查公式是否适用时,C1 有效指当前正在评估的任何行以查看是否应应用突出显示。 (所以它更像是INDIRECT(C &ROW()),如果这对你来说意味着什么!)。本质上,在评估条件格式公式时,引用第 1 行的任何内容都会根据运行公式的行进行评估。 (是的,如果您使用 C2,那么您要求规则检查当前正在评估的行的紧下方的行的状态。)
所以这就是说,计算C1(正在评估的当前单元格)中的任何内容在整个列C 中的出现次数,并且如果其中有超过1 个(即值有重复)然后:应用高亮显示(因为总体而言,公式的计算结果为 TRUE)。
=AND(COUNTIF(C:C, C1) > 1, COUNTIF(C$1:C1, C1) = 1)
说明:这仅在两个COUNTIFs 都是TRUE 时突出显示(它们出现在AND() 中)。
要评估的第一个术语(COUNTIF(C:C, C1) > 1)与第一个示例中的完全相同;只有当C1 中的任何内容有重复项时,它才是TRUE。 (请记住,C1 实际上是指正在检查的当前行以查看它是否应该突出显示)。
第二个术语 (COUNTIF(C$1:C1, C1) = 1) 看起来很相似,但有三个关键区别:
它不会搜索整个列 C(就像第一个列:C:C),而是从第一行开始搜索:C$1
($ 强制它从字面上看1 行,而不是正在评估的任何行)。
然后它会在当前正在评估的行处停止搜索C1。
最后是= 1。
因此,只有在当前正在评估的行上方没有重复项时,它才会是 TRUE(这意味着它必须是重复项中的第一个)。
结合第一个术语(如果该行有重复项,则只有TRUE),这意味着只有第一个匹配项会被突出显示。
=AND(COUNTIF(C:C, C1) > 1, NOT(COUNTIF(C$1:C1, C1) = 1), COUNTIF(C1:C, C1) >= 1)
说明:第一个表达式与往常一样(TRUE,如果当前计算的行完全重复)。
第二项与最后一项完全相同,只是它被否定了:它周围有一个NOT()。所以它忽略了第一次出现。
最后,第三个词提取重复项 2、3 等。COUNTIF(C1:C, C1) >= 1 从当前评估的行开始搜索范围(C1:C 中的 C1)。然后它只评估TRUE(应用突出显示)如果在这个下面有一个或多个重复(包括这个):>= 1(它必须是>=而不仅仅是>,否则最后一个重复被忽略)。
【讨论】:
我尝试了所有选项,但都没有成功。
只有谷歌应用脚本帮助了我。
来源:https://ctrlq.org/code/19649-find-duplicate-rows-in-google-sheets
在文档的顶部
1.- 转到 工具 > 脚本编辑器
2.- 设置脚本的名称
3.- 粘贴此代码:
function findDuplicates() {
// List the columns you want to check by number (A = 1)
var CHECK_COLUMNS = [1];
// Get the active sheet and info about it
var sourceSheet = SpreadsheetApp.getActiveSheet();
var numRows = sourceSheet.getLastRow();
var numCols = sourceSheet.getLastColumn();
// Create the temporary working sheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
var newSheet = ss.insertSheet("FindDupes");
// Copy the desired rows to the FindDupes sheet
for (var i = 0; i < CHECK_COLUMNS.length; i++) {
var sourceRange = sourceSheet.getRange(1,CHECK_COLUMNS[i],numRows);
var nextCol = newSheet.getLastColumn() + 1;
sourceRange.copyTo(newSheet.getRange(1,nextCol,numRows));
}
// Find duplicates in the FindDupes sheet and color them in the main sheet
var dupes = false;
var data = newSheet.getDataRange().getValues();
for (i = 1; i < data.length - 1; i++) {
for (j = i+1; j < data.length; j++) {
if (data[i].join() == data[j].join()) {
dupes = true;
sourceSheet.getRange(i+1,1,1,numCols).setBackground("red");
sourceSheet.getRange(j+1,1,1,numCols).setBackground("red");
}
}
}
// Remove the FindDupes temporary sheet
ss.deleteSheet(newSheet);
// Alert the user with the results
if (dupes) {
Browser.msgBox("Possible duplicate(s) found and colored red.");
} else {
Browser.msgBox("No duplicates found.");
}
};
4.- 保存并运行
在不到 3 秒的时间里,我的重复行被着色了。只需复制脚本即可。
如果您不了解 Google Apps 脚本,此链接可能会对您有所帮助:
https://zapier.com/learn/google-sheets/google-apps-script-tutorial/
https://developers.google.com/apps-script/overview
我希望这会有所帮助。
【讨论】:
从“文本包含”下拉菜单中选择“自定义公式为:”,然后写入:“=countif(A:A, A1) > 1”(不带引号)
我完全按照 zolley 的建议做了,但应该做些小修正:使用 “自定义公式是” 而不是 “文本包含”。 然后条件渲染就可以工作了。
【讨论】:
Text Contains,因此用户通常会单击该选项来访问下拉菜单。
虽然zolley's answer 非常适合这个问题,但这里有一个适用于任何范围的更通用的解决方案,以及解释:
=COUNTIF($A$1:$C$50, INDIRECT(ADDRESS(ROW(), COLUMN(), 4))) > 1
请注意,在此示例中,我将使用范围 A1:C50。
第一个参数 ($A$1:$C$50) 应替换为您要突出显示重复项的范围!
突出显示重复项:
Format > Conditional formatting...
Apply to range 下,选择应应用规则的范围。Format cells if 的下拉列表中选择Custom formula is。为什么会起作用?
COUNTIF(range, criterion),会将range 中的每个单元格与criterion 进行比较,其处理方式与公式类似。如果没有提供特殊运算符,它将范围内的每个单元格与给定单元格进行比较,并返回找到的与规则匹配的单元格数(在本例中为比较)。我们使用固定范围(带有$ 符号),以便我们始终查看完整范围。
第二个块,INDIRECT(ADDRESS(ROW(), COLUMN(), 4)),将返回当前单元格的内容。如果将它放在单元格内,文档会抱怨循环依赖,但在这种情况下,公式会像在单元格中一样被评估,而不需要更改。
ROW() 和COLUMN() 将分别返回给定单元格的行number 和列number。如果不提供参数,则返回当前单元格(这是从 1 开始的,例如,B3 将返回 3 代表 ROW(),返回 2 代表 COLUMN())。
然后我们使用:ADDRESS(row, column, [absolute_relative_mode]) 将数字行和列转换为单元格引用(如 B3。请记住,当我们在单元格的上下文中时,我们不知道它的地址或内容,我们需要内容以进行比较)。第三个参数负责格式化,4 返回格式化 INDIRECT() 喜欢。
INDIRECT(),将获取一个单元格reference 并返回其内容。在这种情况下,当前单元格的内容。然后回到开头,COUNTIF() 将针对我们的单元格测试范围内的每个单元格,并返回计数。
最后一步是让我们的公式返回一个布尔值,将其设为逻辑表达式:COUNTIF(...) > 1。使用> 1 是因为我们知道至少有一个单元格与我们的单元格相同。那是我们的单元格,它在范围内,因此将与自身进行比较。因此,要表示重复,我们需要找到 2 个或更多与我们匹配的单元格。
来源:
【讨论】:
*)和另一个检查,所以沿着((COUNTIF(...))*(NOT(ISBLANK(INDIRECT(...current cell...))))) 的行。这是我在手机上能做的最好的事情。 :)
$A$1:$C$50 - 根据有问题的列。与 zolley 相比,我更喜欢这种更通用的方法。