如何制作[条件格式]脚本?

时间:2014-01-02 18:37:05

标签: javascript google-apps-script google-sheets gs-conditional-formatting

我想,

如果Sheet1 ColumnB = Sheet89 ColumnA

然后匹配的Sheet1 B列单元格将为绿色 这是我的demo sheet

基于某些指导原则,我做了这个,但没有奏效。

function formatting() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var columnB = sheet.getRange(1, 2, sheet.getLastRow()-1, 1);
  var bValues = columnB.getValues();
  var sheet89 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet89');
  var columnO = sheet89.getRange(1, 1, sheet.getLastRow()-1, 1);
  var oValues = columnO.getValues();

        for (var h = 0; h < bValues.length; h++) {
           for (var i = 0; i < oValues.length; i++) {
              if (oValues[i][0] == bValues[h][0]) {
                 sheet.getRange(i + 2, 1, 1, 1).setBackgroundColor('green');
              }
           }
        }
}

2 个答案:

答案 0 :(得分:0)

下面的解决方案将使用sheet1的B列中的值迭代每个单元格,并根据sheet89的A列中的每个值进行检查(尽管您根据getValues函数命名了此ColumnO,但它将从A列中获取值)。

如果找到匹配项,则会将sheet1列B中的单元格变为绿色。在您的示例代码中,您使用i循环变量(遍历sheet89上的行)以使sheet1上的单元格变为绿色。目前尚不清楚哪些细胞想要变绿。我假设它是sheet1上的单元格,所以我将代码更改为

sheet.getRange(h+1, 2).setBackgroundColor('green');

此外,单个单元格的getRange函数只需要2个参数,因此我删除了为单元格颜色着色的行的numRows和numColumns参数。

我不确定为什么bValues和oValues会排除最后一行,但我删除了每一行中的-1,因为如果由于任何原因它在空白工作表上运行,它将导致代码失败。 getLastRow()返回带有值的最后一行,而不是工作表中的下一个空行。如果你想要捕获整个工作表,那么你就不应该使用-1。

function formatting() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');

  var columnB = sheet.getRange(1, 2, sheet.getLastRow(), 1);
  var bValues = columnB.getValues();

  var sheet89 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet89');
  var columnO = sheet89.getRange(1, 1, sheet.getLastRow(), 1);
  var oValues = columnO.getValues();

  for (var h = 0; h < bValues.length; h++) {
     for (var i = 0; i < oValues.length; i++) {

       if (oValues[i][0] == bValues[h][0]) {
         sheet.getRange(h + 1, 2).setBackgroundColor('green');
       }  
     }
  }
}

答案 1 :(得分:0)

条件格式化可以实现我理解的要求(而不是目前示例表中显示的内容)。

在Google Spreadsheets中,由于安全性和授权,跨表格的条件格式化并不像单张表格那样简单。例如,对于速度,您可能希望将Sheet89的内容复制到Sheet1(仅两个单元格)以避免该问题,或者确实编写脚本。至少保持范围尽可能小。

然而,这可能很慢,但需要授权。

请清除Sheet1 ColumnA之后的所有条件格式:

选择Sheet1中的ColumnA,格式,条件格式...,格式化单元格,如果... Custom formula is

=countif(IMPORTRANGE(" k e y ","Sheet89!A:A"),A1)<>0

突出显示您的选择并完成

上面的

k e y代表Sheet89的唯一识别码(看起来像1u4vq8vDne-aKMVdJQPREGOxx7n99FqIb_kuJ_bG-PzM)。

图像显示当前图像的ColumnC中的内容(但在示例的ColumnA中),图像中的F1和F2显示示例的Sheet89的ColumnA中的内容。较浅的棕色已应用条件格式::

SO20889520 example