以HTML格式调用Google Apps脚本功能

时间:2012-12-13 19:47:48

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

我指导一个运动队并为其建立一个网站。我想在管理页面添加一个按钮,我可以点击该按钮快速向团队中的每个人发送电子邮件。这封电子邮件会说:“今天的日程安排已经改变,请访问网站了解更多信息。”

我确信通过Outlook中的分发列表可以更轻松地实现这一点,但我希望使用并更好地了解Google Apps脚本。

我有一个Google电子表格,其中包含电子邮件地址和一个发送电子邮件的简单脚本功能。

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

3 个答案:

答案 0 :(得分:2)

您需要创建一个可以嵌入网站的Google UI对象 - 您可以通过创建一个将部署为Web应用程序的脚本来完成此操作。 (请参阅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);
  ...

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

我发现调试这种类型的安排很痛苦,因为当你试图追踪到一个库例程时,app-script调试器经常报告“服务器错误”。

我希望有助于您入门!

答案 1 :(得分:1)

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

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

之后按照Mogsdad说明操作:将脚本部署为运行的webapp,并使用提供的URL从您网站上的链接访问它。

如果您不想承担任何风险,请在原始电子表格的副本上进行所有这些更改,以便始终保持工作模式。 如果您想要更准确的建议(或者如果遇到一些困难),请随时出示您现有的脚本以获得一些修改方面的帮助。

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

答案 2 :(得分:0)

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

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

唐不知道一年前这是否可能。