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:

К сожалению, в Apps Script до сих пор нет методов, позволяющих определить, скрыта ли данная строка или столбец фильтром. См. Комментарий № 157 для обходного пути с использованием расширенной службы Sheets.

Класс Filter позволяет вам получить FilterCriteria для каждого столбца по очереди.

Другие вопросы по тегам