/** * Invokes a function, performing up to 5 retries with exponential backoff. * Retries with delays of approximately 1, 2, 4, 8 then 16 seconds for a total of * about 32 seconds before it gives up and rethrows the last error. * See: https://developers.google.com/google-apps/documents-list/#implementing_exponential_backoff

Examples:

//Calls an anonymous function that concatenates a greeting with the current Apps user's email
var example1 = GASRetry.call(function(){return "Hello, " + Session.getActiveUser().getEmail();});
//Calls an existing function
var example2 = GASRetry.call(myFunction);
//Calls an anonymous function that calls an existing function with an argument
var example3 = GASRetry.call(function(){myFunction("something")});
//Calls an anonymous function that invokes DocsList.setTrashed on myFile and logs retries with the Logger.log function.
var example4 = GASRetry.call(function(){myFile.setTrashed(true)}, Logger.log);
* * @param {Function} func The anonymous or named function to call. * @param {Function} optLoggerFunction Optionally, you can pass a function that will be used to log to in the case of a retry. For example, Logger.log (no parentheses) will work. * @return {*} The value returned by the called function. */ function call(func, optLoggerFunction) { for (var n=0; n<6; n++) { try { return func(); } catch(e) { if (optLoggerFunction) {optLoggerFunction("GASRetry " + n + ": " + e)} if (n == 5) { throw e; } Utilities.sleep((Math.pow(2,n)*1000) + (Math.round(Math.random() * 1000))); } } }