应用脚本 - 无法在html模板的js函数中使用google.script.run吗?

时间:2014-11-18 18:45:58

标签: javascript google-apps-script google-sheets

更新:这是完全可能的。我只是在异步方法完成之前关闭主机窗口。我的解释是,即使UI被关闭,运行上下文也会持续存在。不。

我想确认是否可以通过google.script.run从HTMLService加载的HTML模板中的JavaScript函数中调用电子表格容器绑定项目中的Apps脚本功能。我最初的发现表明“不”(见下文),但我可能会遗漏一些东西。

google.script.run调用,当从onclick处理程序调用的JS函数中调用时,始终路由到错误处理函数,并出现以下错误代码: NetworkError:由于HTTP 0导致连接失败< /强>

如果我直接从按钮的onclick处理程序调用google.script.run代码,它就会运行。我希望能够在一个函数中使用它,这样我就可以建立一组数据来传递给我正在计划实现的实际方法。

我查看了使用Google登录的this bug,但在这个简单的测试中,我没有引用库。

以下是更多细节: - 新版表格 - 使用最简单的代码创建的新电子表格和AS项目,以重新创建问题。

我在容器绑定项目的应用程序脚本文件中有以下代码:

function onOpen() 
{
   var testMenu = SpreadsheetApp.getUi() 
      .createMenu('Custom Menu');

      testMenu.addItem('Show UI in sidebar', 'showSidebar');
      testMenu.addToUi();
};

function showSidebar(){
  var html = HtmlService.createTemplateFromFile('simpleDialog');
  SpreadsheetApp.getUi().showSidebar(html.evaluate());
}

function doWorkInAppsScriptFile()
{
    Logger.log("doWorkInAppsScriptFile called.");
}

在“SimpleDialog”html文件中,也是在Apps脚本项目中,我有以下测试代码:

<h2>google script run test</h2>
<div style="width:98%;margin:10px">
    <div style="width:98%;margin:10px;padding:10px;text-align:center">
        <input type="button"  id="saveButton" onclick="onSave()" value="Save" style="background:DarkGreen;color:White;font-weight:bold;margin:10px"/>
    </div>
</div>

<script type="text/javascript">

function onSave(){          
  google.script.run.withFailureHandler(onFailure).doWorkInAppsScriptFile();     
  //Moving the following line to an onSuccess handler, and calling .withSuccessHandler,
  // allows the code to close the window appropriately. Leaving this in causes the error discussed in this q.    
  google.script.host.close();
}

function onFailure(error)
{
    alert("onFailure: " + error);
}

</script>

2 个答案:

答案 0 :(得分:2)

这里的罪魁祸首是onSave()函数中的这一行:

google.script.host.close();

删除/评论此行,脚本运行正常。您看到的错误是因为您关闭了该行的侧栏,切断了与服务器端脚本的连接。

如果确实需要在onSave()执行完毕后关闭侧边栏,请将该行移至成功处理程序回调:

function onSave(){          
  google.script.run
    .withSuccessHandler(onSuccess)
    .withFailureHandler(onFailure)
    .doWorkInAppsScriptFile();        
}

function onSuccess(data) 
{
  // do something with returned data
  // close the sidebar
  google.script.host.close();
}

function onFailure(error)
{
  alert("onFailure: " + error);
}

答案 1 :(得分:-1)

您可以使用:{/ p>而不是HtmlService.createTemplateFromFile

 HtmlService.createHtmlOutputFromFile('simpleDialog');

您可以在此处找到有关此功能的更多信息https://developers.google.com/apps-script/guides/html/