Skip to content
Advertisement

Assign link to HTML button on GAS

UPDATE: Thank you everyone for your help, especially ale13. I have updated the question with the final code that worked for me.

I am trying to create a HTML button that pops up within my Google Sheets and on click it should trigger the download of the sheet. I created the button and everything else runs perfectly. When I manually get the link generated and click on it, the file downloads. However, when I click on the button, nothing happens.

This is the code to launch the HTML.

function downloadPopup(){
  var html = HtmlService.createHtmlOutputFromFile('Button');
  SpreadsheetApp.getUi().showModalDialog(html, 'Download Lists as CSV');
}

Setting and getting the property

PropertiesService.getScriptProperties().setProperty('urlD', downloadURL);
function urlHTML(){
  return PropertiesService.getScriptProperties().getProperty('urlD');
}

This is the HTML

<!DOCTYPE html>
<html>
  <head>
    <base target="_center">
  <style>
.
.
.
</style>
  </head>
  <script>
    var downloadURL = PropertiesService.getScriptProperties().getProperty('urlD');
    function downloadFile(downloadURL){
      window.open(downloadURL);
    }
  </script>
  <body>
    <div id="buttonlink"></div>
    <button type="button" onclick="google.script.run.withSuccessHandler(downloadFile).urlHTML()" class="button">Download CSV</button>
  </body>
</html>

Thanks a lot!

Advertisement

Answer

I suggest you modify the code as following:

Code.gs

function downloadPopup(){
  var html = HtmlService.createHtmlOutputFromFile('Button');
  SpreadsheetApp.getUi().showModalDialog(html, 'Download Lists as CSV');
}

function urlHTML(){
  return downloadURL;
}

Button.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_center">
  <style>
</style>
  </head>
  <script>
    function downloadFile(downloadURL){
      window.open(downloadURL, '_self');
    }
  </script>
  <body>
   <div id="buttonLink"></div>
   <button type="button" onclick="google.script.run.withSuccessHandler(downloadFile).urlHTML()">Preview The Document</button>
  </body>
</html>

Unless you really need two distinct functions for returning URL, I would suggest you to use just one which will return the URL directly when called. As a side note, it is important to bear in mind that Apps Script’s global variables are different in comparison to the ones in other programming languages – each new invocation of the functions will end up returning a new context to the script without memory of earlier executions unless these were kept. For storing a global variable correctly, I suggest you take a look at this class.

As for the HTML part, when the button is being clicked, the withSuccessHandler(downloadFile) allows you to specify a client-side callback function to run when the urlHTML() server function responds. In order to open the link in a new window, the window.open has been used.

Reference

User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement