【问题标题】:How do I remove filters if filter already exists and create new filter in Google Scripts如果过滤器已存在,我如何删除过滤器并在 Google 脚本中创建新过滤器
【发布时间】:2022-01-22 03:57:51
【问题描述】:

我正在尝试创建一个脚本,该脚本在我的 google 工作表中的 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);
};

【问题讨论】:

    标签: javascript html google-apps-script google-sheets


    【解决方案1】:

    您的错误原因可能如下:

    在第 4 行,您将变量 filter 的值指定为工作表“MTD-Assignments”的过滤器。在第 14 行,您从工作表中删除了该过滤器。在第 22 行,您将活动工作表设置为“Torian”,然后在第 24 行再次调用 filter.remove()。但是,即使您更改了活动工作表,这也不会将 filter 变量更改为指向新活动工作表的过滤器:filter 仍然指向“MTD 分配”的过滤器。所以第 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);
    

    对于您的其他工作表也是如此。

    【讨论】:

    • 谢谢。我不知道,这很有帮助。我是这种类型的新手,所以我很感激可以提供的任何反馈。在创建未来的脚本时,我肯定会牢记这一点。
    【解决方案2】:

    试试这个:

    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 变量时,它还可以帮助您摆脱意外错误。

    希望这会有所帮助。

    【讨论】:

    • 非常感谢您的帮助!我是这种类型的新手,所以请原谅我的不准确之处,但我每天都努力学习更多,您的意见非常有帮助。这也有助于显示我在知识上的一些差距。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2017-07-29
    • 2011-05-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多