比较同一文档中两个 Google 个工作表中的值

Compare the values in two Google worksheets in the same document

我有一个 Google 传播sheet,其中包含两个作品sheet。每个 sheet 包含一列 URL,后跟 6 列数据。如果值不同,我想在第二个 sheet 上突出显示,理想情况下根据值将特定单元格设置为红色或绿色背景。

Sheet 1

╔═════════════╦═════╦════╦═════╦════╦════╦════╗
║     URL     ║  d1 ║ d2 ║ d3  ║ d4 ║ d5 ║ d6 ║
╠═════════════╬═════╬════╬═════╬════╬════╬════╣
║ example.com ║ 400 ║ 11 ║ 2.2 ║ 50 ║ 60 ║ 70 ║
╚═════════════╩═════╩════╩═════╩════╩════╩════╝

Sheet 2

╔═════════════╦═════╦════╦═════╦════╦════╦════╗
║     URL     ║  d1 ║ d2 ║ d3  ║ d4 ║ d5 ║ d6 ║
╠═════════════╬═════╬════╬═════╬════╬════╬════╣
║ example.com ║ 400 ║ 11 ║ 2.2 ║ 55 ║ 68 ║ 90 ║
╚═════════════╩═════╩════╩═════╩════╩════╩════╝

在这种情况下,我希望突出显示 55、68 和 90 值,因为它们不同于 sheet 1.

我的快速解决方案是将每个 sheet 导出为 CSV,然后 运行 对它们进行比较以突出显示更改,但这并不能完全实现我想要的。

条件格式

条件格式可以做到这一点,但它只能引用同一 sheet 中的单元格。要绕过此限制,请放置诸如

之类的命令
=arrayformula(Sheet1!B2:H2)

第二个 sheet 的某个位置(例如,在单元格 AB2 中)。然后使用规则 "value is not equal to ... =AB2" 对范围 B2:H2 使用条件格式。

(已输入条件格式公式,因为它应该在正在格式化的范围的左上角读取)。

Apps 脚本

另一种避免数据重复的方法是使用 Apps 脚本。这是 根据您描述的情况设置背景的示例代码。请注意,除非将其设置为在每次编辑时触发,否则不会自动更新。

首选上述条件格式化方法。

function compare() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName('Sheet1');
  var sheet2 = ss.getSheetByName('Sheet2');
  var values1 = sheet1.getRange('B2:H2').getValues()[0];
  var values2 = sheet2.getRange('B2:H2').getValues()[0];
  var backgrounds = []; 
  for (var k = 0; k < values1.length; k++) {
    backgrounds.push(values1[k] == values2[k] ? 'white' : 'red');
  }
  sheet2.getRange('B2:H2').setBackgrounds([backgrounds]);
}

概览

在条件格式规则的自定义公式中使用 INDIRECT,如下所示:

=INDIRECT("Sheet1!R"&ROW()&"C"&COLUMN(),false)<>B2

说明

Google Sheets 内置条件格式功能不允许直接使用对不同工作表的引用,但允许使用 INDIRECT。

上述公式包括两个"hacks"。概述中提到了第一个,即 INDIRECT 的使用。第二个 "hacks" 是将 R1C1 符号与 ROW() 和 COLUMN() 一起使用,使条件格式规则与使用硬编码引用相比非常灵活,并且表现得像 "normal" 引用。