Как удалить все фильтры в электронной таблице Google с помощью скрипта Google Apps?
Я хочу написать сценарий, который удаляет все фильтры в электронной таблице один раз в день. Мне не удалось найти хорошую документацию о том, как обрабатывать фильтрацию в скрипте Google Apps.
Я также был бы готов сделать это с помощью Python API, если бы это было возможно.
9 ответов
Это возможно, с небольшим "обманом":)
(Обновленный ответ: есть новый сервис 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 - Использование сервиса Sheets:
(Скопировано с 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 и включите". Кроме того, перейдите на https://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
рассмотрите возможность именования всего столбца вместо одной ячейки, которая сохранит ваши имена в целости и сохранности.
Существует новая супер-легкая возможность, которую я обнаружил с помощью функции макроса записи:
spreadsheet.getActiveSheet().getFilter().remove();
Обратите внимание, что описанный выше "легкий путь" больше не работает, так как moveTo теперь перемещает также фильтры
Я не верю, что можно манипулировать фильтрами в Google Sheets программным способом. Вы можете найти открытую проблему для этого здесь. Начните это, чтобы зарегистрировать ваш интерес, но пока что я не верю, что есть решение.
Даниэль, большое спасибо:-)
Это моя реализация:
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 гарантирует, что фильтры не будут перемещаться от строки к строке.
Кодовый фильтр
Это добавляет фильтр с использованием кода, но он не тот, который вы добавляете с помощью меню. Вы можете добавить свое собственное меню фильтра, таким образом у вас есть контроль. Google App Script / Spreadsheet - Как получить критерии фильтра?
Фильтр на основе меню
Как говорит @HDCerberus, не существует способа удалить "фильтр на основе меню".
Python API
Python API очень удобен, но имеет очень мало функций, поэтому нет способа даже скрыть строку, не говоря уже о фильтрах обработки.
Я знаю, что это старая ветка, но для тех, кто столкнулся с этим при поиске ответа в 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>
}
Вот как я реализовал код Дэниела
Поменял 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
Почему бы не использовать метод 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]);
}
<!-- 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();
}
Возможно, они недавно добавили функциональность, но есть более простой способ.
Если у вас есть диапазон, который вы хотите очистить, вам просто нужно установить проверку данных как ноль.
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
sheet.getRange("A:J").setDataValidation(null);