2012-12-13 72 views
1

我指导一个运动队并为其设置一个网站。我想添加一个按钮到一个管理页面,我可以点击快速发送一封电子邮件给团队中的每个人。这封电子邮件会显示如下内容:“今天的日程安排已更改,请访问网站获取更多信息。”在HTML中调用Google Apps脚本功能

我相信这可以通过Outlook或其他内容中的通讯组列表来实现,但我希望能够更好地理解Google Apps脚本。

我有一个带有电子邮件地址和发送电子邮件的简单脚本功能的Google Spreadsheet。

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

+0

您是否正在使用谷歌网站?你想让它在你的页面上作为一个小工具运行吗?或者它会是一个独立的Web应用程序,拥有自己的URL? –

+1

这不是一个谷歌网站。我想这将是一个独立的网络应用程序。我只想能够发送群发邮件到列表中。在我尝试应用程序脚本之前,我考虑将电子邮件地址存储在Web服务器上存储的XML文档中。我希望使用JS循环XML并调用MAILTO之类的东西:对于每一个,但我没有成功。有没有更好的方式来做到这一点与JavaScript? – Aheinlein

回答

2

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

发布您的网页应用程序以执行您的操作。针对您的具体情况,您还需要访问仅限于您的应用。这将意味着您创建的用户界面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应用程序需要访问你现有的脚本,我以为嵌入您的电子表格。这是通过首先保存现有脚本的一个版本(文件 - 管理版本),然后将其作为库添加到新的Web应用程序脚本(资源 - 管理库)来完成的。阅读更多关于库here。由于您的网络应用将以您的身份运行,因此您可以保留电子表格的私密性。

注意事项

库中的实用程序脚本,将需要的方式,将来自片外工作,打开您的电子表格;使用SpreadsheetApp.openById(),而不是SpreadsheetApp.getActiveSpreadsheet()。不幸的是,openById pukes当你用它来打开主机的电子表格,所以你想是这样的:

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); 
    ... 

事实上,观看上的调用任何依赖摆脱“活动”对象的信息。你可能需要做一些体操来解决它们。

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

我希望能帮助你开始!

1

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

把你的脚本,并添加一个doGet()功能就像Mogsdad例如,定义上的按钮将调用已有的功能处理你写发送邮件,在这个函数替换getActiveSpreadsheet()通过SpreadsheetApp.OpenById("the ID of the SS")getActiveSheet()通过OpenByName()你完成了修改。

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

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

PS:请认为这是一个简单的评论,写在答案格式化的舒适

0

刚刚发布您的脚本的Web应用程序,并在点击一个按钮,excecute:

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

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