如果过滤器已存在,如何删除过滤器并在 Google 脚本中创建新过滤器

问题描述 投票:0回答:2

我正在尝试创建一个在我的谷歌工作表中运行 11 个不同工作表的脚本。该函数本质上只是删除当前的过滤器(如果适用)并创建一个包含更新信息的过滤器。我遇到的问题是,仅在过滤器不等于 null 时才删除过滤器的逻辑似乎不起作用,因为我不断收到“异常:您无法在已经具有过滤器”,但是我的

filter.remove
应该已经删除了它。我已经盯着这个几个小时了,一些帮助将非常感激。这是我的脚本的副本,它有点长,如果可能的话我最好也想缩短它。

function Filter_All() {
///Set Variables
  var spreadsheet = SpreadsheetApp.getActive();
  var filter = spreadsheet.getActiveSheet().getFilter();
  var criteria = SpreadsheetApp.newFilterCriteria()
  var daycount = 0
  var MILLIS_PER_DAY = 1000*60*60*24*daycount
  var now = new Date();
  var filterdate = new Date(now.getTime() - MILLIS_PER_DAY);
///Select "MTD Assignments"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('MTD-Assignments'), true);
///Remove filter
    if (filter !== null) {
    filter.remove();
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);
///Select "Torian"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Torian'), false);
///Remove filter
    if (filter !== null) {
    filter.remove();
    return;
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);
///Select "Luke"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Luke'), false);
///Remove filter
    if (filter !== null) {
    filter.remove();
    return;
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);
///Select "Charity"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Charity'), false);
///Remove filter
    if (filter !== null) {
    filter.remove();
    return;
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);
///Select "Tenisha"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Tenisha'), false);
///Remove filter
    if (filter !== null) {
    filter.remove();
    return;
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);
///Select "Shannon"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Shannon'), false);
///Remove filter
    if (filter !== null) {
    filter.remove();
    return;
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);
///Select "Siley"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Siley'), false);
///Remove filter
    if (filter !== null) {
    filter.remove();
    return;
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);
///Select "Macheera"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Macheera'), false);
///Remove filter
    if (filter !== null) {
    filter.remove();
    return;
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);
///Select "Nia"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Nia'), false);
///Remove filter
    if (filter !== null) {
    filter.remove();
    return;
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);
///Select "Alicia"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Alicia'), false);
///Remove filter
    if (filter !== null) {
    filter.remove();
    return;
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);
///Select "Shannon/Johan/Meybeling"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Shannon/Johan/Meybeling'), false);
///Remove filter
    if (filter !== null) {
    filter.remove();
    return;
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);
};
google-sheets google-apps-script filter
2个回答
0
投票

您的错误原因可能如下:

在第 4 行,您将变量

filter
的值指定为工作表“MTD-Assignments”的过滤器。在第 14 行中,您从工作表中删除该过滤器。在第 22 行,您将活动工作表设置为“Torian”,然后在第 24 行再次调用
filter.remove()
。但是,即使您更改了活动工作表,这也不会更改
filter
变量以指向新活动工作表的过滤器:
filter
仍然指向“MTD-Assignments”的过滤器。因此第 24 行不会从“Torian”工作表中删除过滤器。为此,您首先需要通过重复该行来重新分配
filter
的值

 filter = spreadsheet.getActiveSheet().getFilter()

将活动工作表设置为“Torian”之后,在再次调用

filter.remove()
之前。

类似这样的:

///Set Variables
  var spreadsheet = SpreadsheetApp.getActive();
  var filter = spreadsheet.getActiveSheet().getFilter();
  var criteria = SpreadsheetApp.newFilterCriteria()
  var daycount = 0
  var MILLIS_PER_DAY = 1000*60*60*24*daycount
  var now = new Date();
  var filterdate = new Date(now.getTime() - MILLIS_PER_DAY);
///Select "MTD Assignments"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('MTD-Assignments'), true);
///Remove filter
    if (filter !== null) {
    filter.remove();
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);
///Select "Torian"
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Torian'), false);
filter = spreadsheet.getActiveSheet().getFilter();  // This is the line to be added.
///Remove filter
    if (filter !== null) {
    filter.remove();
    return;
    }
///Create Filter
  spreadsheet.getActiveSheet().getRange('A:N').createFilter();
  criteria = SpreadsheetApp.newFilterCriteria()
  .whenDateAfter(filterdate)
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(5, criteria);

其他床单也同样。


0
投票

试试这个:

function Filter_All() {
  // set variables
  var spreadsheet = SpreadsheetApp.getActive();
  var daycount = 0
  var MILLIS_PER_DAY = 1000*60*60*24*daycount
  var now = new Date();
  var filterdate = new Date(now.getTime() - MILLIS_PER_DAY);
  var filterCriteria = SpreadsheetApp.newFilterCriteria()
    .whenDateAfter(filterdate)
    .build();

  // reset filter for each sheet in loop
  var sheetNamesWithFilter = ['MTD-Assignments', 'Torian']; // TODO fill with your sheet names
  for (var i = 0; i < sheetNamesWithFilter.length; i++)
  {
    var sheetName = sheetNamesWithFilter[i];

    var sheet = spreadsheet.getSheetByName(sheetName);

    // remove filter
    var filter = sheet.getFilter();
    if (filter !== null)
    {
      filter.remove();
    }

    // create filter
    sheet.getRange('A:N').createFilter().setColumnFilterCriteria(5, filterCriteria);
  }
}

基本上,要使脚本正常工作,您所需要做的就是使用loop并对循环中的每个工作表应用相同的过滤器更改。它被认为是重复相同命令的最佳实践,并且还可以帮助您摆脱像您错误地忘记更新下一次迭代的

filter
变量时那样的无意错误。

希望这有帮助。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.