添加条件格式规则

Add conditional formatting rule

Google Sheets 有一种很好的交互方式来声明性地定义条件格式。有没有一种方法可以使用 App Script 对相同的声明性模型进行编程?

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

注意: 我知道可以编写自定义脚本来侦听 onEdit trigger. However, that script would need to be added to each of the generated spreadsheets. Also, non-declarative rules like that would not appear in the conditional formatting sidebar

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

这不可能吗?

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

您必须创建一个模板 sheet,在源传播sheet 中,该模板的单元格按条件格式设置(由您手动完成)。

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

像这样:

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

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

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

浏览每个 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())
}

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

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

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

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

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

您可以 运行 在您创建的每个新点差上使用此代码sheet。