对整个 Google Sheet 工作簿使用条件格式来搜索重复项
Use Conditional formatting for whole Google Sheet Workbook to search for duplicates
对整个 Google Sheet 工作簿使用条件格式
目前,我在查看该列的每个作品sheet中对两列使用单色条件格式,如果与该列中的单个作品sheet有相似的匹配,它将突出显示该列黄色.
应用于范围:
C1:C1000
格式规则
格式化单元格如果...
=if(C1<>"",Countif(C:C,left(C1,18)& "*") > 1)
格式样式
我选择了黄色
我对 D 列做完全相同的事情
现在我有超过 10 个工作sheets,而且它每周都在增长我发现 sheets 之间发生了重复,因为条件格式只适用于每个 sheet.
我有没有办法让 Google Sheet 通过查看 C 列和 D 列有条件地格式化整个工作簿,如果有匹配项,它会以黄色突出显示.
如果有人可以实际为我编写脚本或宏(因为我不知道该怎么做),我将不胜感激。或者,如果有人知道一种简单的方法来完成我需要完成的工作,我将不胜感激。
作为示例,这里有一个工作簿可以向您展示我的意思。
在 google 工作簿中,在 Sheet 标有“Visual Test Current”的标签中,这是我目前能够按照描述进行设置的内容。它完美运行。
在标有“Visual Test Sheet 1”的 sheet 中,它在个人 sheet 本身上运行良好,但它不会查看“Visual Test Current”,如果有是基于公式 "=if(D1<>"",Countif(D:D,left(D1,18)& "") > 1)" 的匹配
和
=if(E1<>"",Countif(E:E,left(E1,18)& "") > 1)
它没有格式化单元格来告诉我之前的 sheet 中存在重复匹配项。这就是我想弄清楚该怎么做。
我如何 get/create 一个公式,通过 Google 工作簿中的每个 sheet 查看这两列,如果有基于 Countif 参数的匹配,它会格式化单元格变为黄色,向我突出显示 Google 工作簿中的 sheet 某处有该单元格的副本。
这是共享测试文档的 link,可帮助您了解我正在尝试做的事情。
解决方案:
- Return 所有 sheet 通过 Spreadsheet.getSheets() 并遍历它们。
- 对于每个 sheet,使用 ConditionalFormatRuleBuilder.
创建 C 列和 D 列的条件格式规则
- 通过Sheet.setConditionalFormatRules 添加条件格式规则。
代码示例:
const EXCLUDED_SHEETS = ["Sheets that won't be updated"];
function updateAllSheets() {
const ss = SpreadsheetApp.getActive();
const sheets = ss.getSheets().filter(sheet => !EXCLUDED_SHEETS.includes(sheet.getName()));
sheets.forEach(sheet => {
const cRange = sheet.getRange("C1:C" + sheet.getLastRow());
const cRule = SpreadsheetApp.newConditionalFormatRule()
.whenFormulaSatisfied("=if(C1<>\"\",Countif(C:C,left(C1,18)& \"*\") > 1)")
.setBackground("yellow")
.setRanges([cRange])
.build();
const dRange = sheet.getRange("D1:D" + sheet.getLastRow());
const dRule = SpreadsheetApp.newConditionalFormatRule()
.whenFormulaSatisfied("=if(D1<>\"\",Countif(D:D,left(D1,18)& \"*\") > 1)")
.setBackground("yellow")
.setRanges([dRange])
.build();
sheet.setConditionalFormatRules([cRule,dRule]);
});
}
自动执行:
如果你想自动执行这个,你应该使用触发器。在这里,我看到两个主要选项:
- onEdit触发。使用此触发器,您的函数将在每次用户编辑传播sheet 时执行。要使用此触发器,只需将函数
updateAllSheets
重命名为 onEdit
.
- Time-driven trigger. This kind of trigger would execute periodically (for example, every hour). In contrast with
onEdit
, to use this trigger you have to install it first. To install this, either follow these steps or execute a function like this once (the example below refers to a trigger that executes hourly, check this 查看您可以使用的所有备选方案):
function createTimeDrivenTrigger() {
// Trigger every 1 hour.
ScriptApp.newTrigger('updateAllSheets')
.timeBased()
.everyHours(1)
.create();
对整个 Google Sheet 工作簿使用条件格式 目前,我在查看该列的每个作品sheet中对两列使用单色条件格式,如果与该列中的单个作品sheet有相似的匹配,它将突出显示该列黄色.
应用于范围: C1:C1000
格式规则 格式化单元格如果... =if(C1<>"",Countif(C:C,left(C1,18)& "*") > 1)
格式样式 我选择了黄色
我对 D 列做完全相同的事情
现在我有超过 10 个工作sheets,而且它每周都在增长我发现 sheets 之间发生了重复,因为条件格式只适用于每个 sheet.
我有没有办法让 Google Sheet 通过查看 C 列和 D 列有条件地格式化整个工作簿,如果有匹配项,它会以黄色突出显示.
如果有人可以实际为我编写脚本或宏(因为我不知道该怎么做),我将不胜感激。或者,如果有人知道一种简单的方法来完成我需要完成的工作,我将不胜感激。
作为示例,这里有一个工作簿可以向您展示我的意思。 在 google 工作簿中,在 Sheet 标有“Visual Test Current”的标签中,这是我目前能够按照描述进行设置的内容。它完美运行。
在标有“Visual Test Sheet 1”的 sheet 中,它在个人 sheet 本身上运行良好,但它不会查看“Visual Test Current”,如果有是基于公式 "=if(D1<>"",Countif(D:D,left(D1,18)& "") > 1)" 的匹配 和 =if(E1<>"",Countif(E:E,left(E1,18)& "") > 1)
它没有格式化单元格来告诉我之前的 sheet 中存在重复匹配项。这就是我想弄清楚该怎么做。
我如何 get/create 一个公式,通过 Google 工作簿中的每个 sheet 查看这两列,如果有基于 Countif 参数的匹配,它会格式化单元格变为黄色,向我突出显示 Google 工作簿中的 sheet 某处有该单元格的副本。
这是共享测试文档的 link,可帮助您了解我正在尝试做的事情。
解决方案:
- Return 所有 sheet 通过 Spreadsheet.getSheets() 并遍历它们。
- 对于每个 sheet,使用 ConditionalFormatRuleBuilder. 创建 C 列和 D 列的条件格式规则
- 通过Sheet.setConditionalFormatRules 添加条件格式规则。
代码示例:
const EXCLUDED_SHEETS = ["Sheets that won't be updated"];
function updateAllSheets() {
const ss = SpreadsheetApp.getActive();
const sheets = ss.getSheets().filter(sheet => !EXCLUDED_SHEETS.includes(sheet.getName()));
sheets.forEach(sheet => {
const cRange = sheet.getRange("C1:C" + sheet.getLastRow());
const cRule = SpreadsheetApp.newConditionalFormatRule()
.whenFormulaSatisfied("=if(C1<>\"\",Countif(C:C,left(C1,18)& \"*\") > 1)")
.setBackground("yellow")
.setRanges([cRange])
.build();
const dRange = sheet.getRange("D1:D" + sheet.getLastRow());
const dRule = SpreadsheetApp.newConditionalFormatRule()
.whenFormulaSatisfied("=if(D1<>\"\",Countif(D:D,left(D1,18)& \"*\") > 1)")
.setBackground("yellow")
.setRanges([dRange])
.build();
sheet.setConditionalFormatRules([cRule,dRule]);
});
}
自动执行:
如果你想自动执行这个,你应该使用触发器。在这里,我看到两个主要选项:
- onEdit触发。使用此触发器,您的函数将在每次用户编辑传播sheet 时执行。要使用此触发器,只需将函数
updateAllSheets
重命名为onEdit
. - Time-driven trigger. This kind of trigger would execute periodically (for example, every hour). In contrast with
onEdit
, to use this trigger you have to install it first. To install this, either follow these steps or execute a function like this once (the example below refers to a trigger that executes hourly, check this 查看您可以使用的所有备选方案):
function createTimeDrivenTrigger() {
// Trigger every 1 hour.
ScriptApp.newTrigger('updateAllSheets')
.timeBased()
.everyHours(1)
.create();