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

How to copy conditional formatting between different spreadsheets in Google Apps Script

我有多个跨页sheet,标题为:星期一、星期二、星期三、星期四、星期五和星期六。每个传播sheet 有 3 个 sheet 标题:计划、Class 和教练。每个跨页 sheet 具有 near-identical 格式,唯一的区别是“计划!”的第一列和最后 8 列中合并单元格的高度。

我经常更改我的传播sheets 中的值,因此虽然每个传播sheet 具有相同的格式,但值却大不相同。我也不想将所有 sheet 组合成一个跨页 sheet,因为我将有近 20 个选项卡要浏览,这使它变得非常混乱和耗时。

我遇到的问题是当我需要在每个 sheet 上更改某些内容时。我的 sheet 需要是我可以根据需要全年更新和更改的内容,正如您所期望的那样,必须打开每个人 sheet 并更改相同的内容可能会很烦人在每一个。我发现 IMPORTRANGE 函数对于保持我的 header 行和其他常量在 sheet 之间更新非常有用,但我还没有找到一种方法来使用条件格式,这是最烦人的事情必须改变。

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

这是我写的:

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)
}

当我 运行 我的代码时,我收到一条错误消息,指出“异常:目标范围和源范围必须在相同的范围内sheet。(第 14 行,文件 'Code')"

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

解决方案:

  • 虽然Tanaike的可能有用,但我在这里提出一个 更直接的方法。

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

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

限制:

  • 此方法复制 所有 的条件格式规则 从 sheet 计划 目标 sheet 计划 可能不是您要查找的内容。
  • 但是,如果您没有在 sheet.
  • 中使用多个条件格式规则,此解决方案可能仍然适用于您

替代方法:

为了复制特定范围的条件格式,那么您需要使用ConditionalFormatRule class来获取条件格式应用格式规则。因为,我无权访问您的 sheet 并且无法自己测试,所以我无法判断您使用了多少种不同的条件格式规则以及在哪些范围内。作为起点,这是所有规则的数组以及这些规则在源中应用的范围 sheet:

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,则将条件格式规则复制到目标 sheet:

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

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

这里只是一个想法:我知道你不想要一个 sheet 有一百万个标签,但你可以用一个菜单和一些非常基本的代码来处理它。

在每个 sheet 名称前加上日期缩写或数字(例如 3 表示星期三)。

编写一些代码来显示相关日期并隐藏其他所有内容

使用 onOpen 函数显示今天的标签并隐藏其他所有内容。

还有一大堆菜单选项来显示特定的一天。