Контент-сервис

Когда скрипт публикуется как веб-приложение, специальные функции обратного вызова doGet() и doPost() вызываются каждый раз, когда делается запрос к URL-адресу скрипта. Вместо возврата объекта пользовательского интерфейса, созданного с помощью службы HTML , службу содержимого можно использовать для возврата необработанного текстового содержимого. Это позволяет вам писать сценарии, которые действуют как «сервисы», отвечая на запросы GET и POST и предоставляя данные различных типов MIME.

Основы

Вот простой пример службы контента:

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

Разверните сценарий как веб-приложение , выполнив те же действия, что и при обслуживании пользовательского интерфейса. Когда к URL-адресу сценария делается запрос GET , текст Hello, world! будет возвращен. Помимо обычного текста, служба также поддерживает возврат содержимого ATOM, CSV, iCal, JavaScript, JSON, RSS, vCard и XML.

Обслуживание RSS-каналов

Давайте попробуем что-нибудь посложнее, например фильтрацию RSS-канала. Комиксы XKCD всегда забавны, но вы не сможете понять всю шутку, если не наведете курсор на комикс, чтобы увидеть дополнительный замещающий текст. К сожалению, вы не можете навести курсор на мобильный браузер, поэтому это не работает.

Допустим, мы хотели отредактировать ленту так, чтобы дополнительная изюминка была непосредственно в ленте, и вместо того, чтобы наводить курсор, вы просто прокручивали немного вниз, чтобы увидеть ее. Это будет отлично работать на мобильном устройстве. Вот код:

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

Это может показаться сложным, но оно разбивается на простые части. Мы используем службу URL Fetch для получения исходного RSS-канала XKCD. Затем мы используем стандартное регулярное выражение JavaScript для выполнения необходимых нам замен. Наконец, мы помещаем отредактированный канал в объект TextOutput и устанавливаем тип MIME на RSS.

Чтобы увидеть это в действии, опубликуйте сценарий как веб-приложение, обязательно разрешив анонимный доступ (поскольку ваша программа чтения RSS будет посещать его как анонимный пользователь). Затем добавьте URL-адрес службы (а не исходный RSS-канал) в программу чтения 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);
}

Как и раньше, опубликуйте это как анонимное веб-приложение, чтобы оно заработало. В этом случае пользователи вашего нового сервиса смогут использовать его, добавив параметры URL-адреса в конец URL-адреса сервиса. Параметры start и end задают диапазон времени для проверки, указанный в стандартной эпохе 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 которого является URL-адресом вашей службы, с дополнительным параметром prefix . Это имя функции в клиентском JavaScript, которая будет вызываться со значением, возвращаемым службой.

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

В этом примере будет показано окно сообщения в браузере с выводом службы, поскольку в качестве префикса мы указываем встроенную функцию alert() браузера. Возвращенный код JavaScript будет выглядеть так:

alert({"available":true})

Перенаправления

По соображениям безопасности контент, возвращаемый службой контента, не передается с script.google.com , а перенаправляется на одноразовый URL-адрес script.googleusercontent.com . Это означает, что если вы используете службу контента для возврата данных в другое приложение, вы должны убедиться, что HTTP-клиент настроен на отслеживание перенаправлений. Например, в утилите командной строки cURL добавьте флаг -L . Дополнительную информацию о том, как включить это поведение, см. в документации вашего HTTP-клиента.