Search code examples
google-apps-scriptweb-applications

How to handle errors and success at the same time on a Google Apps Script Webapp


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?


Solution

  • 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:

    enter image description here