谷歌应用程序脚本如何在其他工作表中复制条件格式

时间:2019-02-27 14:58:21

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

我有一个Google电子表格,其中包含数十种关于格式的相同工作表。我必须将相同的条件格式应用于所有工作表,因此我想在第一张工作表上手动进行设置,然后使用Google Apps脚本将条件格式应用于所有其他工作表。我已经完成了下面的编码,但是我得到了一个错误,翻译为法文:“条件格式设置规则不能引用其他工作表”。

function myFunction() {
  var my_spreadsheet = SpreadsheetApp.getActiveSpreadSheet(); 

  var all_sheets = my_spreadsheet.getAllSheets();  
  var source_sheet = all_sheets[0];  
  var source_rules = source_sheet.getConditionalFormatRules();

  var destination_sheet;

  for (var i=1; i<=all_sheets.length-1; i++){
    destination_sheet = all_sheets[i];
    destination_sheet.setConditionalFormatRules(source_rules); 
  }    
}

您知道如何使用Google Apps脚本或其他方式将条件格式从一张纸复制到另一张纸吗?

1 个答案:

答案 0 :(得分:0)

  • 您要将条件格式复制到源工作表中。

如果我的理解是正确的,如何使用表API?我认为出现这种错误的原因可能是条件格式中包含了源工作表的信息。考虑到这一点,我使用Sheets API修改了工作表信息以复制条件格式。我认为您的情况有几个答案。因此,请仅考虑其中之一。

使用表格API时,请在高级Google服务和API控制台上启用表格API。您可以在here上查看有关如何启用Sheets API的信息。

示例脚本:

function myFunction() {
  var my_spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = my_spreadsheet.getId();
  var all_sheets = my_spreadsheet.getSheets();
  var source_sheet = all_sheets[0].getSheetName();

  var srcConditionalFormats = Sheets.Spreadsheets.get(spreadsheetId, {ranges: source_sheet, fields: "sheets/conditionalFormats"});
  all_sheets.shift();
  var cf = srcConditionalFormats.sheets[0].conditionalFormats;
  var reqs = all_sheets.reduce(function(ar, e, i) {
    return ar.concat(cf.map(function(f, j) {
      var temp = JSON.parse(JSON.stringify(f));
      temp.ranges = temp.ranges.map(function(g, k) {
        g.sheetId = e.getSheetId();
        return g;
      });
      return {addConditionalFormatRule: {rule: temp}};
    }));
  }, []);
  Sheets.Spreadsheets.batchUpdate({requests: reqs}, spreadsheetId);
}

在此脚本中,运行以下流程。

  1. 使用Spreadsheets.get()从源工作表中检索条件格式对象。
    • 从脚本中,它假设源工作表是工作表的第一索引。
  2. Spreadsheets.batchUpdate()创建请求正文。
    • 这时,图纸信息(sheetId)被修改。
  3. 使用Spreadsheets.batchUpdate()请求创建的请求正文。

注意:

  • 您的脚本中,SpreadsheetApp.getActiveSpreadSheet()处有拼写错误,my_spreadsheet.getAllSheets()处未使用任何方法。但是在您的问题中,据记载发生了The conditional formating rule can't refer to antoher sheet错误。从这种情况来看,我认为这可能是由于您发布问题时写错了。

参考文献:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。