Как обработать только видимые на листе строки?
Скрипт ниже получает массив данных, соответствующий области выделения.
var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var selection = sheet.getActiveRange(); var fromRow = selection.getRow(); var toRow = selection.getLastRow(); var fromColumn = 1; var toColumn = 7; var array = sheet.getRange(fromRow, fromColumn, toRow, toColumn).getValues(); var selected_rows = array.length + 1;
- Ожидаемый результат: selected_rows = 6.
- Полученный результат: selected_rows = 200.
То есть метод getRange получает данные из области выделения, не учитывая результаты фильтрации.
Как обработать только видимые на листе строки?
- google-spreadsheet
- google-apps-script
Отслеживать
19.1k 6 6 золотых знаков 30 30 серебряных знаков 44 44 бронзовых знака
задан 16 июл 2015 в 11:10
Владислав Погорелов Владислав Погорелов
85 9 9 бронзовых знаков
16 июл 2015 в 11:14
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
/* -------------------------------------------------------------- возвращает массив видимых строк в границах заданной области ----------------------------------------------------------------- */ function getVisibleData (range) < var values = range.getValues(); var selection = range.getSheet().getActiveRange(); var row1 = selection.getRow(); var row2 = selection.getLastRow()-row1+1; var range2 = range.getSheet().getRange(row1, 1, row2); var arrData = [], colors = []; // обрабатываем только видимые строки (работа в условиях включенной фильтрации на листе) // запоминаем текущие цвета var oldColors = range2.getFontColors(); // меняем цвета на новые for (var r = 0; r < oldColors.length; r++) colors[r] = [(oldColors[r] == '#000001') ? '#000002' : '#000001']; range2.setFontColors(colors); // Невидимые строки не окрашиваются. Находим окрашенные и записываем в массив. var newColors = range2.getFontColors(); for (var r = 0; r < colors.length; r++) < if ((oldColors[r][0] !== newColors[r][0])) arrData.push(values[r]); >// возвращаем старые цвета range2.setFontColors(oldColors); // возвращаем массив видимых строк выделенного диапазона. return arrData; >
Отслеживать
ответ дан 20 июл 2015 в 7:37
Владислав Погорелов Владислав Погорелов
85 9 9 бронзовых знаков
Использование результатов фильтра в скриптах будет нарушением видимой текущей концепции. Конечно, такой подход имеет место быть, но он имеет ряд суровых ограничений, которые делают его не универсальным. Основным подходом была и остается выборка на сервере. Другое дело, что нет возможности создавать пользовательские фильтры, но это уже другая история.
5 мар 2017 в 7:05
Ну правильно, вы же руками строите range от первого выбранного до последнего выбранного, поэтому и выдает 200. Чтобы получить интересующий range, нужно взять пересечение созданного array с имеющимся selection . В Excel VBA есть метод Intersect(range,range. ), в гугл-таблицах не нашел, но должен быть (нашел вот такой запрос, там упоминается, что есть rangeset, который умеет хотя бы с одним range пересечение делать — его можно попробовать применить). То есть если selection на самом деле является RangeSet, можно вызвать так:
var array = selection.subRangeSet(sheet.getRange(fromRow, fromColumn, toRow, toColumn)).getValues();
Отслеживать
ответ дан 16 июл 2015 в 14:13
1,084 8 8 серебряных знаков 21 21 бронзовый знак
В GAS нет метода RangeSet .
20 июл 2015 в 7:38
- google-spreadsheet
- google-apps-script
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8420
Гугл таблицы — как подсчитать сумму значений видимых ячеек?
Привет, я веду учет обращений по каждой статье и если статья подходит под вопрос какого либо из столбцов проставляю в ячейке статье 1 которые у меня после суммируются «=СУММ(K4:K)» и выводятся в процентах, но при фильтрации он всё равно считает все значения столбца, что можно указать в формуле, дабы при фильтрации(допустим по названию статьи) он считал значения только в видимых ячейках. В экселе вопрос легко решаем, но нужно решение для гуглтаблиц ибо основной софт. Спасибо!
- Вопрос задан более трёх лет назад
- 11829 просмотров
Комментировать
Решения вопроса 1
Omiku @Omiku Автор вопроса
Вопрос решил заменой на =ПРОМЕЖУТОЧНЫЕ.ИТОГИ(9;K4:K)
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ответы на вопрос 1
Это какой-то бред для рядового пользователя.
Т.е. я не могу просто ткнуть в пустую ячейку, нажать кнопку СУМ и обвести нужный диапазон отфильтрованных данных. Надо обязательно прописывать формулу, искать функцию SUBTOTAL которая никогда не на виду, прописывать первый аргумент — «9» и потом только диапазон.
Ответ написан более трёх лет назад
Passionare @Passionare
Да. Нарочно чрезмерно запутанная система.
2021 год.
все те же проблемы )))
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- Google Sheets
Скрип для записи последних действий в документе?
- 1 подписчик
- вчера
- 71 просмотр
- Google Sheets
- +1 ещё
Как настроить триггер на изменение в гугл таблицах?
- 1 подписчик
- 28 апр.
- 47 просмотров
Как получить СУММЕСЛИ только видимых ячеек?
https://docs.google.com/spreadsheets/d/1NU13NCXs4W.
Вот ссылка на таблицу.
Как получить сумму значений в ячейках при условии, что эти ячейки видимы после фильтра и удовлетворяют определенному значению в соседней ячейке?
Например, есть промежуточные итоги — она считает только видимые значения, но нет условия. Есть сумма если — есть условие но считает все значения и видимые и скрытые. Объединить не получается. Желательно решить этот вопрос без доп.списков и скриптов.
- Вопрос задан более трёх лет назад
- 2025 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 1
Григорий Боев @ProgrammerForever Куратор тега Google Sheets
Учитель, автоэлектрик, программист, музыкант
Не совсем то, но думаю что поможет. Используейте FILTER(Диапазон;Условие1;Условие2;. УсловиеN) для подсчёта суммы.
например, в вашем случае, в B47 пишем:
=СУММ(FILTER($C$2:$C$45;$B$2:$B$45=A47))
Где A47 — фильтр-условие на диаметр трубопровода
А ещё лучше — сразу сделать так:
=ЕСЛИОШИБКА(СУММ(FILTER($C$2:$C$45;$B$2:$B$45=A47));0)
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Суммирование только видимых ячеек
Некоторые из приведенных ниже способов чувствительны к этим факторам, некоторые – нет. Это нужно учитывать при выполнении вычислений:
СУММ (SUM) – тупо суммирует все в выделенном диапазоне без разбора, т.е. и скрытые строки в том числе. Если хотя бы в одной ячейке есть любая ошибка – перестает считать и тоже выдает ошибку на выходе.
ПРОМЕЖУТОЧНЫЕ.ИТОГИ (SUBTOTALS) с кодом 9 в первом аргументе – суммирует все видимые после фильтра ячейки. Игнорирует другие подобные функции, которые могут считать внутренние подитоги в исходном диапазоне.
ПРОМЕЖУТОЧНЫЕ.ИТОГИ (SUBTOTALS) с кодом 109 в первом аргументе – суммирует все видимые после фильтра и группировки (или скрытия) ячейки. Игнорирует другие подобные функции, которые могут считать внутренние подитоги в исходном диапазоне.
Если нужно не суммировать, то можно использовать другие значения кода математической операции:
АГРЕГАТ (AGGREGATE) – самая мощная функция, появившаяся в Office 2010. Также как и ПРОМЕЖУТОЧНЫЕ.ИТОГИ может не только суммировать, но и считать среднее, количество, минимум, максимум и т.д. — код операции задается первым аргументом. Плюс к этому имеет множество опций по подсчету, которые можно указать вторым аргументом:
Ссылки по теме
- Выборочные вычисления по одному или нескольким условиям
- Вставка в отфильтрованные строки
- Быстрое скрытие и отображение ненужных строк и столбцов