使用 Google 应用脚本删除一定数量的过滤视图

Removing a certain number of filter views with Google App Scripts

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

经过一些研究,我发现了一个代码片段,它允许删除给定 sheet 中的所有过滤视图,但我想删除一些过滤视图,而不是全部。

这是我已经找到的代码片段,由 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" 开头的当前 sheet 的所有筛选视图 X 可以是 1 到 100 之间的数字

我对正则表达式的拙劣尝试是这样的

(Filter)\s\d*

我目前的编程技能不允许我比这更进一步。

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

非常感谢,

  • 您想删除活动 sheet 上的所有筛选视图。
  • 您想移除所有过滤视图标题前缀为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);
}

参考文献: