首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google如何设置多个范围的条件格式

Google如何设置多个范围的条件格式
EN

Stack Overflow用户
提问于 2021-06-14 08:04:12
回答 1查看 219关注 0票数 1

我正在想办法解决这个问题。我试图使用'for循环‘来设置一个函数的多个范围,但得到了错误消息。

异常:参数(字符串)与SpreadsheetApp.ConditionalFormatRuleBuilder.setRanges.‘的方法签名不匹配

这是我的密码。

代码语言:javascript
复制
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的范围时,它起了作用。

这是我试过的密码。

你能帮我弄清楚吗?如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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对象。我认为这可能是你出问题的原因。
  • 在您的情况下,下面的流如何?
    1. 将每个范围放入rules of rules = sheet.getConditionalFormatRules()数组中。
      • 为此,在我的回答中,我使用了RangeList。

代码语言:javascript
复制
1. Use `rules` with `sheet.setConditionalFormatRules(rules)` put outside of the loop.

当以上要点反映到您的脚本中时,如下所示。

修改脚本:

代码语言:javascript
复制
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();,请修改上面的脚本。
  • 在这个答案中,我使用了您脚本中的范围和公式。如果您的实际情况与他们不同,请修改上面的脚本。请小心这个。

参考文献:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67966777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档