【问题标题】:Script: How to retrieve conditional formatting rules from specified cells and selectively reapply them to ranges?脚本:如何从指定的单元格中检索条件格式规则并有选择地将它们重新应用于范围?
【发布时间】:2019-11-22 04:35:36
【问题描述】:

在 Google 表格中,将剪切值粘贴到表格中时,可能会破坏该表格中适用条件格式的单元格范围。我的工作表经常被同事编辑,它破坏了条件格式。我正在尝试创建一个脚本,该脚本在编辑时从工作表的每一列复制条件格式规则,然后将这些规则重新应用于粘贴到每一列中的任何单元格。

我是脚本新手,其中大部分内容是由previous question I had posed 中的一位乐于助人的用户编译的。

function onEdit(e) {
  var range = e.range;
  var column = range.getColumn();
  var sheet = range.getSheet();
  range.clearFormat();
  //clears formatting just on data that is pasted into the sheet

  //Get all Sheet rules and iterate through them
  var rules = sheet.getConditionalFormatRules();
  var newRules = [];
  newRules = newRules.concat(rules);

  for(var r = 0; r < rules.length; r++) {
    var rule = rules[r];
    //Get condition for each rule
    var booleanCondition = rule.getBooleanCondition();

    //Get the ranges to which each rule applies and iterate through
    var ranges = rule.getRanges();
    for (var i = 0; i < ranges.length; i++) {
      var ruleColumn = ranges[i].getColumn();  

      //If condition isn't null and edited column is the same as the one in the range, add rule
      if((ruleColumn == column) && (booleanCondition != null)) {
        var newRule = SpreadsheetApp.newConditionalFormatRule()
        .withCriteria(booleanCondition.getCriteriaType(), booleanCondition.getCriteriaValues())
        .setBackground(booleanCondition.getBackground())
        .setRanges([range])
        .build();
        newRules.push(newRule);
     }
   }
 }
 sheet.setConditionalFormatRules(newRules);
}

这会采用工作表中存在的条件格式规则并将它们重新应用到任何已编辑的范围,选择性地将规则仅应用到它们从中复制的列。唯一的问题是它会复制每一列中的每条 规则,包括同一规则的迭代。每次编辑工作表时,应用于已编辑单元格的规则数量呈指数增长,我害怕我的电脑要爆炸了。

有没有办法只从工作表的第一行提取条件格式规则并将它们(按列)应用到编辑的范围?这将阻止我的规则永久扩散的问题,我会非常感谢这一点。

【问题讨论】:

    标签: google-apps-script google-sheets gs-conditional-formatting


    【解决方案1】:

    检索条件格式规则的唯一方法是使用 getConditionalFormatRules 函数 [1] 从工作表中检索所有规则。您可以获取每个规则范围的行并添加条件以过滤仅应用于第一行的条件。

    function onEdit(e) {
      var range = e.range;
      var column = range.getColumn();
      var sheet = range.getSheet();
      range.clearFormat();
      //clears formatting just on data that is pasted into the sheet
    
      //Get all Sheet rules and iterate through them
      var rules = sheet.getConditionalFormatRules();
      var newRules = [];
      newRules = newRules.concat(rules);
    
      for(var r = 0; r < rules.length; r++) {
        var rule = rules[r];
        //Get condition for each rule
        var booleanCondition = rule.getBooleanCondition();
    
        //Get the ranges to which each rule applies and iterate through
        var ranges = rule.getRanges();
        for (var i = 0; i < ranges.length; i++) {
          var ruleColumn = ranges[i].getColumn();  
          var ruleRow = ranges[i].getRow();  
    
          //If condition isn't null and edited column is the same as the one in the range, add rule
          if((ruleColumn == column) && (ruleRow == 1) && (booleanCondition != null)) {
            var newRule = SpreadsheetApp.newConditionalFormatRule()
            .withCriteria(booleanCondition.getCriteriaType(), booleanCondition.getCriteriaValues())
            .setBackground(booleanCondition.getBackground())
            .setRanges([range])
            .build();
            newRules.push(newRule);
         }
       }
     }
     sheet.setConditionalFormatRules(newRules);
    }
    

    如果规则范围从第一行开始(即:'A1'、'A1:A4'、'D1:D10' 等),这将复制规则。

    [1]https://developers.google.com/apps-script/reference/spreadsheet/sheet#getconditionalformatrules

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多