google-apps-script - Google Appscript - 如何设置具有多个范围的条件格式
问题描述
我试图弄清楚如何解决这个问题。我尝试使用“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 的范围时,它起作用了。
这是我尝试过的代码。
你能帮我解决这个问题吗?任何意见,将不胜感激。
解决方案
我相信你的目标如下。
- 您想使用每个公式为每个范围设置条件格式规则。
- 范围是由 for 循环创建的
for (let i = 3; i < 25; i++) {,,,}
。 - 公式由
const formula = '=sum($' + columnStart[z] + '6:$' + columnEnd[z + 6] + '6)>=40';
.
修改点:
- 当我看到您的脚本时,似乎
range
ofLogger.log(range)
是字符串值。但是在setRanges(range)
使用的时候,range
需要是Range对象。我认为这可能是您的问题的原因。 - 而且,在您的情况下,以下流程如何?
- 将每个范围放入
rules
.rules = sheet.getConditionalFormatRules()
- 为此,在我的回答中,我使用了 RangeList。
rules
与sheet.setConditionalFormatRules(rules)
循环外的 put一起使用。
- 将每个范围放入
当以上几点反映到您的脚本时,它变成如下。
修改后的脚本:
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();
,请修改上面的脚本。在这个答案中,我使用了脚本中的范围和公式。如果您的实际情况与他们不同,请修改上述脚本。请注意这一点。
参考:
推荐阅读
- python - 在 tkinter 中集成绘图会给出更新 idletasks 错误
- sql-server - 我如何改变;A;B;C; 到('A','B','C')?
- docker - mariadb + wordpress 与 docker 的连接错误
- javascript - 在子组件道具上使用父道具
- python - 如何过滤 Python 列表同时保持过滤值为零
- java - 为特定问题添加评论
- javascript - 如何将 HTML与 PHP 函数连接起来?
- pyspark - 加入不均匀的列
- node.js - 如何设置“npm install”期间要使用的环境变量?
- ruby-on-rails - 如何修复'路径“名称”处的json原子丢失'?