Tengo una Hojas de cálculo de Google que contiene varias filas y columnas de datos y desea buscar una frase determinada en cada fila de la hoja de cálculo y, a continuación, imprimir la fila en una nueva hoja, si la fila que contiene la frase en una de las columnas de datos (digamos, por ejemplo, la columna D).

Mi hoja que contiene todos los datos de forma creativa llamada «Todos los datos». De manera similar, mi hoja que contendrá sólo los datos seleccionados se llama «datos Seleccionados».
Digamos que la frase que estoy buscando es «hola».

En el momento en que el «Seleccionado» datos de la hoja, tengo el siguiente en la celda A1:

=QUERY('All the data'!A:D,"select find("hello",All the data!D:D)>0")

Esto produce un error de análisis, la quiero para imprimir todas las filas de la «Todos los datos» de la hoja que contiene «hola» en la columna D, en el «Todos los datos» de la hoja.

¿Qué estoy haciendo mal? Estoy utilizando la función correcta? Hay otra más fácil de la función a utilizar? ¿Cuál es la fórmula correcta?

Finalmente quisiera convertir esto en Google Apps Script.

  • Yo no escribo esto como una respuesta debido a su última frase, pero la función de hoja de cálculo de la solución podría ser: =QUERY('All the data'!A:D;"select * where D contains 'hello'"). Nota este se encuentra «hola» en «Otelo».
  • Gracias por tu rápida respuesta de Adam. Tu comentario es lo suficientemente bueno como para que me de una respuesta. Si quieres publicar como tal voy a marcar esto como respondió. Voy a intentar hacer la conversión a Google Apps Script de mí mismo.
  • No se preocupe compañero, que va a hacer.
InformationsquelleAutor user1464409 | 2012-06-19

2 Comentarios

  1. 4

    y aquí es una solución de script’ usted podría intentar. Hay muchos enfoques posibles, este es uno de ellos…

    function testfindRow(){ ;//this function only to test the other one by giving it a parameter and using its result.
            var ss = SpreadsheetApp.getActiveSpreadsheet();
            var otherSheet=ss.getSheets()[1];//assuming there is a second sheet to copy to
            var datatocopy=findRow('Hello');
            Logger.log(datatocopy)
            if (datatocopy!=-1){
            otherSheet.getRange(otherSheet.getLastRow()+1,1,1,datatocopy[0].length).setValues(datatocopy);
            }
     }
    //
    function findRow(item) { ;//the actual search function
            var ss = SpreadsheetApp.getActiveSpreadsheet();
            var sheet=ss.getSheets()[0];
            var values = sheet.getDataRange().getValues();
              for(cc =0; cc < values.length; ++cc) {
                if(values[cc].toString().match(item)==item){break};//here you can eventually use string modifiers like toLowerCase() to allow for wider search criteria
                 }
            Logger.log(cc);//the array index in which the result was found, cc+1 is the Row index
            if (cc==values.length){return -1}
             var resultArray=sheet.getRange(cc+1,1,1,values[cc].length).getValues()
             return resultArray ;//the returned value is a 2 dimensions array to use with setValues()
     }

    Después de su comentario, aquí es una versión que devuelve todas las Filas que contengan el elemento, he tenido que cambiar la interceptación de errores también, pero el conjunto de las cosas es bastante más simple, después de todo.

        function testfindRow(){ ;//this function only to test the other one by giving it a parameter and using its result.
                var ss = SpreadsheetApp.getActiveSpreadsheet();
                var otherSheet=ss.getSheets()[1];//assuming there is a second sheet to copy to
                var datatocopy=findRow('Hello');
                if (datatocopy.length>0){
                otherSheet.getRange(otherSheet.getLastRow()+1,1,datatocopy.length,datatocopy[0].length).setValues(datatocopy);
                }
         }
        //
        function findRow(item) { ;//the actual search function
                var ss = SpreadsheetApp.getActiveSpreadsheet();
                var sheet=ss.getSheets()[0];
                var resultArray=new Array();
                var values = sheet.getDataRange().getValues();
                  for(cc =0; cc < values.length; ++cc) {
                    if(values[cc].toString().match(item)==item){//here you can eventually use string modifiers like toLowerCase() to allow for wider search criteria
    //or like this to search only in column D //if(values[cc][3].toString().match(item)==item){
                    resultArray.push(values[cc]);
                                };
                     }
                Logger.log(resultArray);//the array of Rows in which the item was found, 
                return resultArray ;//the returned value is a 2 dimensions array to use with setValues()
         }
    • Gracias Sergio por tu ayuda así. Lamentablemente esto no parece funcionar para mí. Sólo parece retorno de una de las columnas (la primera en la hoja de cálculo), creo y si el elemento no se encuentra allí es un «fuera de los límites de error». Estoy suponiendo que el «fuera de límites» error es debido a que el buscado término no se encuentra. Cuando el término de búsqueda que se encuentra parece copiar el contenido completo de la columna y no sólo la fila donde se encontró la coincidencia.
    • Lo siento, he añadido un error de captura ahora y corregido algunos errores. Debería funcionar como se espera.
    • Gracias Sergio! Sus ediciones han hecho el trabajo, la única cosa ahora es que sólo recoge la primera fila que tiene este valor («hola») y no todos los de la fila. ¿Cómo puedo modificar para que muestre cada fila?
    • buena pregunta ! Voy a ver lo que puedo encontrar y mantener informado 🙂
    • Tengo …supongo que es lo que se necesita, ¿no ?
    • Excelente trabajo! Gracias por lo mucho Serge.

  2. 3

    La función de hoja de cálculo solución sería:

    =QUERY('All the data'!A:D;"select * where D contains 'hello'")

    Nota: esta se encuentra «hola» en «Otelo».

Dejar respuesta

Please enter your comment!
Please enter your name here