Bots de conversa | Exemples | Dades pràctiques | Recursos CITCEA | |
Google Apps Script | Projectes | Interacció | Inici |
Quan executem l'script des del navegador obtenim directament la resposta a la finestra, també rebem informació quan hi ha un error. Però quan l'executem des d'una aplicació, com és el cas de Telegram, només sabem que hi ha un problema perquè no rebem la informació que esperàvem però no tenim cap pista sobre quin és l'error o on es troba. Si al menú lateral de la finestra on estem editant el codi piquem el botó que es mostra a continuació
se'ns obrirà una pàgina en la que trobarem les darreres execucions del nostre programa, el temps que han trigat en executar-se (dada útil si es vol optimitzar el codi) i si hi ha hagut algun error. Però no ens dona cap informació sobre l'error.
A la barra de comandes de la pantalla d'edició de l'script tenim algunes opcions que ens poden ser útils per depurar el programa.
Tenim un desplegable en el que se'ns mostren totes les funcions que té el nostre script, si en triem una i piquem el botó Ejecutar ens l'executarà i en podrem veure els errors, si n'hi ha. No podrem passar paràmetres a aquesta funció, una mica més avall comentarem com resoldre aquest inconvenient.
Per a les proves que fem des del propi editor, sí en podem veure els errors en detall a la pantalla d'execucions si piquem sobre la informació de la prova concreta que ens interessa. Això té l'avantatge que aquesta informació la podem venir a consultar més tard, fins i tot després d'haver modificat i executat la funció.
Quan executem una funció que té paràmetres des de la finestra d'edició sempre ens donarà error, ja que els paràmetres no estan definits. Hi ha un truc per poder provar les funcions d'aquesta manera. La idea és crear una funció (que podem anomenar, per exemple, test) que no cridem en cap lloc del programa però que és la que executarem des de la finestra. Aquesta funció no tindrà paràmetres i el que farà serà definir uns valors de prova abans de cridar la funció que realment ens interessa provar. Per exemple:
function test(){ var id = ^^9093476; var carpeta = "^^zuBdQHb6g8gN63NAzBEIBTWt6VsXCt6"; drive(id,carpeta); }
Quan nosaltres demanem l'execució de la funció test, farem que s'executi la funció drive i amb els paràmetres que hem definit.
Quan fem servir la funció doGet podem recuperar cada un dels paràmetres fent servir instruccions similars a aquesta:
var Accio = e.parameter.accio;
El problema apareix quan el programa que ha de generar l'ordre GET no genera l'adreça URL en el format esperat i el paràmetre desitjat no arriba. En cas que ens passi això, podem fer servir una instrucció com:
var param = e.queryString;
i a la variable ens hi quedarà tota la part de paràmetres de l'adreça URL, de l'interrogant (exclòs) cap endavant.
A vegades ens pot interessar conèixer el valor d'una variable en un lloc determinat del programa per saber si s'està comportant com esperem. Podríem demanar al programa que ens anés enviant missatges a Telegram, però no és molt pràctic. Això ens ho resol la funció log. A qualsevol lloc del programa podem posar instruccions com la següent:
Logger.log("Primer bucle for --> i = " + i);
Cada cop que el programa passi per aquesta instrucció, ens escriurà el que li hem demanat en un registre. A més, podem posar tantes instruccions log com desitgem. Un cop s'hagi executat l'script, podem consultar el que s'ha guardat al registre farem el mateix que per consultar els errors i veurem tot el que ha anat escrivint. Si, a més, hi ha un error, ens quedarà escrit també.
Quan es troba un error durant l'execució d'un script el programa s'atura. A vegades, però, ens interessa que el programa no s'aturi. Si tenim un tros de programa que pot provocar un error, ens pot ser útil fer servir try-catch. Un bloc try va aparellat amb un bloc catch. En el bloc try hi posarem la instrucció (o el conjunt d'instruccions) que pot provocar un error y en el bloc catch el que volem que faci quan es produixi un error. El bloc catch té un paràmetre err que recull l'error que s'ha produït.
try { ... } catch(err) { ... Logger.log("S'ha produït un error " + err); ... }
Cal tenir present que la informació de la funció log no estarà accessible si estem executant la funció doPost des de Telegram. En aquest cas, tenim l'opció d'enviar-nos l'error a Telegram.
try { ... } catch(err) { ... var id = ^^9093476; sendText(id,err); ... }
També ens podem enviar el text de l'error per correu electrònic.
En aquest exemple es fa servir try-catch per evitar problemes si els paràmetres són incorrectes.
Aquest mètode, però, no es pot fer servir en els inline bots, ja que no els està permès enviar missatges a un usuari. En aquest cas, una alternativa pot ser fer servir un segon script.
L'editor d'scripts té un mode de depuració que ens permet establir punts d'aturada en el programa, executar les instruccions d'una en una i veure l'estat de les variables durant l'execució. Per establir punts de parada, cal picar sobre el número de línia i ens apareixerà un cercle de color al costat. Quan s'executi la funció en mode depuració (amb el botó Depuración), el programa s'aturarà just abans d'executar cada una de les línies que tinguin el punt.
En el cas de l'exemple, el punt està dins un bucle, per tant s'hi aturarà cada vegada que hi passi, a totes les iteracions del bucle.
Aquest és l'aspecte de la finestra durant el mode depuració:
En mode depuració tenim diversos botons disponibles a la barra de comandes:
Botó | Funció |
![]() |
Executa la funció seleccionada al desplegable en mode depuració
S'atura al primer punt de parada |
![]() |
Continua fins al següent punt de parada |
![]() |
Atura momentàniament l'execució |
![]() |
Finalitza l'execució |
![]() |
Executa la línia i passa a la següent |
![]() |
Surt fora de les claus actuals
En el cas de l'exemple, sortiria de les claus; però, si la condició encara es compleix, hi tornarà a entrar amb el següent valor de la variable y |
![]() |
Entra |
En algunes situacions ens trobem que cap dels mètodes que hem comentat serveix, per si sol, per poder veure quin és l'error que s'està produïnt. En aquests casos podem emprar un segon script per gestionar-ho. Aquest mètode és útil, per exemple, per veure els errors que es puguin produir en els scripts d'un inline bot.
Imaginem-nos que tenim una funció doPost que té un error i, atès que és una funció doPost, no el podem veure a les execucions. Podem fer servir try-catch per capturar l'error però si fem servir log no podrem veure l'error a les execucions. Si és un inline bot tampoc podem enviar el text a Telegram. Una solució per a aquest cas seria crear-nos un bot de conversa (o aprofitar-ne un que ja tinguem; que, fins i tot, pot ser el mateix) i afegir-li una funció doGet com la següent:
function doGet(e) { var Text = e.parameter.text; var id = ^^9093476; sendText(id,Text); }
Evidentment, a l'script hi ha d'haver definida la funció sendText i també l'adreça URL de Telegram per enviar dades al bot. Si aquest script ja té una funció doGet, podem fer servir el nom del paràmetre per diferenciar què ha de fer.
Ara farem servir l'adreça URL d'aquest script per enviar el missatge des de l'altre script. Per exemple, l'script que estem intentant arreglar podria tenir la següent instrucció catch:
... } catch(err) { // Adreça de l'script que enviarà el missatge d'error a Telegram var urlGet = "https://script.google.com/macros/s/"; urlGet = urlGet + "^^fycbxqrJpVA-KT1sUd8HIta643R3bH4ixpDahttayGSGjkpHUBjPQ/exec?text="; UrlFetchApp.fetch(urlGet + err); } ...
Quan el nostre script falli, aquesta instrucció catch enviarà el missatge d'error a l'altre script i, atès que aquest està vinculat a un bot normal, podrà enviar el text de l'error al xat corresponent al bot per tal que el poguem veure.
Una altra alternativa per als casos difícils és guardar els missatges d'error en un full de càlcul. La idea és tenir un full de càlcul (o una pestanya addicional al full que ja estem emprant a l'script) on guardarem els missatges d'error. Aquest mètode pot semblar més senzill que empara un segon script però té l'inconvenient que també podem tenir algun error en les instruccions que guarden la informació al full de càlcul. El bloc catch podria ser com aquest:
... } catch(err) { var IdFull = "^^ThsoSjkeMSfwEKy4mn_4QEYH96sxv3VURqE3WHCTswDA"; var she = SpreadsheetApp.openById(IdFull).getSheetByName("log"); // Agafem el full var camps = new Array(1); // Contindrà un únic valor, l'error camps[0] = err; she.appendRow(camps); // Afegeix una filera amb les dades } ...
En cas que tinguem diversos blocs try-catch en el mateix script podem fer servir dues columnes, una per al missatge d'error i una altra on es guardi informació sobre quin dels blocs és el que l'ha generat.
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.