2012-07-25 23 views
5

Ist es möglich, die Filterkriterien meines Datensatzes zu erhalten. Zum Beispiel, wenn eine meiner Spalte "Abteilung" ist und ich die Daten gefiltert habe, um nur "IT" anzuzeigen. Wie bekommen wir die gefilterten Kriterien "IT"? Ich muss diese gefilterten Kriterien in mein GAS holen, um etwas anderes zu tun.Google App Script/Spreadsheet - Wie Filterkriterien erhalten?

Danke.

+0

Sie können diese Lösung überprüfen: http://Stackoverflow.com/a/42615146/4786114 – Richi

Antwort

3

Google Spreadsheet hat bereits eine FILTER Formel (I always use this page to remind me how to do it). So zum Beispiel wenn sah Ihre Daten wie diese

A 
1 Department 
2 IT Department (Edinburgh) 
3 Department of IT 
4 Other Department 

eine gefilterte Liste erhalten Sie die Formel

=FILTER(A:A;FIND("IT",A:A)>0) 

(Working example here)

Wenn Sie etwas tun wollen, ganz in Apps Script verwenden könnte Romain Vialard hat eine Managed Library mit einer Filterfunktion geschrieben. Hier sind instructions for installing and using the 2D Array2 library

+0

Wahrscheinlich war ich nicht klar genug, was ich in meiner Frage zu tun versuche. Erlauben Sie mir, weiter zu erklären. Ich habe eine Tabelle mit Spalten -> Abteilung | Einheit | Name des Personals | Gehalt. Ein Benutzer kann die Tabelle nach Abteilung und Einheit filtern. Ich habe auch ein benutzerdefiniertes Menü namens "Process". Wenn der Benutzer auf "Verarbeiten" klickt, wird eine benutzerdefinierte Skriptfunktion ausgeführt, um eine Verarbeitung basierend auf den vom Benutzer gefilterten Kriterien durchzuführen. Ist es möglich, die Kriterien vom Benutzer gefiltert im Skript zu bekommen? – Alex

+0

Soweit mir bekannt ist, gibt es keine Möglichkeit, Benutzer angewendet Filter – mhawksey

+0

Es kann eine andere Möglichkeit, dies zu tun, aber es hängt von der Antwort auf diese Frage. Wenn ein Benutzer nach Abteilung und Einheit filtert, sind das einzelne Optionen oder wählt der Benutzer mehrere Abteilungen/Einheiten aus? – mhawksey

4

Versuchen Sie dieses Beispiel für einen einfachen Filter. Es filtert Informationen (ändern XXX etwas Sinnvolles) aus der ersten Spalte:

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); 

    } 

    } 

} 
0

Auf der Suche nach einer Antwort auf diese Frage kam ich mit der nächsten Abhilfe up:

  • Filter gelten Das Blatt;
  • färben Sie die gefilterten (und daher sichtbaren) Zellen (im Beispiel Code rot in Spalte F);
  • Skript ausführen:
    • Lesehintergrundfarben (die Spalte F) in Array Farben
    • dieses Array Iterieren
    • das neue Array von Zeilennummern des Aufbau, die sichtbar sind.

Diese letzte Anordnung kann mit weiteren Manipulationen der Blattdaten verwendet werden. Um den Effekt des Skripts zu vivualisieren, habe ich das Skript gesetzt, um den Hintergrund der verwendeten Zellen auf grün zu setzen.

Es ist ein extra kleiner Aufwand für den Endbenutzer zu machen, aber IMHO ist es die einzige Möglichkeit, nur die gefilterten Daten zu verwenden.

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") 
     } 
     } 
    } 
3

Filter sind jetzt mit der jüngsten Einführung des Advanced Blatt Service zur Verfügung mit: Hier ist ein Link auf die article

Hier ist ein kleiner Ausschnitt aus wie zu tun:

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); 
} 
+0

Blätter ist nur für APIs (https Anrufe) verfügbar - er fragt nach App Script - sie sind zwei verschiedene, wenn auch ähnliche Dinge. – amok

0

Basiert auf mhawksey Antwort, schrieb ich die folgende Funktion:

// 
 
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; 
 
    } 
 
}

nannte es dann so aus:

// 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"); 
 
    }

als das Protokoll der ausgeblendeten Zeilen verhindern. Sie können es in Aktion sehen: Prueba script, beachten Sie, dass das Projekt die Google Tabellen-API in der Google API-Konsole aktivieren muss. enter image description here

Ich hoffe, es hilft. Vielen Dank!