google apps script - How can I test a trigger function in GAS? -


google-apps-script supports triggers pass events trigger functions. unfortunately, development environment let test functions no parameter passing, cannot simulate event way. if try, error like:

referenceerror: 'e' not defined. 

one treat event optional parameter, , insert default value trigger function using of techniques "is there better way optional function parameters in javascript?". introduces risk lazy programmer (hands if that's you!) leave code behind, unintended side effects.

surely there better ways?

you can write test function passes simulated event trigger function. here's example tests onedit() trigger function. passes event object information described "spreadsheet edit events" in understanding events.

to use it, set breakpoint in target onedit function, select function test_onedit , hit debug.

/**  * test function onedit. passes event object simulate edit  * cell in spreadsheet.  *  * check updates: https://stackoverflow.com/a/16089067/1677912  *  * see https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events  */ function test_onedit() {   onedit({     user : session.getactiveuser().getemail(),     source : spreadsheetapp.getactivespreadsheet(),     range : spreadsheetapp.getactivespreadsheet().getactivecell(),     value : spreadsheetapp.getactivespreadsheet().getactivecell().getvalue(),     authmode : "limited"   }); } 

if you're curious, written test onedit function google spreadsheet conditional on 3 cells.

here's test function spreadsheet form submission events. builds simulated event reading form submission data. written getting typeerror in onformsubmit trigger?.

/**  * test function spreadsheet form submit trigger functions.  * loops through content of sheet, creating simulated form submit events.  *  * check updates: https://stackoverflow.com/a/16089067/1677912  *  * see https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events  */ function test_onformsubmit() {   var datarange = spreadsheetapp.getactivesheet().getdatarange();   var data = datarange.getvalues();   var headers = data[0];   // start @ row 1, skipping headers in row 0   (var row=1; row < data.length; row++) {     var e = {};     e.values = data[row].filter(boolean);  // filter: https://stackoverflow.com/a/19888749     e.range = datarange.offset(row,0,1,data[0].length);     e.namedvalues = {};     // loop through headers create namedvalues object     // note: namedvalues arrays.     (var col=0; col<headers.length; col++) {       e.namedvalues[headers[col]] = [data[row][col]];     }     // pass simulated event onformsubmit     onformsubmit(e);   } } 

tips

when simulating events, take care match documented event objects close possible.

  • if wish validate documentation, can log received event trigger function.

    logger.log( json.stringify( e , null, 2 ) ); 
  • in spreadsheet form submission events:

    • all namedvalues values arrays.
    • timestamps strings, , format localized form's locale. if read spreadsheet default formatting*, date objects. if trigger function relies on string format of timestamp (which bad idea), take care ensure simulate value appropriately.
    • if you've got columns in spreadsheet not in form, technique in script simulate "event" additional values included, not you'll receive form submission.
    • as reported in issue 4335, values array skips on blank answers (in "new forms" + "new sheets"). filter(boolean) method used simulate behavior.

*a cell formatted "plain text" preserve date string, , not idea.


Comments

Popular posts from this blog

node.js - Bad Request - node js ajax post -

Why does Ruby on Rails generate add a blank line to the end of a file? -

keyboard - Smiles and long press feature in Android -