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);

1 Answer 1

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);
}
Sign up to request clarification or add additional context in comments.

2 Comments

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.
FYI - I was just debugging with the simplest HTML. I will definitely have inline variables, code, callbacks, etc.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.