Google App Script / Spreadsheet - Как получить критерии фильтра?
Можно ли получить критерии фильтрации моего набора данных. Например, если один из моих столбцов - "Отдел", и я отфильтровал данные, чтобы отобразить только "ИТ". Как мы получаем отфильтрованные критерии "ИТ". Мне нужно вставить этот отфильтрованный критерий в мой ГАЗ, чтобы сделать некоторые другие манипуляции.
Благодарю.
6 ответов
Попробуйте этот пример для простого фильтра. Он отфильтрует информацию (изменит XXX на что-то значимое) из первого столбца:
function onOpen(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var filterMenuEntries = [{name: "filter Column1", functionName: "filter"}];
ss.addMenu("choose filter", filterMenuEntries);
}
function filter(){
var sheet = SpreadsheetApp.getActiveSheet();
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
for (var i=1; i <=numRows -1; i++){
var row =values[i];
// Column value
var myValue = row[0];
// filter value
if (myValue == "XXX"){
sheet.hideRows(i+1);
}
}
}
Фильтры теперь доступны с использованием недавнего запуска Advanced Sheets Service: вот ссылка на статью
Вот небольшой фрагмент того, как это сделать:
function setSheetBasicFilter(ssId, BasicFilterSettings) {
//requests is an array of batchrequests, here we only use setBasicFilter
var requests = [
{
"setBasicFilter": {
"filter": BasicFilterSettings
}
}
];
Sheets.Spreadsheets.batchUpdate({'requests': requests}, ssId);
}
В Google Spreadsheet уже есть формула FILTER ( я всегда использую эту страницу, чтобы напомнить мне, как это сделать). Так, например, если ваши данные выглядели так
A
1 Department
2 IT Department (Edinburgh)
3 Department of IT
4 Other Department
чтобы получить отфильтрованный список, вы можете использовать формулу
=FILTER(A:A;FIND("IT",A:A)>0)
Если вы хотите сделать что-то полностью в Apps Script, Romain Vialard написал управляемую библиотеку с функцией фильтра. Вот инструкции по установке и использованию библиотеки 2D Array2
Основываясь на ответе mhawksey, я написал следующую функцию:
//
function celdasOcultas(ssId, rangeA1) {
// limit what's returned from the API
var fields = "sheets(data(rowMetadata(hiddenByFilter)),properties/sheetId)";
var sheets = Sheets.Spreadsheets.get(ssId, {ranges: rangeA1, fields: fields}).sheets;
if (sheets) {
return sheets[0].data[0].rowMetadata;
}
}
затем назвал это так:
// i.e. : ss = spreadsheet, ranges = "Hoja 2!A2:A16"
Logger.log(range.getA1Notation());
var ocultas = celdasOcultas(ss.getId(), sheetName + "!" + range.getA1Notation());
// Logger.log(ocultas);
var values = range.getValues();
for (var r = 0; r < values.length; r++) {
if (!ocultas[r].hiddenByFilter) {
values[r].forEach( function col(c){
Logger.log(c);
});
}
//range.setBackground("lightcoral");
}
Чем предотвратить журнал скрытых строк. Вы можете увидеть его в действии по адресу: сценарий Prueba, проект заметки должен включить API Google Sheets на консоли API Google.
Надеюсь, поможет. Спасибо!
В поисках ответа на этот вопрос я нашел следующий обходной путь:
- применять фильтры на листе;
- закрасить отфильтрованные (и, следовательно, видимые) ячейки (в примере кода красный в столбце F);
- запустить скрипт:
- чтение цветов фона (столбца F) в цветах массива
- итерация этого массива
- построение нового массива номеров строк, которые видны.
Этот последний массив можно использовать для дальнейших манипуляций с данными листа. Чтобы оживить эффект скрипта, я сделал скрипт, установив фон используемых ячеек зеленым.
Это еще одно небольшое усилие для конечного пользователя, но, по-моему, это единственный способ сделать возможным использование только отфильтрованных данных.
function getFilterdData(){
var s = SpreadsheetApp.getActive();
var sheet= s.getSheetByName('Opdrachten en aanvragen');//any sheet
var rows = new Array();
var colors = sheet.getRange(1, 6, sheet.getLastRow(), 1).getBackgrounds();
for(var i = 0; i < colors.length; i++){
if(colors[i] == "#ff0000"){
var rowsIndex = rows.length;
rows[rowsIndex] = i+1;
sheet.getRange(i+1, 6).setBackground("#d9ead3")
}
}
}
Это так же, как и в Google Tracker, номер проблемы № 36753410.
По состоянию на 2018-04-12 они опубликовали решение:
Вчера мы выпустили несколько новых функций, которые позволяют манипулировать фильтрами с помощью скрипта Apps:
- https://developers.google.com/apps-script/reference/spreadsheet/range
- https://developers.google.com/apps-script/reference/spreadsheet/sheet
- https://developers.google.com/apps-script/reference/spreadsheet/filter
К сожалению, в Apps Script до сих пор нет методов, позволяющих определить, скрыта ли данная строка или столбец фильтром. См. Комментарий № 157 для обходного пути с использованием расширенной службы Sheets.
Класс Filter позволяет вам получить FilterCriteria для каждого столбца по очереди.