【问题标题】:Add conditional formatting rule添加条件格式规则
【发布时间】:2016-02-26 17:36:26
【问题描述】:

Google 表格提供了一种很好的交互式方式来以声明方式定义条件格式。有没有办法使用 App Script 编写相同的声明性模型?

我有一个生成许多电子表格的脚本。我使用SheetDataValidation 类设置数据和数据验证规则。但是,我似乎无法对条件格式做同样的事情。我希望找到一个 ConditionalFormattingRule 对象或类似的东西。

注意:我知道可以编写自定义脚本来监听onEdit trigger。但是,需要将该脚本添加到 每个 生成的 电子表格中。此外,像这样的非声明性规则不会出现在 conditional formatting sidebar 中。

我只是想将红色背景应用于没有价值的单元格。

这不可能吗?

【问题讨论】:

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


    【解决方案1】:

    如果适合您的情况,我相信您将不得不在这种情况下使用解决方法。

    您必须在源电子表格中创建一个模板表,其中包含通过条件格式(由您手动完成)格式化的单元格。

    然后您的脚本会将此模板表复制到您的目标电子表格中,然后使用带有 {formatOnly:true} 高级参数的 copyTo 方法将模板表中一个或一系列单元格的格式复制到到您选择的工作表(最后,您可以从目标电子表格中删除此模板工作表)。 (copyTo 方法只在同一个电子表格中从一个范围复制到另一个范围)。

    类似这样的:

    function transferFormatting() {
      var targetSs = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1dLv8V5fKmmxRLi5maLIOgrxVGVaqGGOD7STHbEremQs/edit#gid=0');
      var targetSsDisplaySheet = targetSs.getSheets()[0];
      var sourceSs = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/14RxLXktm0wj-lSFrl5Fas9B-smMYhknFt3-dYQbwH3o/edit#gid=933388275');
      var templateSheet = sourceSs.getSheetByName('Template');
      var targetSsFormatTemplateSheet =  templateSheet.copyTo(targetSs);
    
      targetSsFormatTemplateSheet.getRange("A1").copyTo(targetSsDisplaySheet.getRange("B:D"), {formatOnly:true});
      targetSs.deleteSheet(targetSsFormatTemplateSheet);
    }
    

    【讨论】:

    • 看起来很有希望。但是,范围 copyTo() 的范围始终失败,并显示“我们很抱歉,发生服务器错误。请稍等,然后重试。”
    • 我已将用于试用的脚本(它对我有用)放入电子表格中:docs.google.com/spreadsheets/d/… 试试看,如果它不适合你,请告诉我。
    • 现在有一种传输格式的方法 range.copyFormatToRange(): developers.google.com/apps-script/reference/spreadsheet/… 我之前收到“很抱歉,发生服务器错误。请稍等,然后重试。”使用答案中的方法。
    • @Stephen Brown,据我收集的信息,参考表和目标表都需要在同一个电子表格中才能使用.copyFormatToRange().copyTo()。因此,@David Tew 的上述方法。另请注意,在复制工作表时执行SpreadsheetApp.flush()(之前或之后取决于您在做什么)可以帮助解决“服务器错误”。
    • 在尝试使用上述方法(在 for 循环中)将特定条件格式应用于 20 个不同的列时,会创建一个单一的条件格式规则,包括所有指定范围的组合。我曾期望会为每一列创建一个新的条件格式规则。这是预期的吗?
    【解决方案2】:

    还可以使用 Advanced Sheets Services 从 Google Apps 脚本添加条件格式。

    请务必从您的脚本中启用高级 Google 服务。然后您可以使用Sheets.Spreadsheets.batchUpdate(resource, spreadsheetId) 添加条件格式,使用Google Sheets API v4高级表格服务

    浏览每个 JSON 表示对象以拼凑完整的请求:

    • 添加条件格式规则请求
      • 条件格式规则
        • 网格范围
        • 布尔规则
          • 布尔条件
            • 条件类型
          • 单元格格式
    // Conditionally sets the background of cells to red within range B2:J1000
    function setConditionalFormat() {
      var ss = SpreadsheetApp.getActiveSpreadsheet()
      var sheet = ss.getSheets()[0]
    
      var format_req = {
        "requests": [{
          "addConditionalFormatRule": { 
            "rule": {
              "ranges": [{
                "sheetId": sheet.getSheetId(),
                "startRowIndex": 1,
                "endRowIndex": sheet.getMaxRows(),
                "startColumnIndex": 1,
                "endColumnIndex": 10
                }],
              "booleanRule": {
                "condition": {
                  "type": "BLANK"
                },
                "format": {
                  "backgroundColor": {
                    "red": 1,
                    "green": 0,
                    "blue": 0,
                    "alpha": 1
                  }
                }
              }
            },
            "index": 0,
          }
        }],
      "includeSpreadsheetInResponse": false,
      }
    
      Sheets.Spreadsheets.batchUpdate(JSON.stringify(format_req), ss.getId())
    }
    

    【讨论】:

      【解决方案3】:

      使用最新的Sheets api,您可以以编程方式添加条件格式规则。

      要为工作表中的所有空单元格添加将背景设置为红色的规则,您可以这样做:

        var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('MySheet');
      
        var numRows = sheet.getLastRow();
        var numCols = sheet.getLastColumn();
        var range = sheet.getRange(1,1, numRows, numCols);
        var rule = SpreadsheetApp.newConditionalFormatRule()
            .whenCellEmpty()
            .setBackground("red")
            .setRanges([range])
            .build();        
        var rules = sheet.getConditionalFormatRules();
        rules.push(rule);
        sheet.setConditionalFormatRules(rules);
      

      您可以在您创建的每个新电子表格上运行此代码。

      【讨论】:

        【解决方案4】:

        以下代码将格式化您的 Google 表格表格中的交替行:

            function lastLine() {
              var ss = SpreadsheetApp.getActiveSpreadsheet();
              var sheet = ss.getSheets()[0];
        
              var range = sheet.getRange("A1:A").getValues();
        
              return range.filter(String).length;
            }
        
            function setConditionalFormat() {
              var ss = SpreadsheetApp.getActiveSpreadsheet()
              var sheet = ss.getSheets()[0]
        
              var myRange = {
                'sheetId': sheet.getSheetId(),
                'startRowIndex': 1,
                'endRowIndex': lastLine(),
                'startColumnIndex': 0,
                'endColumnIndex': 8
              }
        
        
              var format_req = {
                'requests': [
                  {'addConditionalFormatRule': {
                     'index': 0,
                       'rule': {
                         'ranges': [ myRange ],
                          'booleanRule': {
                             'format': {'backgroundColor': {'red': 1, 'green': 1, 'blue': 1, 'alpha': 1}},
                              'condition': {
                                'type': 'CUSTOM_FORMULA',
                                'values': [{'userEnteredValue': '=ISEVEN(ROW())'}]
                              },
                          },
                       },
        
                     }
                  },
                  {'addConditionalFormatRule': {
                     'index': 0,
                       'rule': {
                         'ranges': [ myRange ],
                          'booleanRule': {
                             'format': {'backgroundColor': {'red': 222/255, 'green': 235/255, 'blue': 246/255, 'alpha': 0.7}},
                              'condition': {
                                'type': 'CUSTOM_FORMULA',
                                'values':
                                  [{'userEnteredValue': '=ISODD(ROW())'}]
                              },
                          },
                       },
        
                     }
                  }      
                ],
              'includeSpreadsheetInResponse': false,
              }
        
              Sheets.Spreadsheets.batchUpdate(JSON.stringify(format_req), ss.getId())
            }
        

        【讨论】:

        • RGBA 中的背景颜色。 Max 255 or 1 如果你的颜色是 222,你需要除以 255 得到十进制数。
        猜你喜欢
        • 2023-02-06
        • 1970-01-01
        • 2014-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 2015-04-08
        • 1970-01-01
        相关资源
        最近更新 更多