1

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

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

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

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

4

3 回答 3

2

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

发布您的 Web 应用程序以像您一样执行。对于您的具体情况,您还希望能够访问仅限于您的应用程序。这意味着您创建的 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 应用程序脚本(资源 - 管理库)来完成的。在此处阅读有关库的更多信息。由于您的网络应用程序将以您的身份运行,因此您可以将电子表格保密。

注意事项

您库中的实用程序脚本将需要以一种可以在工作表外部工作的方式打开您的电子表格;使用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);
  ...

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

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

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

于 2012-12-13T21:27:47.200 回答
1

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

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

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

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

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

于 2012-12-13T22:31:13.820 回答
0

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

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

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

于 2014-08-01T11:07:41.740 回答