【问题标题】:Conditional Formatting with Script - Highlight Rows based on Custom Formula使用脚本的条件格式 - 基于自定义公式突出显示行
【发布时间】:2021-01-13 00:30:32
【问题描述】:

我有一个使用滚动日历跟踪出勤情况的 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

【问题讨论】:

  • 您能否提供一份您正在处理的电子表格的经过清理的副本(不仅仅是屏幕截图),清楚地显示所需的结果?
  • @lamblichus 这里是链接:docs.google.com/spreadsheets/d/…
  • 那么,您的问题是如何以编程方式应用上述条件格式?
  • 是的,我想每编辑 10 次工作表。目的是防止人们永久更改它们,从而导致错误。还可以修复添加行或列时出现的错误,因为 google 表格会围绕这些调整条件格式,并且不包含它们。
  • 我看到你得到了基于在范围之间复制格式的答案。另一种方法是通过脚本从头开始创建格式规则(而不是从其他范围复制它们)。你认为那会更可取吗?如果是这样的话,我会考虑用这个发布答案。

标签: google-apps-script google-sheets google-sheets-api conditional-formatting


【解决方案1】:

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

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());
  }
});
}

【讨论】:

  • 到目前为止,这个答案运行良好。我将确保它在周末正常工作并再测试几天以确保它。
  • 好在该解决方案对您有用。如果您确信它回答了您的问题,请随时将其标记为已接受。
  • @JedBurch 你试过了吗,有用吗?
  • 代码有效,我没有遇到任何问题。感谢您提供简单的解决方案。
  • 很高兴能帮助您解决问题。
【解决方案2】:

为了以编程方式应用条件格式,您可以执行以下操作:

代码sn-p:

function applyConditionalFormat() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets(); // Remove if not all sheets
  //var sheetNames = ['Screening','Quality', ...]; // Uncomment if not all sheets
  //var sheets = sheetNames.map(sheetName => ss.getSheetByName(sheetName)); // Uncomment if not all sheets
  sheets.forEach(sheet => {
    //sheet.clearConditionalFormatRules(); // Uncomment if want to remove previous rules
    var rules = [];
    rules.push(createRule(sheet, "A1:NH", "=A$1=TODAY()", "#b7e1cd"));
    rules.push(createRule(sheet, "C2:NH", "=$B2>=10", "#cc0000"));
    rules.push(createRule(sheet, "C2:NH", "=$B2>=8", "#ea9999"));
    rules.push(createRule(sheet, "C2:NH", "=$B2>=5", "#f6b26b"));
    rules.push(createRule(sheet, "C2:NH", "=$B2>=2", "#ffe599"));
    sheet.setConditionalFormatRules(rules);
  });
}

function createRule(sheet, rangeNotation, formula, color) {
  var range = sheet.getRange(rangeNotation);
  var rule = SpreadsheetApp.newConditionalFormatRule()
    .whenFormulaSatisfied(formula)
    .setBackground(color)
    .setRanges([range])
    .build();
  return rule;
}

注意:

  • 我假设您希望将此应用于电子表格中的所有工作表。如果不是这种情况,请取消注释代码 sn-p 的第 4 行和第 5 行,删除第 3 行,并将所有需要的工作表名称写入第 4 行的数组中。
  • 如果您不希望每次运行时都堆积条件,请取消注释行 sheet.clearConditionalFormatRules();

【讨论】:

  • @lamblichus 我还没有机会尝试这个,但如果它是我想要的,我会告诉你。
猜你喜欢
  • 2022-07-07
  • 1970-01-01
  • 2022-08-16
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多