我将如何修改应用条件格式以接受单元格列表而不是范围的 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)
. 一起使用
参考文献:
我在这里找到了这个很棒的脚本:
这是最初由 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)
. 一起使用