Matt Hessinger
Matt Hessinger

Reputation: 137

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

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

Upvotes: 6

Views: 8174

Answers (1)

Mogsdad
Mogsdad

Reputation: 45760

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

Upvotes: 6

Related Questions