Google Script Run Improve Performance with frontend calls in Apps Script

Viewed 50

I'm struggling with Apps Script's google.script.run response time. There is a function that returns user permission as boolean: initFunction() { // function code } returns true.

Some divs in my frontend are showing based on the initFunction boolean, and I don't know why the callback time is soo slow (like 4-5 seconds)

INDEX.HTML

<script>
  function check_permission () {
    google.script.run.withSuccessHandler(function(data){
      if (data === true) {
          document.getElementById('hidden_div').style.display = 'block';
      } else {
        document.getElementById('hidden_div').style.display = 'none';
      }
    }).initFunction();
  }

  document.addEventListener('DOMContentLoaded', () => { check_permission() });
</script>

I've tried calling initFunction just after sidebar load function just to check the function time and it returns true in 0.5 seconds, so it's not about the function, i suppose it's about google.script.run

function sidebarLoad() {
  let route = HtmlService.createTemplateFromFile('index').evaluate();
  SpreadsheetApp.getUi().showSidebar(route);
  let permission = initFunction(); SpreadsheetApp.getUi().alert(permission)
}

How could I solve this and reduce response time?

Edits: after reading your comments I still don't know where is the problem but i've been doing tests and:

  • When calling the function from onclick event, the time response is very fast, so it's not about the function itself.
  • Answering @TheMaster, my start criteria for time response is when pressing the menu ui button that opens my GAS sidebar. The DOMContentLoaded function triggers immediately, I know because I changed the google.script.run in check_permission function with any other javascript code and it's loaded quicky. So I suppose it's not about DOMContent loading slowly.
  • If I click a button in the loaded html page that calls the function check_permission() I also get the results immediately. I only get the slow response time when google.script.run is triggered by DOMContentLoaded listenerEvent.
1 Answers

Try using templated html and load user permission as a global into the template before it's rendered.

function myFunction() {
  let temp = HtmlService.createTemplateFromFile('filename');
  temp.protection = initFunction();
  let html = temp.evaluate();
}

Then in the html protection is a global variable and you can distribute it with scriptlets

Pushing variables into templates

Related