我想编写一个脚本,每天删除一次电子表格中的所有过滤器。
我无法找到有关如何在Google Apps脚本中处理过滤的任何好文档。
如果可能的话,我也可以使用Python API这样做。
答案 0 :(得分:8)
可能,有一点"作弊" :)
(更新的答案:有一个允许的新Google服务,请参阅第2页)
1 - 简单方法
好吧,我设法这样做了:
var row = 1 //the row with filter
var rowBefore = row
//insert a row before the filters
Sheet.insertRowBefore(row);
row++;
//move the filter row to the new row (this will move only content)
var Line = Sheet.getRange(row + ":" + row);
Line.moveTo(Sheet.getRange(rowBefore + ":" + rowBefore));
//delete the old row, which contains the filters - this clears the filters
Sheet.deleteRow(row);
//if the row was frozen before deletion, freeze the new row
Sheet.setFrozenRows(rowBefore);
2 - 使用表单服务:
(复制自https://issuetracker.google.com/issues/36753410,评论#172)
function clearFilter() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ssId = ss.getId();
var sheetId = ss.getActiveSheet().getSheetId();
var requests = [{
"clearBasicFilter": {
"sheetId": sheetId
}
}];
Sheets.Spreadsheets.batchUpdate({'requests': requests}, ssId);
}
(复制自@ AndreLung的评论)
转到资源,然后转到"高级Google服务",找到" Google表格API并启用。另外,转到console.cloud.google.com/apis/dashboard并启用"表格API"
3 - 艰难的方式:(保留在这里,因为我在考虑之前写了它)
1 - 删除第一行(或过滤器按钮所在的行)
Sheet.deleteRow(1);
2 - 再次插入:)
Sheet.insertRowBefore(1);
3 - 设置标题
Sheet.getRange("A1").setValue("Hi there");
Sheet.getRange("B1").setValue("Here I am Again with no filter");
//alternatively
var LineVals = Sheet.getRange("1:1").getValues();
LineVals[0][0] = "Hi there";
LineVals[0][1] = "Here I am again";
LineVals[0][2] = "With no filters";
Sheet.getRange("1:1").setValues(LineVals);
//getValues is meant to keep the array exactly the size of the row
4 - 再次设置线条颜色:
//Cell color
Sheet.getRange("1:1").setBackground('#ff3300');
5 - 设置字体样式:
//I didn't test these ones....
Sheet.getRange("1:1").setFontColor....
Sheet.getRange("1:1").setFontFamily....
Sheet.getRange("1:1").setFontSize....
//Actually there are a lot of font options available....
6 - 如果之前被冻结,请再次冻结:
Sheet.setFrozenRows(1);
7 - 最后,如果他们有NamedRanges
,请考虑命名整个列而不是单个单元格,这样可以保护您的姓名不受伤害。
答案 1 :(得分:6)
我通过使用记录宏功能发现了一种新的超级简单的可能性:
spreadsheet.getActiveSheet().getFilter().remove();
注意"简单方法"之前描述的不再起作用,因为moveTo现在也移动过滤器
答案 2 :(得分:2)
我认为不可能以编程方式操作Google表格中的过滤器。您可以找到此here的未解决问题。明星注册你的兴趣,但在此期间我不相信有一个解决方案。
答案 3 :(得分:1)
这会使用代码添加过滤器,但它与您使用菜单添加的过滤器不同。您可以添加自己的过滤器菜单,这是您可以控制的。 Google App Script / Spreadsheet - How to get filter criteria?
正如@HDCerberus所说,似乎没有办法删除“基于菜单的过滤器”。
Python API很精细,但功能很少,所以甚至无法隐藏行 别介意处理过滤器。
答案 4 :(得分:1)
丹尼尔,非常感谢你: - )
这是我的实施:
function delFVws_test(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
delFVws(sh, 1);
}
function delFVws(sh, row){
var rowp = row;
sh.insertRowBefore(row++);
sh.getRange(row + ':' + row).copyTo(sh.getRange(rowp + ':' + rowp));
sh.deleteRow(row);
}
保留冻结行并使用copyTo而不是moveTo确保不会从一行到另一行移动过滤器。
答案 5 :(得分:0)
这是我实施丹尼尔代码的方式
将moveTo更改为copyTo并使用选项 - 仅限内容。 还删除了冻结的行(如果有的话),并在执行代码后添加了shtRows.setFrozenRows(1)。
var shtRows = mySS.getSheetByName("Rows");
var row = 1 //the row with filter
var rowBefore = row;
shtRows.setFrozenRows(0); // remove frozen
shtRows.insertRowBefore(row); //inserts a line before the filter
row++;
var Line = shtRows.getRange(row + ":" + row); //gets the filter line
Line.copyTo(shtRows.getRange(rowBefore + ":" + rowBefore), {contentsOnly:true}); //move to new line
shtRows.deleteRow(row); //deletes the filter line - this clears the filter
// a lot of code executing... and then ...
shtRows.setFrozenRows(rowBefore); //if row was frozen before, freeze it again
答案 6 :(得分:0)
我知道这是一个旧线程,但是对于那些在Google搜索答案时遇到此问题的人,以下代码将删除所有过滤器
SpreadsheetApp.getActiveSheet().getFilter().remove();
或者检查工作表是否具有过滤器
if (!SpreadsheetApp.getActiveSheet().getFilter()) { //returns null if fitler does not exist
<what to do if there is no filter>
}
else {
<what to do if there is a filter>
}
答案 7 :(得分:0)
<!-- language: lang-js -->
// 4. Clear any filters currently applied to this first sheet
// https://developers.google.com/apps-script/reference/spreadsheet/sheet#getFilter()
// https://developers.google.com/apps-script/reference/spreadsheet/filter#remove()
var currentFilter = sheet.getFilter();
if ( currentFilter !== null ) {
console.log( 'a filter currently exists, clearing...' );
sheet.getFilter().remove();
}
答案 8 :(得分:0)
为什么不使用removeColumnFilterCriteria方法, 可以说我们有2列...代码应该像这样:
function _clearFilter(sheet,headers) {
for (var i in headers){
var filter = sheet.getFilter().removeColumnFilterCriteria(Number(i)+1);
}
}
function clearFilter() {
var NUM_COLUMNS = 2;
var ss = SpreadsheetApp.getActive();
var sheet = ss.getActiveSheet();
var headers = sheet.getRange(1, 1,1,NUM_COLUMNS).getValues(); //or in better way to get the header columns
_clearFilter(sheet,headers[0]);
}