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

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

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

Основы

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

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

перенаправляет

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