CHEWWWWWWWWWW
CHEWWWWWWWWWW

Reputation: 169

Google Apps Scripts - server-side function calling

I run the doGet() function. It creates a modal dialog on a spreadsheet. It will show a "Close" and "Make Copy" button where the latter will run a server-side function, doSomething(), that makes a copy of a template. Regardless of whether I attach the function to a button or run it straight in a script tag, it refuses to run. Is there anyway to fix or at the least debug this?

Code.gs

function doGet() {
  return SpreadsheetApp.getUi().showModalDialog(HtmlService.createHtmlOutputFromFile('Index'), 'Report');
}

function doSomething() {
  var file = template.makeCopy();
  file.setName('NEW FILE NAME')
  google.script.host.close()
}

Index.html

    <!DOCTYPE html>
    <html>
      <head>
        <base target="_top">
        <script>
            google.script.run.doSomething()
        </script>
      </head>
      <body>
          <input type="button" value="Close" onclick="google.script.host.close()"/>
          <input type="button" value="Make Copy" onclick="google.script.run.doSomething();" />
      </body>
    </html>

Upvotes: 0

Views: 1987

Answers (2)

Wicket
Wicket

Reputation: 38130

  1. doGet() is a reserved word for web apps.
  2. SpreadsheetApp.getUi only could be used on bounded projects
  3. google.script.host.close() is a client-side method that only works for dialogs and sidebars not for web apps.

Suggestions:

As your project is a bounded project,

  • change the name of the doGet() function.
  • Remove google.script.host.close() from doSomething()
  • Remove

    <script>
        google.script.run.doSomething()
    </script>
    
  • Once you make the above changes add menu to call your renamed function. If still doesn't work look for errors at the browser console for client-side errors and to Stackdriver logs for server-side errors.

Quotes

doGet(e) runs when a user visits a web app or a program sends an HTTP GET request to a web app.


google.script.host is an asynchronous client-side JavaScript API that can interact with dialogs or sidebars in Google Docs, Sheets, or Forms that contain HTML-service pages. To execute server-side functions from client-side code, use google.script.run. For more information, see the guide to communicating with server functions in HTML service.

References

Upvotes: 1

Anton Dementiev
Anton Dementiev

Reputation: 5706

In Apps Script, the doGet() and doPost() functions are strictly for sending HTTP requests to GAS-based web apps. Spreadsheet-bound scripts can be published as web apps - however, according to the docs

To create a web app with the HTML service, your code must include a doGet() function that tells the script how to serve the page. The function must return an HtmlOutput object, as shown in this example.

In your case, the showModalDialog() method returns 'void'. Also,

Unlike a web app, a script that creates a user interface for a document, spreadsheet, or form does not need a doGet() function specifically, and you do not need to save a version of your script or deploy it. Instead, the function that opens the user interface must pass your HTML file as an HtmlOutput object to the showModalDialog()) or showSidebar() methods of the Ui object for the active document, form, or spreadsheet.

Long story short, you don't need to deploy your script as a web app. Instead, you should put the UI building code directly into your main function and, finally, tie that function to the button.

Upvotes: 0

Related Questions