我正在尝试创建一个在我的谷歌工作表中运行 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);
};
您的错误原因可能如下:
在第 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);
其他床单也同样。
试试这个:
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
变量时那样的无意错误。
希望这有帮助。