Как удалить все фильтры в таблице Google?

Я хочу написать сценарий, который удаляет все фильтры в электронной таблице один раз в день.

Мне не удалось найти никакой хорошей документации о том, как обрабатывать фильтрацию в Google Apps Script.

Я также был бы готов сделать это с помощью Python API, если бы это было возможно.


person JStew    schedule 07.11.2014    source источник


Ответы (8)


Этот ответ устарел, см. Ответ @ Davide


Это ВОЗМОЖНО, с небольшим обманом :)

(Обновленный ответ: есть новый сервис 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, найдите API Google Таблиц и включите. также перейдите на 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, подумайте о названии всего столбца вместо одной ячейки, чтобы ваши имена не пострадали.

person Daniel Möller    schedule 27.05.2015
comment
Небольшая помощь для варианта 2: перейдите в Ресурсы, затем Расширенные службы Google, найдите API Google Таблиц и включите. также перейдите на console.cloud.google.com/apis/dashboard и включите Таблицы API - person AndreLung; 29.06.2018

Есть новая сверхлегкая возможность, которую я обнаружил с помощью функции макроса записи:

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

NB, описанный ранее "простой способ" больше не работает, так как moveTo теперь перемещает также фильтры.

person Davide Carlo Cazzaniga    schedule 28.05.2018
comment
вы также можете сделать это на листе. `` `var ss = SpreadsheetApp.getActiveSpreadsheet (); var sheet = ss.getSheetByName (ToEmail1); sheet.getFilter (). remove (); `` '' - person Francisco Cortes; 13.01.2020

Даниэль, большое спасибо :-)

Это моя реализация:

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 гарантирует, что фильтры не будут перемещать от строки к строке.

person jpp    schedule 15.09.2016
comment
Кстати, при этом удаляются фильтры и сохраненные просмотры фильтров (моя первоначальная цель) - person jpp; 15.09.2016

Изменить: так как я написал этот ответ еще в 2014 году, отслеживаемая проблема в ссылке была решена с помощью новых методов управления фильтрами. Мой ответ сейчас устарел, но я продолжаю получать за него отрицательные голоса, так что ... спасибо. Я в курсе, но оставляю первоначальный ответ для потомков.

Я не верю, что можно программно управлять фильтрами в Google Таблицах. Вы можете найти открытую проблему для этого здесь < / а>. Пометьте его, чтобы зарегистрировать свой интерес, но пока я не верю, что есть решение.

person HDCerberus    schedule 08.11.2014


Вот как я реализовал код Дэниела

Изменил 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
person Meir Gabay    schedule 02.03.2017

Я знаю, что это старый поток, но для тех, кто столкнулся с этим при поиске ответа в 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>
}
person Kevin    schedule 31.07.2018
comment
Есть ли разница или различие, которое вы хотите провести между этим другим ответом? stackoverflow.com/a/50574261/9337071 - person tehhowch; 31.07.2018

почему бы не использовать метод 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]);
}
person shlomoglik    schedule 23.11.2018