Google Apps Script - HTML service "createTemplateFromFile" not usable from within App (spreadsheet, etc.)?
Asked Answered
T

1

6

The docs for HtmlService don't state that this shouldn't work, but it seems that the template approach is limited to web app Apps Script projects.

I am attempting to use the HTMLService to create a UI within a SpreadSheet that can take some initial context, and then interact with the sheet. However, a runtime error is thrown when attempting to use "createTemplateFromFile" from within an Apps Script project in the sheet.

"changeDialog" referenced below is a simple file in the Apps Script project with placeholder markup:

<h2> fieldName </h2>

The following code throws an exception "Invalid argument: userinterface" when invoked:

function showSidebar(){

  var html = HtmlService.createTemplateFromFile('changeDialog');
  html.evaluate();

    SpreadsheetApp.getUi() 
      .showSidebar(html);
}

UPDATE: Updated with the actual code that wasn't working. And...answered by [Mogsdad]. All of the template docs show the web page variant, with the "doGet()" method returning the results of ".evaluate()". I thought that the html object carried the internal state of the "evaluate" method. I turns out that you either set that result to another var, or just do the call in line in the .showSideBar(...) method:

  SpreadsheetApp.getUi() 
     .showSidebar(html.evaluate());

or...

  var evaluatedHtml = html.evaluate();
  SpreadsheetApp.getUi() 
      .showSidebar(evaluatedHtml);
Theologize answered 12/11, 2014 at 19:19 Comment(0)
A
6

You need to evaluate() a template to create an HtmlOutput object.

function showSidebar(){

  var html = HtmlService.createTemplateFromFile('changeDialog');

  var a = "test";

    SpreadsheetApp.getUi() 
      .showSidebar(html.evaluate());
                        //////////
}

Since your changeDialog.html file contains no template tags, you could instead create an HTML file from it directly:

function showSidebar(){

  var html = HtmlService.createOutputFromFile('changeDialog');
                               //////

  var a = "test";

    SpreadsheetApp.getUi() 
      .showSidebar(html);
}
Apical answered 12/11, 2014 at 20:25 Comment(2)
I had forgotten to include that in the note above, and it was still generating errors...until I looked at the samples for the Web Page variant. I had been just calling ".evaluate", and then passing "html" into the method. I didn't catch that the .showSideBar and showModalDialog want the result of .evaluate. Thanks for catching that.Theologize
FYI - I was just debugging with the simplest HTML. I will definitely have inline variables, code, callbacks, etc.Theologize

© 2022 - 2024 — McMap. All rights reserved.