首页 > 解决方案 > 使用脚本的条件格式 - 基于自定义公式突出显示行

问题描述

我有一个使用滚动日历跟踪出勤情况的 Google 表格。它有多个工作表,我希望每个工作表都具有相同的条件格式。最初这似乎很容易,我写了一些脚本,让它遍历所有工作表,以将一个单元格中的格式复制到整个工作表。它运行良好,直到它以某种方式删除了除一种之外的所有条件格式,=A$1=TODAY(). 我一直在试图确定它为什么这样做以及如何解决它。我尝试在非移动单元格 (A1) 中设置条件格式,但随后公式无法正常工作。他们最终突出显示了错误的行。我也一直在查看 Google Sheets API Sheets,但在实现它时遇到了麻烦。有没有办法可以编写脚本来设置这些条件格式规则以及如何设置?任何帮助表示赞赏。

我已经提供了我正在尝试完成的工作以及我一直在使用的脚本和参考的图片,所有这些都在下面。
带有格式的示例电子表格

工作表的基本布局如图所示。图片还描绘了我试图用条件格式完成的事情。

格式规则如下(并按此顺序):

  1. 适用范围:A1:NH(整张纸)
    自定义公式为:=A$1=TODAY()
    背景颜色:默认绿色背景 (#b7e1cd)

  2. 适用范围:C2:NH(除第 1 行和 A & B 列外的所有内容)
    自定义公式为:=$B2>=10
    背景颜色:深红色 1 (#cc0000)

  3. 适用范围:C2:NH
    自定义公式为:=$B2>=8
    背景颜色:浅红色 2 (#ea9999)

  4. 适用范围:C2:NH
    自定义公式为:=$B2>=5
    背景颜色:浅橙色 1 (#f6b26b)

  5. 适用范围:C2:NH
    自定义公式为:=$B2>=2
    背景颜色:浅黄色 2 (#ffe599)

B 列中的公式是 =SUM($C2:2) 自动填充到每一行。

我当前的脚本是

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheets();
  var sheetNames = [ 'Screening','Maint - PrePress','Vulcan','Sullivan','Packing','Materials','Shipping','Labels','Embroidery','PadPrint','Quality'];
  
  sh.forEach(sheet=> {
    if(sheetNames.includes(sheet.getName())) {
        var rng = sheet.getRange('F2');
        
        rng.copyFormatToRange(sheet, 3, sheet.getLastColumn(), 2, sheet.getLastRow());
  }
});
}

参考:

  1. https://developers.google.com/apps-script/reference/spreadsheet/gradient-condition
  2. https://developers.google.com/apps-script/reference/spreadsheet/conditional-format-rule
  3. https://developers.google.com/sheets/api/guides/conditional-format#apps-script

标签: google-apps-scriptgoogle-sheetsgoogle-sheets-apiconditional-formatting

解决方案


试试这个代码,它可以工作:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheets();

  // The sheet from which we take a sample of the rules
  var sheetS = ss.getSheetByName('Screening'); 
  var rng = sheetS.getRange('F2');

  var sheetNames = ['Screening','Maint - PrePress','Vulcan','Sullivan','Packing','Materials','Shipping','Labels','Embroidery','PadPrint','Quality'];
  
  sh.forEach(sheet=> {
             if(sheetNames.includes(sheet.getName())) {    
    rng.copyFormatToRange(sheet, 3, sheet.getLastColumn(), 2, sheet.getLastRow());
  }
});
}

推荐阅读