首页 > 解决方案 > 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 的范围时,它起作用了。

这是我尝试过的代码。

在此处输入图像描述

你能帮我解决这个问题吗?任何意见,将不胜感激。

标签: google-apps-scriptgoogle-sheets

解决方案


我相信你的目标如下。

  • 您想使用每个公式为每个范围设置条件格式规则。
  • 范围是由 for 循环创建的for (let i = 3; i < 25; i++) {,,,}
  • 公式由const formula = '=sum($' + columnStart[z] + '6:$' + columnEnd[z + 6] + '6)>=40';.

修改点:

  • 当我看到您的脚本时,似乎rangeofLogger.log(range)是字符串值。但是在setRanges(range)使用的时候,range需要是Range对象。我认为这可能是您的问题的原因。
  • 而且,在您的情况下,以下流程如何?
    1. 将每个范围放入 rules.rules = sheet.getConditionalFormatRules()
      • 为此,在我的回答中,我使用了 RangeList。
    2. rulessheet.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();,请修改上面的脚本。

  • 在这个答案中,我使用了脚本中的范围和公式。如果您的实际情况与他们不同,请修改上述脚本。请注意这一点。

参考:


推荐阅读