sheets secuencia script programar programacion para hojas hoja google ejemplos crear como comandos calculo asignar javascript google-apps-script google-spreadsheet

javascript - secuencia - programacion hojas de calculo



Depuración de una función personalizada de Hojas de cálculo (1)

Esta pregunta ya tiene una respuesta aquí:

Tengo definida la siguiente función personalizada en Hojas de cálculo de Google:

/** * Finds the maximum value in one column * by comparing cells matched in another column, * using a comma-delimited lookup in a cell. * * @param {string} references Comma-delimited string referencing values. * @param {array} keys Array of strings to match. * @param {array} values Array of values to compare. * @return The maximum value of all referenced values. * @customfunction */ function MAX_LOOKUP(references,keys,values){ if (!references || !keys || !values) return ""; var refs = {}; references.split(/, ?/).forEach(function(key){ refs[key]=1 }); var val,max = -Infinity; for (var i=keys.length;i--;){ if (refs[keys[i]] && (val=values[i])>max) max=val; } return max>-Infinity ? max : ""; }

En la hoja de cálculo, utilizada como =MAX_LOOKUP(G9,A:A,I:I) siempre devuelve una cadena vacía. Cuando lo pruebo en el Editor de secuencias de comandos, sin embargo, funciona correctamente:

function test_MAX_LOOKUP(){ var result = MAX_LOOKUP( "foo, bar, baz", ["no", "bar", "no", "baz", "foo", "no"], [ 99, 42, 99, 17, 1, 99 ] ); Logger.log( result ); // Is correctly 42 }

Obviamente, hay una diferencia entre los valores que obtengo de la hoja de cálculo y mi prueba, pero ¿cómo averiguo cuál es el problema? Si configuro un punto de interrupción en la función, solo ocurre cuando se depura desde el Editor de secuencias de comandos. Si pongo llamadas a Logger.log en la función, solo se registran cuando ejecuto desde el Editor de secuencias de comandos.

¿Cómo puedo ver qué valores se pasan a mi función?


Para ver lo que se está pasando, use la depuración de estilo "imprimir" devolviendo cadenas desde su función. Por ejemplo:

function MAX_LOOKUP(references,keys,values){ return JSON.stringify(references); //return JSON.stringify(keys); //return JSON.stringify(values); }

Es engorroso, pero puede avanzar y retroceder entre la edición de la función para cambiar lo que se devuelve, guardar la secuencia de comandos y luego ver la hoja de cálculo para ver su respuesta de depuración. (Sugerencia: abre la hoja de cálculo y el editor de scripts en ventanas separadas, no en pestañas separadas).

Usando la técnica anterior, podemos ver que el problema con el script anterior es que un rango de columna como A:A devuelve matrices de A:A solo valor para cada fila, no el valor de las celdas. La secuencia de comandos debe cambiarse a:

if (refs[keys[i][0]] && (val=values[i][0])>max) max=val;