5

我想编写一个脚本,每天一次删除电子表格中的所有过滤器。

我找不到任何关于如何在 Google Apps 脚本中处理过滤的好文档。

如果可能的话,我也愿意使用 Python API 来做这件事。

4

9 回答 9

24

通过使用记录宏功能,我发现了一种新的超级简单的可能性:

spreadsheet.getActiveSheet().getFilter().remove();

注意之前描述的“简单方法”不再起作用,因为 moveTo 现在也移动过滤器

于 2018-05-28T22:53:45.587 回答
9

此答案已过时,请参阅@Davide 的答案


这是可能的,有点“作弊”:)

(更新的答案:有一个新的谷歌服务允许它,见第 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 Sheets API 并启用”。另外,转到console.cloud.google.com/apis/dashboard并启用“Sheets 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,请考虑命名整个列而不是单个单元格,这样可以保护您的名字不受伤害。

于 2015-05-27T22:30:23.463 回答
2

编辑:自从我在 2014 年写了这个答案以来,链接中的跟踪问题已经通过新的方法来操作过滤器得到解决。我的答案现在已经过时了,但我一直对此表示反对,所以......谢谢。我知道,但将最初的答案留给后代。

我不相信以编程方式操作 Google 表格中的过滤器是可能的。你可以在这里找到一个未解决的问题。给它加星标以记录您的兴趣,但与此同时,我不相信有解决方案。

于 2014-11-08T00:10:03.567 回答
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 确保不会将过滤器逐行移动。

于 2016-09-15T14:42:18.643 回答
1

我知道这是一个旧线程,但对于那些在谷歌搜索答案时遇到此问题的人,以下代码将删除所有过滤器

    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>
}
于 2018-07-31T14:21:59.163 回答
0

基于代码的过滤器

这使用代码添加了一个过滤器,但它与您使用菜单添加的过滤器不同。您可以添加自己的过滤器菜单,这样您就可以控制。Google App Script / Spreadsheet - 如何获取过滤条件?

基于菜单的过滤器

正如@HDCerberus 所说,似乎没有办法删除“基于菜单的过滤器”。

Python API

Python API 是细粒度的,但功能很少,所以甚至没有办法隐藏一行,更不用说句柄过滤器了。

于 2014-11-10T22:12:01.220 回答
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();
}
于 2018-08-12T13:39:52.580 回答
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
于 2017-03-02T12:14:33.487 回答
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]);
}
于 2018-11-23T10:36:08.710 回答