我将如何修改应用条件格式以接受单元格列表而不是范围的 Google 脚本

How would I modify a Google Script that applies conditional formatting to accept a list of cells rather than a range

我在这里找到了这个很棒的脚本: 当提供范围时,它将通过脚本将条件格式应用于 Google Sheet。

这是最初由 Iamblichus 编写的脚本

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=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;
}

如果我添加单元格列表,例如: rules.push(createRule(sheet, "C2, C3, C4, H1, H2, H3, N5", "=$B2>=10", "#cc0000"));

我收到一个错误并且失败了。我将如何修改脚本以使其接受单元格列表而不是范围。

谢谢!

从 RangeList 构建 DataValidaton

function dataValidatoinFromAListOfRanges() {
  const ss = SpreadsheetApp.getActive();    
  const sh = ss.getSheetByName("Sheet0");
  const rgl = sh.getActiveRangeList();
  //const rgl = sh.getRangeList("A1","C42","L24","Z1");//alternative way to create rangelist
  let a = rgl.getRanges().map(r => r.getValue());
 let dv = SpreadsheetApp.newDataValidation()
 .requireValueInList(a)
 .build();
 sh.getRange(2,20,10).setDataValidation(dv);
}

我使用了 select 范围列表

Class ConditionalFormatRuleBuilder 的 setRanges(ranges) 的参数是 Range[]。所以当你想使用 "C2, C3, C4, H1, H2, H3, N5" 作为范围时,作为示例修改,下面的修改怎么样?

修改后的脚本:

function applyConditionalFormat() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var rule = createRule(sheet, "C2, C3, C4, H1, H2, H3, N5", "=$B2>=10", "#cc0000");
  sheet.setConditionalFormatRules([rule]);
}

function createRule(sheet, rangeNotation, formula, color) {
  var ranges = sheet.getRangeList(rangeNotation.split(",").map(e => e.trim())).getRanges();
  var rule = SpreadsheetApp.newConditionalFormatRule()
    .whenFormulaSatisfied(formula)
    .setBackground(color)
    .setRanges(ranges)
    .build();
  return rule;
}
  • 本次修改,将createRule(sheet, "C2, C3, C4, H1, H2, H3, N5", "=$B2>=10", "#cc0000")给出的rangeNotation的值转换为Range[]的值。并且,该值与 setRanges(ranges).
  • 一起使用

参考文献: