Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 脚本:如何在编辑时将条件格式规则复制并重新应用到某个范围?_Google Apps Script_Google Sheets_Gs Conditional Formatting - Fatal编程技术网

Google apps script 脚本:如何在编辑时将条件格式规则复制并重新应用到某个范围?

Google apps script 脚本:如何在编辑时将条件格式规则复制并重新应用到某个范围?,google-apps-script,google-sheets,gs-conditional-formatting,Google Apps Script,Google Sheets,Gs Conditional Formatting,在Google工作表中,当您粘贴新值时,条件格式应用于的单元格范围可能会改变。我正在寻找一个脚本,它将复制工作表中的条件格式,并在人们粘贴数据时将其重新应用到新的单元格 我实际上不怎么写脚本,但我偷别人的脚本,然后把它们放在一起,直到它们功能模糊为止。以下是我目前偷的东西: function onEdit(e) { var range = e.range; var sheet = range.getSheet(); range.clearFormat(); //clears fo

在Google工作表中,当您粘贴新值时,条件格式应用于的单元格范围可能会改变。我正在寻找一个脚本,它将复制工作表中的条件格式,并在人们粘贴数据时将其重新应用到新的单元格

我实际上不怎么写脚本,但我偷别人的脚本,然后把它们放在一起,直到它们功能模糊为止。以下是我目前偷的东西:

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

  var rules = sheet.getConditionalFormatRules();
  var newRules = [];
  for(var r = 0; r < rules.length; r++) {
    var booleanCondition = rules[r].getBooleanCondition();
    if(booleanCondition != null) {
      var rule = SpreadsheetApp.newConditionalFormatRule()
      .withCriteria(booleanCondition.getCriteriaType(), booleanCondition.getCriteriaValues())
      .setBackground(booleanCondition.getBackground())
      .setRanges([sheet.getRange("A:A"),sheet.getRange("C:C")])
      .build();
      newRules.push(rule);
      sheet.setConditionalFormatRules(newRules);
    }
  }
}
函数onEdit(e){
var范围=e范围;
var sheet=range.getSheet();
range.clearFormat();
//仅清除粘贴到图纸中的数据的格式设置
var rules=sheet.getConditionalFormatures();
var newRules=[];
for(var r=0;r
当然,问题是我正在获取该工作表的所有条件格式规则,并将它们全部应用于两列(A:A和C:C)。无论这些规则应用于哪些列,都将应用这些规则

有人能建议一种方法来复制预先存在的条件格式规则,并将它们重新应用到我复制它们的列吗?

setRanges()函数[1]是您需要设置要应用格式的范围的地方。在本例中,我使用了从onEdit触发器[2]的事件对象获得的编辑范围:

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);
}
[1]


[2]

谢谢你,安德烈斯!不幸的是,我仍然遇到同样的问题。无论我使用setRanges()函数指定什么范围,整个工作表的条件格式规则都将应用于该范围。我正在寻找一种解决方案,它从每一列获取条件格式规则,并在添加数据时将它们重新应用到同一列。你对……有什么见解吗。。。比如说,如何按列有选择地检索条件格式规则并按列重新应用它们?我只是使用每个规则的函数编辑了答案,并基于此将规则设置为已编辑的单元格。如果需要调整代码,请查看我提供的文档。如果它帮助你,请考虑接受正确的答案,这肯定有帮助。现在,条件格式正确地应用于每个列,但它会创建每个规则的新迭代,脚本将获得该迭代,并在进行编辑时重新应用到下一个范围。每次激活脚本时,同一规则的迭代次数都呈指数增长。是否有办法仅从指定的单元格(如“A2:Z2”)提取条件格式?这将是一个完美的解决办法。再次感谢!如果你想问一个新问题,我不能在评论中回答。啊,谢谢你帮助我遵守SO的网站规则。我认为你的答案是正确的,你在编写这个脚本和帮助我更有效地理解语言方面帮了我很大的忙。我很感激!
sheet.setConditionalFormatRules(newRules);