sencillos resueltos funciones ejercicios ejemplos comandos javascript arrays google-apps-script google-spreadsheet indexof

resueltos - indexOf return-1 a pesar de que el objeto se encuentre en la matriz-Javascript en Google Spreadsheet Scripts



ejemplos de javascript sencillos pdf (5)

Cuando recupera valores en Google Apps Script con getValues ​​() , siempre tratará con una matriz Javascript 2D (indexada por fila y columna), incluso si el rango en cuestión tiene una columna de ancho. Entonces, en su caso particular, y extendiendo el ejemplo de + RobG, su matriz de values se verá más o menos así:

[[''fred''], [''sam''], [''sam''], [''fred'']]

Entonces necesitarías cambiar

var row = values[i];

a

var row = values[i][0];

Como comentario aparte, vale la pena señalar que puede usar una función de hoja de cálculo nativa de Hojas de cálculo para lograr esto (se escribe directamente en una celda de hoja de cálculo):

=UNIQUE(Director)

Esto se actualizará dinámicamente a medida que cambie el contenido del rango llamado Director . Dicho esto, puede haber una buena razón por la que quería utilizar Google Apps Script para esto.

Estoy escribiendo un script para una hoja de cálculo de Google Docs para leer una lista de directores y agregarlos a una matriz si aún no aparecen en ella.

Sin embargo, no puedo hacer que indexOf devuelva nada más que -1 para los elementos que están contenidos dentro de la matriz.

¿Alguien puede decirme qué estoy haciendo mal? ¿O señalarme una forma más fácil de hacer esto?

Este es mi guion:

function readRows() { var column = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("Director"); var values = column.getValues(); var numRows = column.getNumRows(); var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheets()[0]; var directors = new Array(); for (var i = 0; i <= numRows - 1; i++) { var row = values[i]; if (directors.indexOf(row) == -1) { directors.push(row); } else { directors.splice(directors.indexOf(row), 1, row); } } for (var i = 2; i < directors.length; i++) { var cell = sheet.getRange("F" + [i]); cell.setValue(directors[i]); } };


Me encontré con un problema similar con una función de hoja de cálculo que tomaba un rango como un objeto. En mi caso, quería realizar una búsqueda simple de un conjunto fijo de valores (en otra matriz).

El problema es que su variable "columna" no contiene una columna, contiene una matriz 2D. Por lo tanto, cada valor es su propia fila (en sí misma una matriz).

Sé que podría lograr el siguiente ejemplo utilizando la función existente en la hoja de cálculo, pero esta es una demostración decente de tratar con la matriz 2D para buscar un valor:

function flatten(range) { var results = []; var row, column; for(row = 0; row < range.length; row++) { for(column = 0; column < range[row].length; column++) { results.push(range[row][column]); } } return results; } function getIndex(range, value) { return flatten(range).indexOf(value); }

Entonces, como quería simplemente buscar todo el rango por la existencia de un valor, simplemente lo aplané en una sola matriz. Si realmente está tratando con rangos 2D, entonces este tipo de aplanamiento y agarrando el índice puede no ser muy útil. En mi caso, estaba mirando a través de una columna para encontrar la intersección de dos conjuntos.


Parece un problema con GAS y no con JS. Siempre he tenido problemas con getValues ​​() . Aunque la documentación dice que se trata de una matriz bidimensional , no se puede comparar con ella como se esperaría. Aunque si usa un enunciado de indexación como values[0][1] , obtendrá un tipo de datos básico. La solución (espero que haya una mejor) es forzar ese objeto en un String () y luego dividirlo () en una matriz que puede usar.

Aquí está el código que usaría:

var column = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("Director"); var values = column.getValues(); values = String(values).split(","); var myIndex = values.indexOf(myDirector);

Si myDirector está en valores, ¡obtendrás un número! = -1. Sin embargo, las comas en sus datos causarán problemas. Y esto solo funcionará con arreglos 1D.

En tu caso: var row = values[i]; fila es un objeto y no la cadena que desea comparar. Convierta todos sus valores en una matriz como la que tengo arriba y sus operadores de comparación deberían funcionar. (intente imprimir la fila a la consola para ver lo que dice: Logger.log(row) )


Si alguien se encuentra con esta publicación, es posible que desee considerar el uso de la biblioteca a continuación. Parece que funcionará para mí. Obtuve el retorno ''-1'' incluso cuando intento proporcionar los ejemplos (¡gracias por las sugerencias!).

Después de agregar Array Lib (versión 13) y usar la función find (), ¡obtuve la fila correcta!

Esta es la clave del proyecto que utilicé: MOHgh9lncF2UxY-NXF58v3eVJ5jnXUK_T

Y las referencias:

https://sites.google.com/site/scriptsexamples/custom-methods/2d-arrays-library#TOC-Using

https://script.google.com/macros/library/d/MOHgh9lncF2UxY-NXF58v3eVJ5jnXUK_T/13

Espero que esto ayude a alguien más también.


Debido a que estamos trabajando con una matriz 2D, 2dArray.indexOf("Search Term") debe tener una matriz 1D completa como término de búsqueda. Si queremos buscar un valor de celda única dentro de esa matriz, debemos especificar en qué fila queremos buscar.

Esto significa que usamos 2dArray[0].indexOf("Search Term") si nuestro término de búsqueda no es una matriz. Hacer esto especifica que queremos buscar en la primera "fila" en la matriz.

Si estuviéramos mirando un rango de celdas de 3x3 y quisiéramos buscar en la tercera fila, 2dArray[2].indexOf("Search Term")

El siguiente script obtiene la fila actual en la hoja de cálculo y la convierte en una matriz. A continuación, utiliza el método indexOf() para buscar esa fila en "Search Term"

//This function puts the specified row into an array. //var getRowAsArray = function(theRow) function getRowAsArray() { var ss = SpreadsheetApp.getActiveSpreadsheet(); // Get the current spreadsheet var theSheet = ss.getActiveSheet(); // Get the current working sheet var theRow = getCurrentRow(); // Get the row to be exported var theLastColumn = theSheet.getLastColumn(); //Find the last column in the sheet. var dataRange = theSheet.getRange(theRow, 1, 1, theLastColumn); //Select the range var data = dataRange.getValues(); //Put the whole range into an array Logger.log(data); //Put the data into the log for checking Logger.log(data[0].indexOf("Search Term")); //2D array so it''s necessary to specify which 1D array you want to search in. //We are only working with one row so we specify the first array value, //which contains all the data from our row }