Depuración de una función personalizada en el script de Google Apps


Estoy tratando de crear mi primera función personalizada para una hoja de cálculo de Google en el Script de Aplicaciones y estoy teniendo dificultades para usar el depurador.

Estoy trabajando en el custom function demo code de la documentación de Google y he establecido un punto de interrupción en la función personalizada drivingDistance(origin, destination) que se utiliza en una celda de mi hoja de cálculo. El problema que tengo es que el depurador muestra los parámetros que se pasan a la función como undefined. El contenido de cualquier otra variable que se crean durante la ejecución se muestra correctamente sin embargo (siempre y cuando no dependan de los parámetros de entrada).

Lo curioso es que aunque los parámetros de entrada se muestran como indefinidos, los cálculos de la función tienen éxito, por lo que esto parece ser un problema del depurador. Desafortunadamente este problema me impide aprender con éxito a crear y depurar código propio (ya que tendré que trabajar con parámetros de entrada complejos).

Tengo la sensación de que el problema está conectado a la ejecución del lado del servidor del Script de Aplicaciones, así que traté de registrar los parámetros de entrada utilizando la clase Logger y también traté de copiar estas variables en nuevas variables locales. Pero todo lo que se me ocurrió fue undefined.

Otra pista extraña es que typeof de los parámetros devuelve String. Pero obtener la longitud de ellos arroja un error y tratar de concatenar con otra cadena devuelve la cadena "undefined" (ver mi volcado de pantalla).

introduzca la descripción de la imagen aquí

Estoy buscando ideas sobre lo que está pasando aquí.

Author: Rubén, 2013-11-29

1 answers

Probablemente el depurador no te esté mintiendo - si lanzas esa función en el depurador, no se le pasarán parámetros. Sin embargo, no se preocupe, solo debe asegurarse de obtener valores para usar para la depuración. Echa un vistazo a ¿Cómo puedo probar una función de disparo en GAS?, que demuestra técnicas que se pueden aplicar para funciones personalizadas.

En lugar de definir un evento para pasar a la función, querrá proporcionar (o recuperar de su hoja de cálculo) valores para los parámetros.

function test_drivingDistance() {
  // Define a set of test values
  var testSet = [[ 'Washington, DC', 'Seattle, WA' ],
                 [ 'Ottawa, ON', 'Orlando, FL'],
                 [ 'Paris, France', 'Dakar, Senegal']];

  // Run multiple tests
  for (var test in testSet) {
    Logger.log('Test ' + test + ' = ' + drivingDistance(testSet[test][0],testSet[test][1]));
  }

  // Get parameters from sheet
  var TestFromSheet = drivingDistance(ss.getRange('A1').getValue(),ss.getRange('A2').getValue());
}

Entiendes la idea. Todavía puede establecer puntos de interrupción dentro de su función, o usar debugger para pausar la ejecución.


Editar-examinar argumentos

¿Qué argumentos recibe la función personalizada cuando se llama desde una hoja de cálculo?

Está limitado en lo que puede hacer para depurar esto, ya que el depurador no se puede usar para examinar su función personalizada cuando se invoca desde Hojas, y las limitaciones de seguridad en las funciones personalizadas bloquean el registro. Podría ser suficiente para obtener una comprensión de la discusión pasando en general. Mientras que las funciones de javascript pueden tener parámetros con nombre, todos los argumentos se pasan como un objeto similar a una matriz, llamado arguments. Esta función personalizada devolverá una matriz que informa de los argumentos recibidos. Cuando se llama desde una hoja de cálculo, cada argumento aparecerá en su propia celda, comenzando en la celda en la que ingresa la función:

function testArguments(  ) {
  var argArray = [];
  for (var arg in arguments) {
    argArray.push("arguments[" + arg + "] = " + JSON.stringify(arguments[arg]))
  }

  return argArray;
}

Pantallazo

En javascript, realmente no hay tipos como int o float, solo Número. Esos parámetros se mostrarán sin comillas en ellos, y se verán como números. Las fechas llegan como objetos Date, pero cuando se imprimen de esta manera se muestran como cadenas Date-y. Las cadenas tienen comillas.

Una función personalizada nunca recibe un rango como argumento; cuando proporciona un parámetro de rango en la hoja de cálculo, su contenido se recopila en una matriz de una o dos dimensiones, y la matriz es el argumento.

 31
Author: Mogsdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:25