【问题标题】:Delete all filer criterias but preserve filter删除所有过滤器标准但保留过滤器
【发布时间】:2018-05-30 13:16:58
【问题描述】:

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

有没有直接快速的方法?

我找到的代码是:

var filter = sheet.getFilter(); 

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

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

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    选项#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);
        
    }
    

    这个速度要快得多。

    参考文献

    【讨论】:

      【解决方案2】:

      您只想删除基本过滤器的条件,而不删除基本过滤器。如果我的理解是正确的,那么使用 Sheets API 怎么样?示例脚本如下。使用此脚本时,请在高级 Google 服务和 API 控制台中启用 Sheets API。

      在高级 Google 服务中启用 Sheets API v4

      • 在脚本编辑器上
        • 资源 -> 高级 Google 服务
        • 启用 Google Sheets API v4

      Enable Sheets API v4 at API console

      • 在脚本编辑器上
        • 资源 -> 云平台项目
        • 查看 API 控制台
        • 在开始时,单击启用 API 并获取密钥等凭据。
        • 点击左侧的库。
        • 在搜索 API 和服务时,输入“表格”。然后点击 Google Sheets 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);
      

      注意:

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

      参考资料:

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

      【讨论】:

      • 嗨,@Tanaike,谢谢!我试图修改代码以将其与单张纸一起使用。您可能会在我的回答中看到它。它的工作速度要快得多,但我想知道对于这样一个简单的任务是否有更短的代码版本。我认为只需一个 API 调用就可以实现,您的原始代码使用 Sheets# 两次。
      • @Max Makhrov 感谢您添加更多信息和调查。您修改后的脚本非常适合降低流程成本。我认为当它是一个图书馆时,它会对用户有用。
      【解决方案3】:

      Max 的回答很好。但是,没有 API 的更快选项是这样的 - 只需删除过滤器,然后在没有任何条件的情况下将其添加回来:

        var sheet = SpreadsheetApp.getActiveSheet();
        var currentFilter = sheet.getFilter();
        var filterRange = currentFilter.getRange();
        currentFilter.remove();
      
        // add filter back
        filterRange.createFilter();
      

      【讨论】:

        猜你喜欢
        • 2021-03-18
        • 2015-09-27
        • 2020-01-31
        • 2016-05-09
        • 2012-11-10
        • 2015-02-20
        • 2017-08-07
        • 2019-11-27
        • 2023-03-14
        相关资源
        最近更新 更多