2012-07-25 17 views
5

È possibile ottenere i criteri di filtro del mio set di dati. Ad esempio, se una delle mie colonne è "Reparto" e ho filtrato i dati per visualizzare solo "IT". Come otteniamo i criteri filtrati, "IT". Ho bisogno di ottenere quei criteri filtrati nel mio GAS per fare qualche altra manipolazione.Script/foglio di calcolo per Google - Come ottenere i criteri di filtro?

Grazie.

+0

È possibile rivedere questa soluzione: http://stackoverflow.com/a/42615146/4786114 – Richi

risposta

3

Google Spreadsheet ha già una formula FILTER (I always use this page to remind me how to do it). Così, per esempio, se i dati sembravano questo

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

per ottenere un elenco filtrato è possibile utilizzare la formula

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

(Working example here)

Se si vuole fare qualcosa di completamente in Apps Script Romain Vialard ha scritto un Managed Library con una funzione di filtro. Qui ci sono instructions for installing and using the 2D Array2 library

+0

Probabilmente non ero abbastanza chiaro su ciò che sto cercando di fare nella mia domanda. Consentitemi di spiegare ulteriormente. Ho un foglio di calcolo che contiene le colonne -> Dipartimento | Unità | Nome dello staff | Stipendio. Un utente può filtrare il foglio di calcolo per dipartimento e unità. Ho anche un menu personalizzato chiamato "Processo". Se l'utente fa clic su "Processo", eseguirà una funzione di script personalizzata per eseguire alcune elaborazioni in base ai criteri filtrati dall'utente. È possibile ottenere i criteri filtrati dall'utente in script? – Alex

+0

Per quanto ne so non c'è modo di ottenere filtri applicati dall'utente – mhawksey

+0

Ci potrebbe essere un altro modo per farlo, ma dipende dalla risposta a questa domanda. Quando un utente filtra per Reparto e Unità sono le singole opzioni o l'utente seleziona più reparti/unità? – mhawksey

4

Prova questo esempio per un semplice filtro. Sarà filtrare le informazioni (cambiamento XXX a qualcosa di significativo) dalla prima colonna:

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

Alla ricerca di una risposta a questa domanda, mi si avvicinò con la prossima soluzione:

  • applicare filtri in il foglio;
  • colore i filtrati (e quindi visibili) cellule (nell'esempio codice rosso nella colonna F); edizione
  • run:
    • lettura colori di sfondo (su colonna F) in colori matrice
    • Iterando questo array
    • costruire la nuova matrice di numeri di riga che sono visibili.

Quest'ultimo matrice può essere utilizzato per ulteriori manipolazioni dei dati del foglio. Per rendere vivualizzato l'effetto dello script, ho fatto in modo che lo script impostasse lo sfondo delle celle utilizzate sul verde.

Si tratta di un piccolo sforzo in più per l'utente finale di fare, ma secondo me è l'unico modo per rendere possibile utilizzare solo i dati filtrati.

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

filtri sono ora disponibili tramite con il recente lancio dei fogli avanzate Servizio: Ecco un link al article

Ecco un piccolo frammento di come fare:

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

I fogli sono disponibili solo per le API (chiamate https) - chiede App Script - sono due cose diverse, anche se simili. – amok

0

in base alla risposta mhawksey, ho scritto la seguente funzione:

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

allora si chiamava in questo modo:

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

Than a prevenire il registro delle righe nascoste. Puoi vederlo in azione al numero: Prueba script, nota il progetto deve attivare l'API di Google Sheets su Google API Console. enter image description here

Spero che sia d'aiuto. Grazie!

Problemi correlati