首页 > 解决方案 > ConditionalFormatRuleBuilder 中的更改范围

问题描述

目标:更改 ConditionalFormatRuleBuilder.copy() 内的范围(工作表名称,而不是 a1Notation)

错误:条件格式规则不能引用不同的工作表。

我正在尝试使用(不是这样)解释的复制方法。有了副本,我知道我有我需要的新条件格式的所有论据。我唯一需要更改的是工作表名称。添加范围工作正常,但更改/清除我似乎无法弄清楚的范围。我找到了一个帖子,但我希望它更通用。如果您知道要使用的条件,则此示例很好。

在文档中还有一个 .build() 是我需要实现的选项吗?

主功能:

function copyFormattingToTargets() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  //const input = SpreadsheetApp.getUi().prompt("Copy formatting from:").getResponseText();
  const input = 'Data';
  const targets = ['Log','Test'];
  const templateSheet = ss.getSheetByName(input);
  const inputRules = templateSheet.getConditionalFormatRules();
  const rules = convertRules(inputRules,targets);

  targets.forEach(target => {
    const sheet = ss.getSheetByName(target);
    target.clearConditionalFormatRules();
    target.setConditionalFormatRules(rules);
  })
  
}

转换函数:

function convertRules(rules,sheetnames){
  const output = [];
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  sheetnames.forEach(sh => {
    rules.forEach(rule => {
      const copy = rule.copy();
      const newRanges = [];
      const oldRanges = copy.getRanges();
      oldRanges.forEach(range => {
        const buildRange = ss.getSheetByName(sh).getRange(range.getA1Notation());
        newRanges.push(buildRange);
      });
      copy.setRanges(newRanges);
      output.push(copy);
    });
  });
  return output;
}

标签: google-apps-script

解决方案


当您使用ConditionalFormatRuleBuilder.copy()时,它将返回一个ConditionalFormatRuleBuilder类型的数据。

您需要使用ConditionalFormatRuleBuilder.build()根据您修改的范围生成ConditionalFormatRule可用于使用Sheet.setConditionalFormatRules()设置工作表的条件格式规则

示例代码:(将条件格式规则从 Sheet1 复制到 Sheet2 并通过添加列偏移量 2 来更改其范围)

function myFunction() {
  var sourceSh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var targetSh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");

  var rules = sourceSh.getConditionalFormatRules();
  var newRules = [];

  rules.forEach((rule, index) => {
    Logger.log("****rule****");
    var ruleBuilder = rule.copy();
    var ranges = ruleBuilder.getRanges();

    ranges.forEach(range => {
      Logger.log(range.getA1Notation());
    })

    //Select C1:C1000 as new range
    var newRange = targetSh.getRange(1,index + 3,1000,1); 
    ruleBuilder.setRanges([newRange]);

    Logger.log("****new range****");
    var ranges = ruleBuilder.getRanges();

    ranges.forEach(range => {
      Logger.log(range.getA1Notation());
    })
    
    Logger.log("****build modified rule****");
    var newRule = ruleBuilder.build();
    newRules.push(newRule);

  });

  targetSh.setConditionalFormatRules(newRules);
}

输出:

表 1:

在此处输入图像描述

表2:

在此处输入图像描述

您的代码:

function convertRules(rules,sheetnames){
  const output = [];
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  sheetnames.forEach(sh => {
    rules.forEach(rule => {
      const copy = rule.copy();
      const newRanges = [];
      const oldRanges = copy.getRanges();
      oldRanges.forEach(range => {
        const buildRange = ss.getSheetByName(sh).getRange(range.getA1Notation());
        newRanges.push(buildRange);
      });
      copy.setRanges(newRanges);
      copy.build(); // Build conditional format rules based on modified range
      output.push(copy);
    });
  });
  return output;
}

推荐阅读