我正在想办法解决这个问题。我试图使用'for循环‘来设置一个函数的多个范围,但得到了错误消息。
异常:参数(字符串)与SpreadsheetApp.ConditionalFormatRuleBuilder.setRanges.‘的方法签名不匹配
这是我的密码。
function myFunction() {
let columnStart = ['d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','aa','ab','ac']
let columnEnd = ['d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','aa','ab','ac','ad','ae','af','ag','ah','ai','ai','ai','ai','ai','ai','ai','ai','ai']
let range='';
let formula ='';
let rule = '';
let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheetname')
for(let z=0; z<columnStart.length;z++){
formula = '=sum($'+columnStart[z]+'6:$'+columnEnd[z+6]+'6)>=40'
range += '[';
for(let i=3; i<25; i++){
if(i!=24){
range += "sheet.getRange('"+columnStart[z]+2*i+':'+columnEnd[z+6]+2*i+"'),"
}else{
range += "sheet.getRange('"+columnStart[z]+2*i+':'+columnEnd[z+6]+2*i+"')"
}
}
range += "]"
Logger.log(range)
rule = SpreadsheetApp.newConditionalFormatRule().whenFormulaSatisfied(formula).setBackground('#f4cccc').setRanges(range).build();
rules = sheet.getConditionalFormatRules();
rules.push(rule);
sheet.setConditionalFormatRules(rules);
range ="";
formula='';
}
}首先,我认为从for循环得到的范围可能有问题。但是,当从Logger.log()复制范围并将该范围粘贴到setRange的范围时,它起了作用。
这是我试过的密码。

你能帮我弄清楚吗?如有任何建议,将不胜感激。
发布于 2021-06-14 09:02:14
我相信你的目标如下。
for (let i = 3; i < 25; i++) {,,,}的for循环创建。const formula = '=sum($' + columnStart[z] + '6:$' + columnEnd[z + 6] + '6)>=40';创建。修改要点:
range of Logger.log(range)似乎是字符串值。但是当使用setRanges(range)时,需要range作为Range对象。我认为这可能是你出问题的原因。rules of rules = sheet.getConditionalFormatRules()数组中。1. Use `rules` with `sheet.setConditionalFormatRules(rules)` put outside of the loop.当以上要点反映到您的脚本中时,如下所示。
修改脚本:
function myFunction() {
let columnStart = ['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'aa', 'ab', 'ac'];
let columnEnd = ['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'ag', 'ah', 'ai', 'ai', 'ai', 'ai', 'ai', 'ai', 'ai', 'ai', 'ai'];
let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheetname');
const rules = []; // sheet.getConditionalFormatRules();
for (let z = 0; z < columnStart.length; z++) {
const formula = '=sum($' + columnStart[z] + '6:$' + columnEnd[z + 6] + '6)>=40';
const rangeList = [];
for (let i = 3; i < 25; i++) {
rangeList.push(columnStart[z] + 2 * i + ':' + columnEnd[z + 6] + 2 * i);
}
const ranges = sheet.getRangeList(rangeList).getRanges();
const rule = SpreadsheetApp.newConditionalFormatRule().whenFormulaSatisfied(formula).setBackground('#f4cccc').setRanges(ranges).build();
rules.push(rule);
}
sheet.setConditionalFormatRules(rules);
}注意:
rules = sheet.getConditionalFormatRules();。在这种情况下,每次运行都会添加规则。在这种情况下,我认为const rules = [];可能比rules = sheet.getConditionalFormatRules();更合适。在这个答案中,使用了const rules = [];。如果您想使用rules = sheet.getConditionalFormatRules();,请修改上面的脚本。参考文献:
https://stackoverflow.com/questions/67966777
复制相似问题