Обновляем диапазоны фильтров в гугл таблице с помощью скрипта
- 18 января, 2023
- 5 Комментариев
- 3032 просмотров
Мы ведь смотрим на данные в таблице, чтобы прийти к каким-то выводам на их основе, правильно? И, как правило, хотим увидеть как одни показатели влияют на другие, выявить новые взаимосвязи или какие-то критические значения.
Каждому ясно что, чтобы посмотреть как, например, идут продажи конкретного товара – нужно убрать данные о других. Это позволит сосредоточиться на нужном товаре и не ошибиться в выводах.
Один из удобных инструментов в таблицах – это фильтрация, то есть возможность быстро и просто отобразить только те данные из таблицы, которые соответствуют набору условий. В несколько кликов мышкой можно рассмотреть данные под разными углами, добавляя или убирая те, или иные показатели. Да, на данные нужно смотреть всегда с нескольких сторон. И тут на помощь приходят filter views (представления фильтров, сохраняемые, временные, индивидуальные и как только их еще не называют), главная функция которых – сохранить набор условий для фильтрации и быстрое переключение между ними. А еще, что не менее важно в условиях того, что таблицы являются инструментом многопользовательским – сохраняемые фильтры не мешают работе других пользователей, то есть я могу включить свой фильтр, другой пользователь свой и при этом мы не будем мешать работать с таблицей третьему. Такое часто бывает, когда менеджерам нужно работать со своими клиентами и им мешают остальные.
Но и есть и не совсем приятные моменты. Когда создается новый фильтр, он распространяется на определенный диапазон данных, при этом новые строки в фильтрацию не попадают. И, как правило, это становится очень неожиданным сюрпризом, некоторых вводит в ступор и недоумение, а кого-то приводит к неправильным выводам с соответствующими последствиями. Для восстановления работы фильтра нужно открыть его и вписать новый диапазон, в который попадут все данные.
Для решения этой проблемы я написал небольшую функцию-скрипт, который обновляет диапазоны всех, сохраненных на указанном листе таблицы, фильтров до актуального состояния. А чтобы об этой проблеме не вспоминать – настроил запуск этой функции при открытии таблицы и при нажатии на кнопку.
function updatedFiltersRange() {
const ss = SpreadsheetApp.getActive();
const ordersSheetName = 'ЗАКАЗЫ'; //Здесь нужно указать свой лист
const sheet = ss.getSheetByName(ordersSheetName);
const sheetsLastRow = sheet.getLastRow();
const ssId = ss.getId();
const updatedFilterViews = Sheets.Spreadsheets.get(ssId)
.sheets.find(sheet => sheet.properties.title == ordersSheetName)
.filterViews
.reduce((acc, filterView) => {
filterView.range.endRowIndex = sheetsLastRow;
acc.push({
'updateFilterView': {
filter: filterView, fields: 'range'
}
});
return acc
}, []);
Sheets.Spreadsheets.batchUpdate({ requests: updatedFilterViews }, ssId)
ss.toast('Диапазон всех фильтров обновлен.');
return true
}
И так, для того чтобы не задумываться о том, что в фильтр попадут ненужные строки, нужно просто добавить это скрипт в таблицу, заменить имя листа на своё, а затем настроить запуск по времени или по событию открытия таблицы (инструкция как запускать гугл скрипт автоматически) или просто добавить кнопку для запуска скрипта (инструкция).
Выдает ошибку
ReferenceError: Sheets is not defined
updatedFiltersRange@ Код.gs:8
Нужно подключить сервис Sheets. Здесь есть подробная инструкция: https://googlesheets.ru/delete-rows-by-sheets-api/#sheets_api
Теперь ошибка:
TypeError: Cannot read properties of undefined (reading ‘reduce’)
updatedFiltersRange@ Код.gs:11
Приходите к нам в чат https://t.me/+IypdYbSevBcwZDc6, я помогу разобраться
Или указан не тот лист, или на нем нет фильтров.