【问题标题】:Mass Delete Filter Views in Google Sheets在 Google 表格中批量删除过滤器视图
【发布时间】:2019-02-11 14:26:14
【问题描述】:

我找到了this old thread,但似乎无法让任何方法发挥作用。

问题:我有一个数十人使用的电子表格,随着时间的推移,已经创建了 >200 个过滤视图。我想从工作簿的一张表中批量删除所有过滤视图

我在启用 Google Sheets API 后尝试过这种方法。它运行了,但可惜的是,所有 Filter View 仍然存在。

function clearFilter() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var ssId = ss.getId();
    var sheetId = ss.getActiveSheet().getSheetId();
    var requests = [{
        "clearBasicFilter": {
        "sheetId": sheetId
        }
    }];
    Sheets.Spreadsheets.batchUpdate({'requests': requests}, ssId);
}

谢谢大家

过滤视图的图像:

【问题讨论】:

    标签: google-apps-script google-sheets google-sheets-api google-sheets-filter-view


    【解决方案1】:

    问题:

    • 您正在发出一个清除过滤器请求,它只清除当前过滤器

    解决办法:

    • 您必须改为发出deleteFilterView 请求

    示例代码:

    function delFilterViews() {
      var ssId = SpreadsheetApp.getActive().getId();
      Sheets.Spreadsheets.batchUpdate(
        {
          requests: Sheets.Spreadsheets.get(ssId, {
            ranges: 'Sheet1', //Sheet in which filterviews are present
            fields: 'sheets/filterViews/filterViewId',
          }).sheets[0].filterViews.map(function(e) {
            return { deleteFilterView: { filterId: e['filterViewId'] } }; //create a new delete filter view request for each filter view present in sheet1
          }),
        },
        ssId
      );
    }
    

    参考资料:

    【讨论】:

    • 非常感谢!这完美地工作并一次性清除了所有自定义过滤器视图!
    • 这将删除工作表中的所有过滤视图。如何仅删除未设置名称的过滤器?例如- 一些正则表达式,如Filter* ?
    • @Dave 是的。您将使用Array.filter,然后在filterViews 上使用.map,而不仅仅是.map。如果经过合理努力仍无法执行,请提出新问题
    【解决方案2】:

    我发现大师的代码很难理解,因为不容易看到正在发送到 API 进行删除的数组中发生了什么,所以我重写了它并添加了一些额外的功能。这里有2个功能。一次性删除活动工作表上的所有未命名过滤器。另一种允许用户使用消息框提示逐个浏览和删除命名过滤器。

    function delUnusedFilterViews() {
    
      var ssId = SpreadsheetApp.getActive().getId();
      var sheetName = SpreadsheetApp.getActiveSheet().getName();
      SpreadsheetApp.getActiveSpreadsheet().toast('Removing unnamed Filters from sheet: ' + sheetName);
      var allFilters = Sheets.Spreadsheets.get(ssId).sheets[0].filterViews;
      var filterArr =[];
      for (var i in allFilters) {
        var currFilter = allFilters[i];
        var filterName = currFilter.title;
        var currFilterId = currFilter.filterViewId;
        if (/Filter [0-9]/.test(filterName)) filterArr.push({ deleteFilterView: { filterId: currFilterId } })
      }
       Sheets.Spreadsheets.batchUpdate({
          requests: filterArr
        },
          ssId
        )
      Browser.msgBox("All Done. You need to reload the sheet to see the filters have been deleted");
    }
    
    function delFilterViewsOneByOne() {
      var ssId = SpreadsheetApp.getActive().getId();
      var sheetName = SpreadsheetApp.getActiveSheet().getName();
      var allFilters = Sheets.Spreadsheets.get(ssId).sheets[0].filterViews;
      for (var i in allFilters) {
        var currFilter = allFilters[i];
        var filterName = currFilter.title;
        var currFilterId = currFilter.filterViewId;
        var userResponse = Browser.msgBox("Remove filter named '" + filterName + "'?", Browser.Buttons.YES_NO_CANCEL);
        if (userResponse == 'cancel') return;
        if (userResponse == 'no') continue;
        Sheets.Spreadsheets.batchUpdate({
          requests: [{ deleteFilterView: { filterId: currFilterId } }]
        },
          ssId
        )
      }
      Browser.msgBox("All Done. You need to reload the sheet to see the filters have been deleted");
    }
    

    我个人将这些功能添加到主菜单“onOpen”中,以便可以在电子表格中的任何工作表上使用它们。随时随地都可以使用它是非常有用的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2017-06-26
      相关资源
      最近更新 更多