如何在Google Apps脚本中的不同电子表格之间复制条件格式

时间:2020-09-14 06:27:15

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

我有多个标题为:星期一,星期二,星期三,星期四,星期五和星期六的电子表格。每个电子表格都有3个标题为:计划,课程和指导的工作表。每个电子表格的格式几乎相同,唯一的区别是“计划!”的前8列和后8列中合并单元格的高度。

我会不断更改电子表格中的值,因此,尽管每个电子表格的格式相同,但它们的值却大不相同。我也不想将所有工作表合并到一个电子表格中,因为我将要浏览近20个选项卡,这使它非常混乱且耗时。

我的问题是当我需要在每张纸上进行更改时。我的工作表需要根据自己的需要全年进行更新和更改,就像您期望的那样,必须打开每个工作表并在每个工作表中进行相同的更改会非常烦人。我发现IMPORTRANGE函数在保持工作表之间的标题行和其他常量更新方面非常有用,但是我没有找到一种方法来进行条件格式化,这是最令人讨厌的更改。

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

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

这是我写的:

customer_rank

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

现在,我不知道我想做的事情是否实际上可行,但是我希望对我想做的事情有一些解决方法。我在代码方面的经验很少,但是我开始对它有更多的了解(这一切都要归功于Stack Overflow的这个很棒的社区!)。您能给我任何帮助,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

解决方案:

  • 尽管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的条件格式规则相同。

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