【问题标题】:google closure library usage from google app scripts using HtmlService使用 HtmlService 从谷歌应用脚​​本中使用谷歌关闭库
【发布时间】:2012-11-08 20:57:42
【问题描述】:

是否可以通过 HtmlService 从 google app 脚本访问 google 闭包库函数? google 脚本中的 html 文件似乎过滤掉了与闭包库相关的任何内容。

项目:我正在使用 HtmlService 从 Google 应用脚本中探索 Google Closure 库中的 DOM 操作实用程序。我打算将其作为独立的网络应用程序运行。

闭包函数在从本地客户端环境直接加载到浏览器时起作用 - 但在通过 HtmlService 实用程序从 GAS 应用程序注入时不起作用。

这是我在 GAS 中使用的代码。

html文件

<html>
  <head>
  <script src="http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js"></script>
  <script>
    goog.require('goog.dom');
    function c_sayHi() {
      var newHeader = goog.dom.createDom('h1', {'style': 'background-color:#EEE'},'Hello world!');
      goog.dom.appendChild(document.body, newHeader);
    }
  </script>
  </head>

  <script>
    function c_updateButton(date, button) {
      button.value = "clicked at " + date;
    }
  </script>

  <body onload="c_sayHi()">
    <input type='button' value='Never Clicked'
    onclick='google.script.run.withSuccessHandler(c_updateButton).withUserObject(this).s_getCurrentDate()'>

    <input type='button' value='Never Clicked'
    onclick='google.script.run.withSuccessHandler(c_updateButton).withUserObject(this).s_getCurrentDate()'>
  </body>
</html>

谷歌脚本文件

function s_getCurrentDate() {
  return new Date().toString();
}

function doGet(e) {
  return HtmlService.createTemplateFromFile('hello').evaluate();
}

我为客户端函数添加了前缀 c_,为服务器端 fns 添加了前缀。将其作为 Web 应用程序运行时,

  1. 函数 c_sayHi 无效 - 我不确定它是否被调用。

  2. 函数 s_getCurrentDate 和 c_updateButton 可以正常工作,如 google 文档 https://developers.google.com/apps-script/html_service 中所述。

有没有办法让闭包库像上面尝试的那样从网络应用程序中工作?

【问题讨论】:

    标签: google-apps-script google-closure-library


    【解决方案1】:

    这里有几件事 -

    1. 所有 .gs 文件都是在服务器端运行的 JavaScript。所以 DOM 在那里并不真正相关。
    2. 您可以通过在 HtmlService 中返回代码来运行客户端 JavaScript。这就是我相信你想要做的。然而,jQuery 是这种方法中最受支持的库。闭包最终可能会起作用,但团队并未专门针对该库进行测试。

    【讨论】:

    • 谢谢 Arun,你是对的 - 我正在尝试通过 HtmlService 生成客户端 java 脚本。与 Closure 相比,jQuery 对我来说有点令人生畏,这对我来说似乎更简单、更直接地遵循代码逻辑。我还没有找到太多关于我们如何使用 GAS 的闭包库的文档。你知道任何使用闭包的 GAS 示例吗?
    • 观看此视频 - youtube.com/watch?v=tcl24asytos 并阅读此页面中的 Caja 部分 - developers.google.com/apps-script/html_service。您将看到的一件事是您不能注入像onloadonclick 这样的动态JS。我真的建议在处理 Apps Script 时坚持使用 jQuery 而不是 Closure,因为您会发现更多示例。
    【解决方案2】:

    问题是Closure的依赖结构是在window load事件之前执行的,否则不会起作用。因此,任何 require 和 provide 语句都会在窗口加载之前得到处理。当您通过 HTML 服务注入它们时,您会强制它们在所需的不同阶段执行,这会导致一切失败。

    如果您将使用已编译的 Closure 库源,则运行 Closure 不会有任何问题。了解如何使用 Compiler 和 Builder 使 Closure 正常工作。此外,您可以使用延迟加载来模拟您的 HTML 服务。

    有了它,你可以让 javascript 在点击、onload 或任何你想要的东西时动态加载。这称为延迟加载,它被用作所有大型 Web 应用程序的标准做法。通过 Gmail 或 Facebook 浏览时监控 Firebug 的网络选项卡。

    Arun Nagarajan 是对的,jQuery 是更简单的解决方案但是如果您正在做一些需要广度、规模和速度的适当的事情,那么 jQuery 是孩子们的玩具。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多