内容服务

将脚本作为 Web 应用发布时,每当有人向脚本的网址发出请求时,系统都会调用特殊的回调函数 doGet()doPost()。您可以使用内容服务返回原始文本内容,而不是返回使用 HTML 服务创建的界面对象。这样,您就可以编写充当“服务”的脚本,以响应 GETPOST 请求,以及传送各种 MIME 类型的数据。

基础知识

以下是 Content 服务的一个简单示例:

function doGet() {
  return ContentService.createTextOutput('Hello, world!');
}

将脚本部署为 Web 应用,步骤与提供界面时相同。向脚本网址发出 GET 请求时,系统将返回文本 Hello, world!。除了纯文本之外,该服务还支持返回 ATOM、CSV、iCal、JavaScript、JSON、RSS、vCard 和 XML 内容。

投放 RSS Feed

我们来试试更复杂的操作,比如过滤 RSS Feed。XKCD 漫画一直都很有趣,但除非将鼠标悬停在连环漫画上,才能看到额外的替代文本,否则无法了解完整的笑话。很遗憾,由于无法悬停在移动浏览器上,因此该功能不起作用。

假设我们想对 Feed 进行修改,让额外的摘要信息直接显示在 Feed 中,而不是将鼠标悬停在 Feed 上,只需向下滚动一点即可查看。这样在移动设备上就可以了。代码如下:

function doGet() {
  var feed =  UrlFetchApp.fetch('http://xkcd.com/rss.xml').getContentText();
  feed = feed.replace(
    /(<img.*?alt="(.*?)".*?>)/g,
    '$1' + new Array(10).join('<br />') + '$2');
  return ContentService.createTextOutput(feed)
    .setMimeType(ContentService.MimeType.RSS);
}

这可能看起来很难,但可以细分为几个简单的部分。我们使用网址提取服务来提取原始 XKCD RSS Feed。然后,我们使用标准的 JavaScript 正则表达式进行所需的替换。最后,我们将修改后的 Feed 封装在 TextOutput 对象中,并将 MIME 类型设置为 RSS。

若要查看其实际效果,请将脚本作为 Web 应用发布,确保允许匿名访问(因为 RSS 读者将以匿名用户身份访问)。然后将服务的网址(而非原始 RSS Feed)添加到您的 RSS 阅读器,或者直接在网络浏览器中访问该网址。就是这样!

从脚本传送 JSON

我们还可以使用内容服务做些什么?如何将 JSON 传送给其他脚本或其他网站和服务呢!下面是一个简单的脚本,它实现了一项服务,任何人都可以使用该服务查看日历空档是否在特定时间开放。

function doGet(request) {
  var events = CalendarApp.getEvents(
    new Date(Number(request.parameters.start) * 1000),
    new Date(Number(request.parameters.end) * 1000));
  var result = {
    available: events.length == 0
  };
  return ContentService.createTextOutput(JSON.stringify(result))
    .setMimeType(ContentService.MimeType.JSON);
}

与之前一样,将其发布为匿名 Web 应用,使其正常运行。在这种情况下,新服务的用户可以通过在服务网址末尾添加网址参数来使用该服务。startend 参数提供了要检查的时间范围,以标准 Unix 纪元格式指定。

curl -L URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000

该服务将返回 JSON,用于报告您的日历中是否有该范围内的任何内容。

{"available":true}

在网页中提供 JSONP

只需稍作更改,您的 JSON 服务便可变为 JSONP,这意味着,您可以通过浏览器中的 JavaScript 调用该服务。新脚本如下:

function doGet(request) {
  var events = CalendarApp.getEvents(
    new Date(Number(request.parameters.start) * 1000),
    new Date(Number(request.parameters.end) * 1000));
  var result = {
    available: events.length == 0
  };
  return ContentService.createTextOutput(
    request.parameters.prefix + '(' + JSON.stringify(result) + ')')
    .setMimeType(ContentService.MimeType.JAVASCRIPT);
}

如需从浏览器调用此服务,请创建一个脚本标记,其 src 属性是服务的网址,并添加一个名为 prefix 的附加参数。这是客户端 JavaScript 中通过服务返回的值调用的函数的名称。

<script src="URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000&prefix=alert"></script>

此示例将在浏览器中显示一个包含服务输出的消息框,因为我们将浏览器的内置 alert() 函数指定为前缀。返回的 JavaScript 代码如下所示:

alert({"available":true})

重定向

出于安全考虑,内容服务返回的内容不是通过 script.google.com 提供的,而是重定向到一个一次性网址(即 script.googleusercontent.com)。这意味着,如果您使用内容服务将数据返回到其他应用,则必须确保 HTTP 客户端配置为遵循重定向。例如,在 c网址 命令行实用程序中,添加 -L 标志。如需详细了解如何启用此行为,请查看您的 HTTP 客户端的文档。