2012-07-25 26 views
5

¿Es posible obtener los criterios de filtro de mi conjunto de datos? Por ejemplo, si uno de mi columna es "Departamento" y filtré los datos para mostrar solo "IT". ¿Cómo obtenemos los criterios filtrados, "IT"? Necesito tener esos criterios filtrados en mi GAS para hacer otra manipulación.Google Script de la aplicación/Hoja de cálculo: cómo obtener los criterios de filtro?

Gracias.

+0

Puede revisar esta solución: http://stackoverflow.com/a/42615146/4786114 – Richi

Respuesta

3

Google Spreadsheet ya tiene una fórmula FILTER (I always use this page to remind me how to do it). Así por ejemplo, si los datos eran los siguientes

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

para obtener una lista filtrada se puede utilizar la fórmula

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

(Working example here)

Si usted quiere hacer algo enteramente en Apps Script Romain Vialard ha escrito un Managed Library con una función de filtro. Aquí están instructions for installing and using the 2D Array2 library

+0

Probablemente no fui lo suficientemente claro en lo que trato de hacer en mi pregunta. Permíteme explicarte más. Tengo una hoja de cálculo que contiene columnas -> Departamento | Unidad | Nombre del personal | Salario. Un usuario puede filtrar la hoja de cálculo por Departamento y Unidad. También tengo un menú personalizado llamado "Proceso". Si el usuario hace clic en "Proceso", ejecutará una función de secuencia de comandos personalizada para hacer un procesamiento basado en los criterios filtrados por el usuario. ¿Es posible obtener los criterios filtrados por el usuario en el script? – Alex

+0

Por lo que sé, no hay forma de obtener filtros aplicados por el usuario – mhawksey

+0

Puede haber otra forma de hacerlo, pero depende de la respuesta a esta pregunta. Cuando un usuario filtra por Departamento y Unidad, ¿son opciones individuales o el usuario selecciona múltiples departamentos/unidades? – mhawksey

4

Pruebe este ejemplo para un filtro simple. Se filtrará la información (modificar XXX a algo significativo) de la primera columna:

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

En búsqueda de una respuesta a esta pregunta, se me ocurrió la siguiente solución:

  • aplicar filtros en la sábana;
  • color las celdas filtradas (y por lo tanto visibles) (en el código de ejemplo rojo en la columna F); guión
  • de ejecución:
    • lectura de fondo de colores (columna F) en colores de matriz
    • la iteración de esta matriz
    • la construcción de la nueva gama de números de fila que son visibles.

Esta última matriz puede utilizarse para manipulaciones adicionales de los datos de la hoja. Para vivualizar el efecto de la secuencia de comandos, hice la secuencia de comandos estableciendo el fondo de las celdas utilizadas en verde.

Es un pequeño esfuerzo extra para el usuario final, pero en mi humilde opinión es la única manera de hacer posible que solo se usen los datos filtrados.

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

Los filtros están ahora disponibles usando con el reciente lanzamiento de las hojas de servicios avanzados: Aquí hay un enlace a la article

Aquí hay un pequeño fragmento de cómo hacerlo:

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

Hojas solo está disponible para API (llamadas https) - él está pidiendo Script de aplicación - son dos cosas diferentes, aunque similares. – amok

0

Basado en respuesta mhawksey, escribí la siguiente función:

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

entonces llamados de esta manera:

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

Que prevenir el registro de las filas ocultas. Puede verlo en acción en: Prueba script, el proyecto de nota debe habilitar la API de Hojas de cálculo de Google en la Consola de la API de Google. enter image description here

Espero que ayude. ¡Gracias!

Cuestiones relacionadas