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

Estoy escribiendo un script para una spreadsheet de Google Docs para leer una list 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]); } }; 

Cuando recupera valores en Google Apps Script con getValues ​​() , siempre tratará con una matriz Javascript 2D (indexada por fila y columna), incluso si el range 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 less así:

[['fnetworking'], ['sam'], ['sam'], ['fnetworking']]

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 function de spreadsheet nativa de Hojas de cálculo para lograr esto (se escribe directamente en una celda de spreadsheet):

=UNIQUE(Director)

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

Me encontré con un problema similar con una function de spreadsheet que tomaba un range como un object. En mi caso, quería realizar una búsqueda simple de un set 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 function existente en la spreadsheet, pero esta es una demostración decente de tratar con la matriz 2D para search 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 search todo el range por la existencia de un valor, simplemente lo aplané en una sola matriz. Si realmente está tratando con ranges 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 sets.

Parece un problema con GAS y no con JS. Siempre he tenido problemas con getValues ​​() . Aunque la documentation dice que se trata de una matriz bidimensional , no se puede comparar con ella como se esperaría. Aunque si usa un enunciado de indexing como values[0][1] , obtendrá un tipo de datos básico. La solución (espero que haya una mejor) es forzar ese object 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 object 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 console 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 bash proporcionar los ejemplos (¡gracias por las sugerencias!).

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

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

Y las references:

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 search un valor de celda única dentro de esa matriz, debemos especificar en qué fila queremos search.

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 search en la primera "fila" en la matriz.

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

El siguiente script obtiene la fila actual en la spreadsheet y la convierte en una matriz. A continuación, utiliza el método indexOf() para search 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 }