删除所有文件管理器标准但保留过滤器

时间:2018-05-30 13:16:58

标签: google-apps-script google-sheets

我想清除所有过滤规则,但保留过滤器本身。

有直接而快速的方法吗?

我找到的代码是:

var filter = sheet.getFilter(); 

它获取过滤器对象,我对过滤器#的选项数量为limited.

注意:filter.remove()删除了此过滤器,但我需要保留它。

3 个答案:

答案 0 :(得分:3)

选项#1。慢[~16秒],无需API

我已尝试过此代码:

function deleteFilterCriterias(sheet)
{

 var filter = sheet.getFilter(); 
  if (!(filter)) { return -1; }

  var rangeF = filter.getRange();
  var cols = rangeF.getWidth();
  var col = rangeF.getColumn();

  for (var i = col; i <= cols; i++)
  {  
    // remove filter criteria for each column
    filter.removeColumnFilterCriteria(i)    
  }  
  return 0;  
}

但对我来说似乎很笨拙。

选项#2。快[~0.3秒],需要Sheets API

answer by @Tanaike之后,我尝试了Sheets API。

我在一张纸上重置过滤器的代码是:

function deleteFilterCriterias2(sheet)
{

  var ssId = sheet.getParent().getId();

  var range = sheet.getFilter().getRange();  

  var rowStart = range.getRow() - 1;
  var colStart = range.getColumn() - 1;

  // settings to reset filter
  var filterSettings = {
    "range": {
      "sheetId": sheet.getSheetId(),
      "startRowIndex": rowStart,
      "endRowIndex": range.getHeight() + rowStart,
      "startColumnIndex": colStart + colStart,
      "endColumnIndex": range.getWidth()
    }
  }; 

  var requests = [{
    "setBasicFilter": {
      "filter": filterSettings
    }
  }];

  // api request
  Sheets.Spreadsheets.batchUpdate({'requests': requests}, ssId);

}

这个更快。

<强>参考

答案 1 :(得分:2)

在删除基本过滤器时,您只想删除基本过滤器的条件。如果我的理解是正确的,那么如何使用Sheets API?示例脚本如下。使用此脚本时,请在Advanced Google Services和API控制台上启用Sheets API。

在高级Google服务中启用表格API v4

  • 在脚本编辑器上
    • 资源 - &gt;高级Google服务
    • 启用Google表格API v4

Enable Sheets API v4 at API console

  • 在脚本编辑器上
    • 资源 - &gt;云平台项目
    • 查看API控制台
    • 在“入门”中,单击“启用API”并获取密钥等凭据。
    • 在左侧,单击“库”。
    • 在搜索API&amp;服务,输入&#34;表&#34;。然后点击Google表格API。
    • 单击“启用”按钮。
    • 如果API已启用,请不要关闭。

如果您现在使用使用Sheets API的脚本打开脚本编辑器,则可以通过访问此URL https://console.cloud.google.com/apis/library/sheets.googleapis.com/

为项目启用Sheets API

示例脚本:

var id = SpreadsheetApp.getActiveSpreadsheet().getId();
var filters = Sheets.Spreadsheets.get(id, {fields: "sheets/basicFilter"});
var resource = {requests: filters.sheets.filter(function(e){return Object.keys(e).length}).map(function(e){return {setBasicFilter: {filter: {range: e.basicFilter.range}}}})};
Sheets.Spreadsheets.batchUpdate(resource, id);

注意:

  • 此示例仅通过不提供条件参数来删除条件,而不删除基本过滤器。
  • 在此示例中,将删除电子表格中所有工作表的条件。因此,如果您要删除特定工作表的条件,请修改此示例。

参考文献:

如果这不是你想要的,我很抱歉。

答案 2 :(得分:0)

Max的回答很好。但是,这是没有API的更快选择-只需删除过滤器,然后不加任何条件地将其重新添加:

  var sheet = SpreadsheetApp.getActiveSheet();
  var currentFilter = sheet.getFilter();
  var filterRange = currentFilter.getRange();
  currentFilter.remove();

  // add filter back
  filterRange.createFilter();