首页 > 解决方案 > 使用 Google App Scripts 移除一定数量的过滤器视图

问题描述

我对找到一种使用 Google APPs 脚本删除给定数量的过滤器视图的方法非常感兴趣。目前,我有几张表,其中包含需要删除的数十个未命名的过滤器视图。我可以手动完成,但这需要我几个小时。

在做了一些研究之后,我发现了一个代码片段,它允许删除给定工作表中的所有过滤器视图,但我想删除一些过滤器视图,而不是全部。

这是我已经找到的代码片段,由 TheMaster 提供:

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 X”开头的当前工作表的所有过滤器视图 X 可以是 1 到 100 之间的数字

我对正则表达式的糟糕尝试将是这样的

(Filter)\s\d*

我目前的编程技能不允许我走得更远。

其他人可以帮我解决这个问题吗?

非常感谢,

标签: google-apps-scriptgoogle-sheetsgoogle-sheets-apigoogle-apps

解决方案


  • 您要删除活动工作表上的所有过滤器视图。
  • 您想删除过滤视图标题前缀为 的所有过滤视图Filter

如果我的理解是正确的,那么下面的示例脚本怎么样?

示例脚本:

function delFilterViews() {
  var ss = SpreadsheetApp.getActive();
  var ssId = ss.getId();
  var get = Sheets.Spreadsheets.get(ssId, {ranges: ss.getActiveSheet().getSheetName(), fields: "sheets(filterViews(filterViewId,title))"});
  var resource = get.sheets.reduce(function(ar1, e) {
    if ("filterViews" in e) {
      var temp = e.filterViews.reduce(function(ar2, f) {
        if (/^Filter\s\d*/.test(f.title)) ar2.push({deleteFilterView: {filterId: f['filterViewId']}});
        return ar2;
      }, []);
      Array.prototype.push.apply(ar1, temp);
    }
    return ar1;
  }, []);
  if (resource.length > 0) Sheets.Spreadsheets.batchUpdate({requests: resource}, ssId);
}

参考:


推荐阅读