Google Apps脚本Web App serverHandler输出中缺少嵌入式Javascript

时间:2013-07-23 15:31:17

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

我正在尝试将一些JavaScript嵌入到作为Web应用程序运行的Google Apps脚本的输出中,但我找不到任何有关我的脚本标记或输出中jQuery加载的证据,所以我认为它我认为,Caja已经被剥夺了。

我通过从文件创建HTMLOutputObject来添加JavaScript,如下所示:

app.add(app.createHTML(HtmlService.createHtmlOutputFromFile("order_form_javascript").getContent()));

也许值得一提的是,javascript是以这种方式添加到附加到listBox更改事件的serverHandler中 - 而不是在初始的doGet()函数中 - 我不确定这是否会产生影响。

order_form_javascript.html文件的内容为:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<h3>Javascript!</h3>
<script type="text/javascript">
alert ("script ran");
$(function() {
  alert ("function ran");
  $('.order_table tr:hidden').show();
});

</script>

输出中的H3标记 ,但没有出现脚本标记,没有弹出警告框,jQuery未定义。

我在Caja playground上尝试了这个代码,它似乎有效。所以我认为我必须错误地插入javascript,或者遗漏一些明显的东西。

提前感谢您提出的任何建议。

2 个答案:

答案 0 :(得分:0)

我对Apps脚本并不熟悉,但看起来您正试图在同一页面中混合使用Ui服务(addcreateHTML)和Html服务。这不受支持 - 您必须为整个页面选择一个或另一个。


关于故障排除的附注:Caja 从不插入您在DOM中编写的脚本(这样做会破坏沙箱)。在NATIVE sandbox mode中,您可能会看到<script>元素包含空或存根内容。因此,缺少脚本本身并不表示存在问题。

答案 1 :(得分:0)

根据Kevin Reids的提示,Caja无论如何都不会显示脚本标签,因为这会破坏沙盒,并且HtmlService和UiService可能在同一个脚本中不兼容,我将代码更新为以下内容:

var js = HtmlService.createHtmlOutputFromFile("order_form_javascript").getContent();

Logger.log(js); //check that HtmlService generates the script properly.

app.add(app.createHTML(js));

查看日志,我可以清楚地看到HtmlService逐字地返回我的HTML文件的内容:

[13-07-24 10:02:28:879 BST] <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<h3>Javascript!</h3>
<script type="text/javascript">
alert ("script ran");
$(function() {
  alert ("function ran");
  $('.order_table tr:hidden').show();
});

</script>

这让我觉得也许我可以使用这种方法输出任意HTML而不用在代码中全部写出来,但我离题了。

这引导我使用app.createHTML([String])方法,根据the documentation here HTML小部件实际上不能包含<script>标记。这就是他们被剥夺的地方。事实证明我应该阅读手册。多么尴尬。

我能想到的两种可能的解决方案是;

  • 使用HtmlService而不是UiService重新编写我的Web应用程序,我认为这将允许项目中HTML文件中更多的任意html和脚本。
  • 由于我的JavaScript将是事件驱动的并且非常简单,我还可以use a clientHandler执行必要的操作并继续使用UiService作为我的Web应用程序。

我将从clientHandler方法开始。