Omdat bij de meeste onderdelen steeds dezelfde code terug komt kan je gebruik maken van onderstaande template om bepaalde code af te bakenen.
De wrapping van je volledige functie binnen een try/catch laat je toe om bepaalde fouten te onderscheppen die ontstaan doordat de gebruiker/systeem iet niet heeft kunnen uitvoeren.
Je kan de try/catch ook gebruiken om bepaalde functionaliteit af te tatsen, zoals met de UI interface.
Indien een script in "debug" mode wordt gedraaid, dan worden de meldingen naar een execution log gestuurd en worden de UI alerts onderdrukt.
Echter wanneer het script normaal wordt uitgevoerd, heb je er alle belang bij dat de gebruiker geïnformeerd wordt van fouten.
Deze service kent ook verschillende vormen waarvan meestal de "script lock" wordt gebruikt.
Deze verhindert dat een trigger simultaan meervoudig hetzelfde script zal uitvoeren, iets wat kan ontstaan wanneer je onForm() of onEdit() triggers hebt.
Maar ook wanneer je toegang wil tot een sheet en het risico bestaat dat meerdere personen tot dezelfde sheet toegang hebben(shared sheet), bestaat de kans dat een script meermaals wordt uitgevoerd.
Om dit te verhinderen gebruik je de lockservice op script niveau.
De activatie gebeurt dmv
LockService.getScriptLock().waitLock(300000) //max 6min
en de opheffing gebeurt dmv
LockService.getScriptLock().releaseLock()
en dit als laatste onderdeel in je script of bij een error.
De maximale tijdsduur van 300 sec voor het bekomen van een lock, is vastgelegd door Google en kan je behoeden voor een fout in de toegang tot het script (server problemen, overload conditie etc)
Om alle handelingen op een sheet als atomisch uit te voeren, gebruik je deze functie.
Het is raadzaam deze steeds toe te passen op het einde van een functie die een sheet benadert of telkens er "geschreven" wordt naar een sheet.
/**
* Generic code template for lock and display alerts in interactive mode.
*
*/
function myfunction() {
try {
//Function code start
// Script run interactive-> Alerts will popup
var DisplayAlerts = true;
try {
var ui = SpreadsheetApp.getUi();
}
catch (err) {
DisplayAlerts = false;
}
//Lock access to vars/sheet from triggers
LockService.getScriptLock().waitLock(300000) //max 6min
//generic code to display interactive mode
if (DisplayAlerts) {
ui.alert(`This is een error ${error}`);
}
Logger.log(`This is een error ${error}`)
//Code before leaving function return of end
SpreadsheetApp.flush();
LockService.getScriptLock().releaseLock()
//End Function code
} catch (e) {
SpreadsheetApp.flush();
LockService.getScriptLock().releaseLock()
if (DisplayAlerts) { ui.alert(e); }
Logger.log(e)
}
}
Wanneer je functies schrijft waar user input of velden moeten gecontroleerd worden, zal de reporting ervan verschillen van in welke hoedanigheid je de functie draait.
Indien deze loopt vanuit de add-on menu, kan je gebruik maken van de Scriptapp.ui.prompt interface.
Als je de functie in de script editor draait in debug mode, zal enkel de Logger.log output werken.
Om de programmatie en keuze tussen beide universeel te maken kan je gebruik maken van de volgende code die je vooraan in je script/functies plaatst.
// Alert interface check
var debug = 0
try {
var ui = SpreadsheetApp.getUi();
} catch (e) {
debug = 1
}
Het gebruik kan dan als volgt:
Hierbij wordt gekeken of debug actief , waar dan Logger.log output wordt gebruikt bij de controle van een variabele, zoniet wordt de UI.prompt gebruikt.
debug ? (call1=='' ? Logger.log('call1 not defined'):''):(call1 =='' ? ui.prompt('call1 not defined'):'')