I am wondering how the client-server communication with Google Apps Script Webapps works. In the html page I call my functions with
google.script.run.doSomething();
and I can add a
withFailureHandler(onFailure);
OR
withSuccessHandler(onSuccess)
but I can't add both..
So when I want to call a server-side function I normally want to handle the response in the UI ?differently if it is a success than a failure, right? But I want to handle both right? So why do I have to choose between one of them?
Also another problem is that I could not find any information about the actual errors you can have on the server side so that your withFailureHandler(onFailure);
can handle them. Can I just do a throw new Error("everything is broken - tell that the user")
? If there are permission errors, are they handled? How do I generate an error on the server side so that I can handle it on the client side properly?
It is true that the documentation does not specify it clearly, but you can implement both a success and error handler simultaneously
Sample:
<html>
<head>
<base target="_top">
<script>
google.script.run.withSuccessHandler(onSuccess).withFailureHandler(onFailure).getUnreadEmails();
function onSuccess(numUnread) {
var div = document.getElementById('output');
div.innerHTML = 'You have ' + numUnread + ' unread messages in your Gmail inbox.';
}
function onFailure(error) {
var div = document.getElementById('output');
div.innerHTML = "ERROR: " + error.message;
}
</script>
</head>
<body>
<div id="output"></div>
</body>
</html>
UPDATE
To simulate a failure based on the documentaiton sample, change the working code.gs
part
from
function doGet() {
return HtmlService.createHtmlOutputFromFile('Index');
}
function getUnreadEmails() {
return GmailApp.gotInboxUnreadCount();
}
to
function doGet() {
return HtmlService.createHtmlOutputFromFile('Index');
}
function getUnreadEmails() {
return GMailApp.gotInboxUnreadCount();
}
After deploying the WebApp, the html will output: