【问题标题】:Call a Google Apps Script function in HTML在 HTML 中调用 Google Apps 脚本函数
【发布时间】:2016-01-15 01:43:08
【问题描述】:

我执教一支运动队并为它建立了一个网站。我想向管理页面添加一个按钮,我可以单击该按钮快速向团队中的每个人发送电子邮件。这封电子邮件的内容类似于:“今天的日程安排已更改,请访问网站了解更多信息。”

我相信通过 Outlook 中的分发列表或其他东西可以更轻松地实现这一点,但我想使用并更好地理解 Google Apps 脚本。

我有一个包含电子邮件地址的 Google 电子表格和一个发送电子邮件的简单脚本函数。

当我在脚本编辑器中单击以运行它时效果很好,但是有没有办法通过一个按钮和一些 JavaScript 从外部网站调用它?

【问题讨论】:

  • 您使用的是 Google 网站吗?您希望它在您的页面上作为小工具运行吗?或者它会是一个具有自己 URL 的独立 web 应用程序?
  • 它不是谷歌网站。我想这将是一个独立的网络应用程序。我只想能够向列表发送大量电子邮件。在我尝试应用程序脚本之前,我研究了将电子邮件地址存储在存储在网络服务器上的 XML 文档中。我希望使用 JS 循环遍历 XML 并调用类似 MAILTO: 的东西,但我没有成功。有没有更好的方法用 javascript 做到这一点?

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


【解决方案1】:

您需要创建一个可以嵌入到您的网站中的 Google UI 对象 - 您将通过创建一个将部署为网络应用程序的脚本来做到这一点。 (请参阅Google Apps Script - Web Apps。)该对象将包含一个按钮,该按钮将调用您现有的脚本函数来发送电子邮件。

发布您的网络应用程序以像您一样执行。对于您的具体情况,您还希望能够访问仅限于您的应用程序。这意味着您创建的 UI Blob 将无法为公众使用。这是非常不完整的,但会生成一个带有单个按钮的 blob,它将触发您的脚本:

function doGet() {
  var app = UiApp.createApplication();

  var button = app.createButton('Send Schedule Change Email');
  app.add(button);

  var handler = app.createServerHandler('myClickHandler');
  button.addClickHandler(handler);

  return app;
}

function myClickHandler(e) {
  var app = UiApp.getActiveApplication();

  // Call your library function, e.g.
  TeamSpreadsheet.sendScheduleChanged();

  var label = app.createLabel('Message Sent')
                 .setId('statusLabel')
                 .setVisible(false);

  label.setVisible(true);

  app.close();
  return app;
}

您的网络应用需要能够访问您现有的脚本,我假设该脚本嵌入在您的电子表格中。这是通过首先保存现有脚本的版本(文件 - 管理版本),然后将其作为库添加到新的 Web 应用程序脚本(资源 - 管理库)来完成的。阅读更多关于图书馆的信息here。由于您的网络应用程序将以您的身份运行,因此您可以将电子表格保密。

注意事项

您的库中的实用程序脚本需要以一种可以在工作表之外工作的方式打开您的电子表格;使用SpreadsheetApp.openById(),而不是SpreadsheetApp.getActiveSpreadsheet()。不幸的是,当您使用它打开主机电子表格时,openById 会呕吐,所以您需要这样的东西:

  var ss = null;
  try {
    // This works for scripts running in the host spreadsheet
    ss = SpreadsheetApp.getActiveSpreadsheet();
  } catch(err) {
    try {
      // This works for web apps
      ss = SpreadsheetApp.openById("SPREADSHEET ID");
    } catch(err) {
      Logger.log("Could not open source spreadsheet.");
      // Well, then, not much sense carrying on, is there?
      return;
    }
  }
  SpreadsheetApp.setActiveSpreadsheet(ss);
  ...

事实上,注意任何依赖调用从“活动”对象获取信息的情况。您可能需要做一些体操来绕过它们。

我发现调试这种类型的安排很痛苦,因为当您尝试跟踪库例程时,应用程序脚本调试器经常报告“服务器错误”。

我希望这可以帮助您入门!

【讨论】:

    【解决方案2】:

    作为对 Mogsdad 回答的补充(非常完整且有趣),我想说您的案例可能会更简单一些,因为您已经有了一个工作脚本。

    使用您的脚本并添加一个 doGet() 函数,就像在 Mogsdad 示例中一样,在按钮上定义一个处理程序,该处理程序将调用您编写的现有函数来发送邮件,在此函数中将 getActiveSpreadsheet() 替换为 SpreadsheetApp.OpenById("the ID of the SS")getActiveSheet() OpenByName() 完成修改。

    然后按照 Mogsdad 的说明进行操作:将脚本部署为与您一样运行的 web 应用程序,并使用提供的 url 从您网站上的链接访问它。

    如果您不想冒任何风险,请在原始电子表格的副本上进行所有这些更改,这样您就可以随时掌握工作模型。 如果您需要更准确的建议(或者遇到一些困难),请随时展示您现有的脚本以获得修改方面的帮助。

    PS:请将此视为一个简单的评论,写在答案中以方便格式化

    【讨论】:

      【解决方案3】:

      只需将您的脚本发布为 Web 应用程序,然后单击按钮即可执行:

      window.open("https://script.google.com/macros/s/<id>/exec");
      

      不知道一年前这是否可行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        相关资源
        最近更新 更多