首页 文章

添加条件格式规则

提问于
浏览
5

Google表格具有很好的交互式方式来声明性地定义条件格式 . 有没有办法使用App Script编写相同的声明模型?

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

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

我只是试图将红色背景应用于没有 Value 的细胞 .

这不可能吗?

3 回答

  • 7

    我认为,在这种情况下,如果适合您的情况,您将不得不使用解决方法 .

    您必须在源电子表格中创建一个模板工作表,该模板工作表具有通过条件格式(由您手动完成)格式化的单元格 .

    然后,您的脚本会将此模板表复制到目标电子表格,然后使用带有{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);
    }
    
  • 0

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

    请务必从脚本中输入 Enable Advanced Google Services . 然后你可以使用 Sheets.Spreadsheets.batchUpdate(resource, spreadsheetId) 使用Google Sheets API v4Advanced Sheets Services 添加条件格式

    浏览每个JSON表示对象以将完整请求拼凑在一起:

    • AddConditionalFormatRuleRequest

    • ConditionalFormatRule

    • GridRange

    • BooleanRule

    • BooleanCondition

    • ConditionType

    • CellFormat

    // 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

    以下代码将格式化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())
        }
    

相关问题