У меня есть функция, которую предложил один из пользователей, чтобы получить критерий встроенного фильтра гугл листов. Я не знаю, правильно ли я делаю это, но когда я вставляю функцию getVisibleValues()
в ячейку, я получаю сообщение об ошибке:
TypeError: невозможно прочитать свойство getColumnFilterCriteria неопределенного (ряд 18)
function test_getVisibleValues() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test1");
const columnRange = sheet.getRange("C2:C");
const filter = columnRange.getFilter();
const visibleValues = getVisibleValues(filter, columnRange);
console.info(visibleValues);
}
/**
* Returns the values to show.
* Simulates https://developers.google.com/apps-script/reference/spreadsheet/filter-criteria#getvisiblevalues
* @param {Filter} filter
* @param {Range} range
* @returns {string[]}
*/
function getVisibleValues(filter, range) {
const filterCriteria = filter.getColumnFilterCriteria(range.getColumn());
const hiddenValues = filterCriteria.getHiddenValues();
const allNonBlankValues = range.getValues().filter(String);
const uniqueValues = Array.from(new Set(allNonBlankValues));
// filter unique values that aren't hidden
return uniqueValues.flat().filter(value => !hiddenValues.includes(value));
}
@Marios Столбец C содержит фильтр. Пробовал C1:C и та же ошибка. Правильно ли я делаю это, набрав =getVisibleValues() без каких-либо параметров?
какую функцию вы выполняете первой? test_getVisibleValues
или getVisibleValues
. Если вы выполните последнее, то аргументы не определены и, следовательно, ошибка. Я проверил ваш код, выполнив test_getVisibleValues
, и он не выдал никаких ошибок. Я думаю, это просто понять. Функция getVisibleValues
требует два аргумента: filter
и range
. Если вы сначала выполните getVisibleValues
, то аргументы нигде не определены. Но если вы сначала выполните test_getVisibleValues
, затем передадите эти аргументы getVisibleValues
, и тогда все заработает.
@Marios Marios хм, так как я могу использовать все, введя функцию в ячейку, чтобы вернуть результат?
Проверьте мой ответ. Я надеюсь, что это отвечает на ваш вопрос.
Объяснение:
Ваша цель — использовать ваш код в качестве пользовательской функции, чтобы его можно было использовать в качестве формулы на вашем листе.
Решение:
Убедитесь, что столбец C
содержит фильтр и что эта формула применяется к листу Test1
. Измените их в соответствии с вашими потребностями или используйте:
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
если вы хотите вместо этого получить активный лист.
function test_getVisibleValues(rng) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const range = sheet.getRange(rng);
const filter = range.getFilter();
const filterCriteria = filter.getColumnFilterCriteria(range.getColumn());
const hiddenValues = filterCriteria.getHiddenValues();
const allNonBlankValues = range.getValues().filter(String);
const uniqueValues = Array.from(new Set(allNonBlankValues));
// filter unique values that aren't hidden
return uniqueValues.flat().filter(value => !hiddenValues.includes(value));
}
Теперь вы можете применить test_getVisibleValues("C2:C")
как формулу на своем листе, но C2:C
должен быть внутри цитаты:
Спасибо!, это почти работает Есть только одна проблема, вы знаете, как сделать функцию динамической? потому что после изменения критерия фильтра результат не меняется
@AdOne К сожалению, это ограничение Google, и для этого нет решения, а есть только обходные пути. Вы можете почерпнуть идеи здесь.
Предполагая, что у вас есть лист с именем
Test1
, проблема может заключаться в том, что выбранный вами диапазон (столбец C) не имеет фильтра, и в результатеgetFilter()
возвращает значение null. Вы можете это подтвердить? Также попробуйте вместо этого C1:C, чтобы получить полный столбец.