it-swarm.dev

Eseguire il debug di una funzione personalizzata in Google Apps Script

Sto cercando di creare la mia prima funzione personalizzata per un foglio di calcolo di Google in Script di app e sto avendo difficoltà a utilizzare il debugger.

Sto lavorando al codice demo della funzione personalizzata dalla documentazione di Google e ho impostato un punto di interruzione nella funzione personalizzata drivingDistance(Origin, destination) che viene utilizzata in una cella del mio foglio di lavoro. Il problema che ho è che il debugger mostra i parametri che sono passati nella funzione come undefined. Il contenuto di tutte le altre variabili create durante l'esecuzione viene visualizzato correttamente (a condizione che non dipendano dai parametri di input).

La cosa divertente è che anche se i parametri di input sono visualizzati come indefiniti, i calcoli della funzione hanno esito positivo, quindi questo sembra essere un problema di debugger. Sfortunatamente questo problema mi impedisce di imparare con successo a creare ed eseguire il debug del proprio codice (poiché dovrò lavorare con parametri di input complessi). 

Ho la sensazione che il problema sia collegato all'esecuzione lato server di Apps Script, quindi ho provato a registrare i parametri di input usando la classe Logger e ho anche provato a copiare queste variabili in nuove variabili locali. Ma tutto ciò che ho inventato era undefined.

Un altro suggerimento strano è che typeof dei parametri restituisce String. Ma ottenere la lunghezza di questi genera un errore e provare a concatenarli con un'altra stringa restituisce la stringa "indefinita" (vedi il mio dump dello schermo).

enter image description here

Sto cercando informazioni su ciò che sta accadendo qui.

29
Jpsy

Probabilmente il debugger non ti sta mentendo - se avvii quella funzione nel debugger, non avrà alcun parametro passato ad esso. Non preoccuparti, però, devi solo assicurarti di ottenere valori da utilizzare per il debug. Dai un'occhiata a Come posso testare una funzione trigger in GAS? , che dimostra le tecniche che possono essere applicate per le funzioni personalizzate.

Invece di definire un evento da passare alla funzione, ti consigliamo di fornire (o recuperare dal tuo foglio di lavoro) i valori per i parametri.

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());
}

Hai un'idea. Puoi ancora impostare punti di interruzione all'interno della tua funzione, oppure usare debugger per sospendere l'esecuzione.


Modifica: esamina gli argomenti

Quali argomenti è la funzione personalizzata che riceve quando chiamato da un foglio di calcolo?

Sei limitato a ciò che puoi fare per eseguire il debug di questo, poiché il debugger non può essere utilizzato per esaminare la tua funzione personalizzata quando viene richiamato da Fogli, e le limitazioni di sicurezza sulle funzioni personalizzate bloccano la registrazione. Potrebbe essere sufficiente per ottenere una comprensione dell'argomento passando in generale. Mentre le funzioni javascript possono avere parametri con nome, tutti gli argomenti vengono passati come un oggetto tipo Array, chiamato arguments. Questa funzione personalizzata restituirà una matrice che riporta gli argomenti ricevuti. Quando chiamato da un foglio di calcolo, ogni argomento apparirà nella sua cella, a partire dalla cella in cui inserisci la funzione in:

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

  return argArray;
}

Screenshot

In javascript, non ci sono tipi come int o float: solo Number. Questi parametri appariranno senza virgolette su di essi e assomigliano ai numeri. Le date arrivano come oggetti Date, ma se stampate in questo modo appaiono come stringhe Date-y. Le stringhe hanno virgolette.

Una funzione personalizzata non riceve mai un intervallo come argomento; quando si fornisce un parametro di intervallo nel foglio di calcolo, i suoi contenuti vengono raccolti in un array mono o bidimensionale e l'array è l'argomento.

34
Mogsdad

Puoi usare questo trucco per vedere la struttura degli argomenti inviati nella funzione personalizzata:

function TEST(input) {
  return (JSON.stringify(input));
}

I risultati verranno visualizzati nel tuo foglio in questo modo:

 enter image description here

0
Joseph Combs