【问题标题】:Change range in ConditionalFormatRuleBuilderConditionalFormatRuleBuilder 中的更改范围
【发布时间】:2021-01-18 19:31:01
【问题描述】:

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

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

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

在文档中还有一个 .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


    【解决方案1】:

    当你使用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;
    }
    

    【讨论】:

    • 感谢您的解释。我知道它必须与 .build() 做一些事情,但我无法理解它。再次感谢!
    【解决方案2】:

    我可能是错的,因为我很少使用格式规则。但在我看来,规则是一组单独的规则项。然后 convertRules() 返回该数组:

    也许这段代码可能是这样的:

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

    我不太确定,所以如果我错了,我很乐意删除答案。

    【讨论】:

    • 感谢您的想法和努力。但是你可以一次传入一个数组。问题出在隐蔽部分。我有一个副本,但该副本具有输入表的范围(包括工作表参考)。那部分我需要以某种方式进行更改..(我会留下您的遮阳篷,以便其他用户可以将其阅读为信息目的)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多