如何在Google Apps脚本中清除条件格式(不是所有格式)

Han*_* S. 5 google-sheets google-apps-script gs-conditional-formatting

我需要一种通过运行脚本来删除所有条件格式的方法(我的客户端将使用此脚本,并且他不想重复针对大量电子表格文件中的每个工作表删除条件格式的过程)。

有什么办法可以通过Google Apps脚本执行此操作?我所看到的是.clearFormat(),很遗憾,它清除了所有格式,其中很多不应该删除(例如,字体颜色,bg颜色,字体,字体粗细,字体旋转,单元格轮廓)

如何以每个电子表格文件只需要按下一个按钮的方式执行此操作?

小智 9

Google Apps Scripts 现在支持使用删除条件格式 clearConditionalFormatRules

var sheet = SpreadsheetApp.getActiveSheet();
sheet.clearConditionalFormatRules();
Run Code Online (Sandbox Code Playgroud)

https://developers.google.com/apps-script/reference/spreadsheet/sheet#clearconditionalformatrules


小智 5

这可以通过Google Sheets API v4实现,Apps 脚本可以通过高级表格服务访问该API(请注意,必须在使用前启用它,如链接页面所示)。这是一个脚本,用于删除当前电子表格的 Sheet1 中的所有条件格式规则(您需要循环遍历工作表等)。

function clearSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();
  var sheet = ss.getSheetByName("Sheet1");
  var sheetId = sheet.getSheetId(); 
  var format_req = {
    "requests": [{
      "deleteConditionalFormatRule": { 
        "index": 0,
        "sheetId": sheetId
      }
    }]
  };
  var string_req = JSON.stringify(format_req);
  while (true) {
    try {
      Sheets.Spreadsheets.batchUpdate(string_req, ssId);
    }
    catch(e) {
      break;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

每个条件格式规则都有一个从 0 开始的“索引”。删除索引为 0 的规则会导致其他索引减 1。因此,循环继续删除索引 = 0 的规则,直到没有一个,并抛出一个错误(并捕获,退出循环)。

这是一种发送请求的奇怪方式:我宁愿发送这样的批量请求:

  var format_req = {
    "requests": [
    {
      "deleteConditionalFormatRule": { 
        "index": 0,
        "sheetId": sheetId
      }
    },
    {
      "deleteConditionalFormatRule": { 
        "index": 1,
        "sheetId": sheetId
      }
    }]
  };
Run Code Online (Sandbox Code Playgroud)

但要做到这一点,必须知道有多少条条件格式规则(我不知道如何找出)。如果您请求删除的规则多于工作表中存在的规则,则整个请求将失败并且不会删除任何内容。

没有先进的服务

对于普通的 Apps 脚本,最好的做法是:

  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns());
  var backgrounds = range.getBackgrounds(); 
  var fontColors = range.getFontColor(); 
  var fontFamilies = range.getFontFamilies();
  // ... other get methods from https://developers.google.com/apps-script/reference/spreadsheet/range 

  // tricky part: modify the backgrounds, replacing the colors used in conditional formatting by white 

  range.clearFormat();
  range.setBackgrounds(backgrounds)
       .setFontColors(fontColors)
       .setFontFamilies(fontFamilies)
    // .set  other things
Run Code Online (Sandbox Code Playgroud)

在这里,我假设条件格式仅影响单元格背景。如果无法过滤背景颜色(这需要准确知道条件格式规则中使用了哪些颜色),则条件格式的效果将变成普通背景颜色,这是非常不可取的......最好放弃设置背景颜色根本不存在。