【问题标题】:How to copy conditional formatting between different spreadsheets in Google Apps Script如何在 Google Apps 脚本中的不同电子表格之间复制条件格式
【发布时间】:2020-12-31 20:50:13
【问题描述】:

我有多个电子表格,标题为:星期一、星期二、星期三、星期四、星期五和星期六。每个电子表格都有 3 张表,标题为:Plan、Class 和 Coach。每个电子表格的格式几乎相同,唯一的区别是“Plan!”的第一列和最后 8 列中合并单元格的高度。

我不断更改电子表格中的值,因此虽然每个电子表格的格式相同,但值却大不相同。我也不想将所有工作表合并到一个电子表格中,因为我将有近 20 个选项卡可供浏览,这会造成非常混乱和耗时。

我遇到的问题是当我需要更改每张纸上的某些内容时。我的工作表需要是我可以根据我的需要全年更新和更改的东西,并且正如您所料,必须打开每张单独的工作表并在每个工作表中更改相同的内容可能会非常烦人。我发现 IMPORTRANGE 函数在保持我的标题行和其他常量在工作表之间更新方面非常有用,但我还没有找到一种方法来使用条件格式,这是最烦人的必须更改的事情。

我在每张工作表上都有多个条件格式规则,我真的需要一种方法来让每张工作表在我更改或添加规则时自动更新“星期一”。

  • 我只想复制条件格式规则。
  • 每当我更新“星期一”的条件格式规则时,我都需要更新每张工作表

这是我写的:

function copyConditional(){
  var target = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Plan");
  var source = SpreadsheetApp.openById("1RJVmCimFh24NbAlENJvH5pT3zRq_KLJmFdEWqUN_Fo8").getSheetByName("Plan");
  var targetR = target.getRange('I3:AN59');
  var sourceR = source.getRange('I3:AN59');
  
  sourceR.copyTo(targetR,SpreadsheetApp.CopyPasteType.PASTE_CONDITIONAL_FORMATTING)
}

当我运行我的代码时,我收到一条错误消息,指出“异常:目标范围和源范围必须在同一个电子表格中。(第 14 行,文件'代码')”

现在,我不知道我想要做的事情是否真的可行,但我希望有一些解决方法来解决我想要做的事情。我的代码经验很少,但我开始了解更多(感谢 Stack Overflow 这个伟大的社区!)。如果您能给我任何帮助,我将不胜感激。

【问题讨论】:

  • 为了消除脚本的错误,我认为这个线程可能有用。 stackoverflow.com/q/59462298/7108653 但我不确定删除错误是否是您问题的直接解决方案。那么,除此之外还有其他问题,我可以问你吗?

标签: google-apps-script google-sheets google-sheets-conditionalformatting


【解决方案1】:

解决方案:

  • 虽然 Tanaike 的 solution 可能有效,但我在此提出一个 更直接的方法。

  • 以下解决方案使用ConditionalFormatRuleBuilder 类:

       function copyConditional(){
          var target = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Plan");
          var source = SpreadsheetApp.openById("1RJVmCimFh24NbAlENJvH5pT3zRq_KLJmFdEWqUN_Fo8").getSheetByName("Plan");
    
          var rules = source.getConditionalFormatRules();
          target.setConditionalFormatRules(rules);
        }
    

限制:

  • 这种方法复制所有的条件格式规则 源工作表计划目标工作表计划,可能不是您想要的。
  • 但是,如果您没有在工作表中使用多个条件格式规则,此解决方案可能仍然适用。

替代方法:

为了复制特定范围的条件格式,您需要使用ConditionalFormatRule 类来获取应用条件格式规则的范围。因为,我无权访问您的工作表,也无法自己进行测试,所以我不知道您使用了多少种不同的条件格式规则以及在哪些范围内。作为起点,这是一个包含所有规则以及这些规则在源工作表中应用的范围的数组:

var rules = source.getConditionalFormatRules();

然后您遍历范围以准确找到哪些范围包含哪些规则:

var rule = source.getConditionalFormatRules()[0];
var ranges = rule.getRanges();
for (int i = 0; i < ranges.length; i++) {
  Logger.log(ranges[i].getA1Notation());
}

替代方案:

基于后者,您可以确定要复制到目标文件的规则,而不是复制所有规则。例如,如果范围为I3:AN59,则将条件格式规则复制到目标工作表:

function copyConditional(){

var target = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Plan");
var source = SpreadsheetApp.openById("1RJVmCimFh24NbAlENJvH5pT3zRq_KLJmFdEWqUN_Fo8").getSheetByName("Plan");

var rules = source.getConditionalFormatRules();

for (let i = 0 ; i < rules.length; i++){

var ranges = rules[i].getRanges();
for (let j = 0; j < ranges.length; j++) {
  if(ranges[j].getA1Notation() == 'I3:AN59'){
   target.setConditionalFormatRules([rules[i]]);
 }
}
}
}

此方法假定条件格式规则与I3:AN59 相同。

希望我的回答对你有所帮助。

【讨论】:

  • 谢谢!我使用了您提供的第一个解决方案。它完全按照我的需要工作。您建议的其他替代方案也被证明非常有用,我将在我即将完成的其他项目中使用它们。再次感谢您!
  • @QuinceyFrewin 我很高兴该解决方案对您有用 :)
  • 嘿马里奥,我已经尝试了这两种解决方案,但收到错误“条件格式规则无法引用不同的工作表。”有任何想法吗?有没有办法删除/过滤所引用工作表的身份?我应该发布一个新问题吗?我也在尝试复制整个选项卡的条件格式,而不仅仅是一个范围。
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多