【问题标题】:google apps script how to copy conditional formating in antoher sheet谷歌应用程序脚本如何在另一张表中复制条件格式
【发布时间】:2019-02-27 14:58:21
【问题描述】:

我有一个 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 脚本或任何其他方式将条件格式从一张表复制到另一张表吗?

【问题讨论】:

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


    【解决方案1】:
    • 您希望将源工作表中的条件格式复制到所有其他工作表。

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

    当您使用 Sheets API 时,请在 Google 高级服务和 API 控制台中启用 Sheets 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 的错误。从这种情况来看,我认为这可能是由于您发布问题时写错了。

    参考资料:

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

    【讨论】:

    • 好的,谢谢你的详细回答,我会看看 Sheets API。当我发布这个问题时,这两个拼写错误只是一个复制错误,在我的原始代码中,我有很好的 getActiveSpreadSheet 和 my_spreadsheet.getSheets()。
    • @Thomas Perrin 感谢您的回复。在我的环境中,我可以确认脚本有效。但如果这在您的环境中不起作用,我深表歉意。
    • @Thomas Perrin 我的回答是否向您展示了您想要的结果?你能告诉我吗?这对我学习也很有用。如果这可行,与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果您对我的回答有疑问,我深表歉意。到时候,可以问一下你现在的情况吗?我想学习解决你的问题。
    • 我这周不上班,我打算下周做这个!
    • @Thomas Perrin 感谢您的回复。我想等待结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多