【问题标题】:Google Apps Scripts - server-side function callingGoogle Apps 脚本 - 服务器端函数调用
【发布时间】:2019-02-01 04:01:02
【问题描述】:

我运行 doGet() 函数。它在电子表格上创建一个模式对话框。它将显示一个“关闭”和“制作复制”按钮,后者将在其中运行一个服务器端函数 doSomething(),该函数制作一个模板的副本。无论我是将函数附加到按钮还是直接在脚本标签中运行,它都拒绝运行。无论如何要修复或至少调试这个?

代码.gs

function doGet() {
  return SpreadsheetApp.getUi().showModalDialog(HtmlService.createHtmlOutputFromFile('Index'), 'Report');
}

function doSomething() {
  var file = template.makeCopy();
  file.setName('NEW FILE NAME')
  google.script.host.close()
}

Index.html

    <!DOCTYPE html>
    <html>
      <head>
        <base target="_top">
        <script>
            google.script.run.doSomething()
        </script>
      </head>
      <body>
          <input type="button" value="Close" onclick="google.script.host.close()"/>
          <input type="button" value="Make Copy" onclick="google.script.run.doSomething();" />
      </body>
    </html>

【问题讨论】:

  • 我不确定 templatevarialbe 在您的情况下是否可以是全局的。我觉得@tehhowch 也指出了一件好事
  • 检查 Stackdriver 是否存在未处理的异常。请注意,doGet 是用于访问已发布 web 应用程序的触发器,而不是侧边栏,并且可能无法访问您的 UI 实例。

标签: html google-apps-script serverside-javascript


【解决方案1】:
  1. doGet() 是 Web 应用程序的保留字。
  2. SpreadsheetApp.getUi 只能用于有界项目
  3. google.script.host.close() 是一种客户端方法,仅适用于对话框和侧边栏,不适用于网络应用。

建议:

由于您的项目是有界项目,

  • 更改 doGet() 函数的名称。
  • 从 doSomething() 中删除 google.script.host.close()
  • 删除

    <script>
        google.script.run.doSomething()
    </script>
    
  • 完成上述更改后,添加菜单以调用重命名的函数。如果仍然无法正常工作,请在浏览器控制台中查找错误以查找客户端错误,并在 Stackdriver 日志中查找服务器端错误。

行情

doGet(e) 在用户访问 Web 应用或程序向 Web 应用发送 HTTP GET 请求时运行。


google.script.host 是一种异步客户端 JavaScript API,可以与包含 HTML-service pages 的 Google 文档、表格或表单中的对话框或侧边栏进行交互。要从客户端代码执行服务器端功能,请使用google.script.run。如需更多信息,请参阅guide to communicating with server functions in HTML service

参考文献

【讨论】:

    【解决方案2】:

    在 Apps Script 中,doGet() 和 doPost() 函数严格用于向基于 GAS 的 Web 应用程序发送 HTTP 请求。电子表格绑定的脚本可以作为网络应用程序发布 - 但是,根据文档

    要使用 HTML 服务创建 Web 应用程序,您的代码必须包含 doGet() 函数告诉脚本如何提供页面。这 函数必须返回一个 HtmlOutput 对象,如本例所示。

    在您的情况下,showModalDialog() 方法返回“void”。还有,

    与 Web 应用程序不同,它是一个脚本,用于创建用户界面 文档、电子表格或表单不需要 doGet() 函数 具体来说,您不需要保存脚本的版本或 部署它。相反,打开用户界面的函数必须 将您的 HTML 文件作为 HtmlOutput 对象传递给 showModalDialog()) 或活动文档的 Ui 对象的 showSidebar() 方法, 表格或电子表格。

    长话短说,您无需将脚本部署为网络应用。相反,您应该将 UI 构建代码直接放入主函数中,最后将该函数绑定到按钮。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多