Usługa treści

Jeśli skrypt został opublikowany jako aplikacja internetowa, specjalne funkcje wywołania zwrotnego doGet() i doPost() są wywoływane po każdym wysłaniu żądania na adres URL skryptu. Zamiast zwracać obiekt interfejsu utworzony za pomocą usługi HTML, usługę treści można wykorzystać do zwrócenia nieprzetworzonej treści tekstowej. Dzięki temu możesz tworzyć skrypty działające jak „usługi”, które odpowiadają na żądania GET i POST oraz wyświetlają dane różnych typów MIME.

Podstawy

Oto prosty przykład usługi treści:

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

Wdróż skrypt jako aplikację internetową, wykonując te same czynności co w przypadku obsługi interfejsu użytkownika. Po wysłaniu żądania GET do adresu URL skryptu zwracany jest tekst Hello, world!. Oprócz zwykłego tekstu usługa obsługuje też zwracanie treści ATOM, CSV, iCal, JavaScript, JSON, RSS, SVG i XML.

Udostępnianie kanałów RSS

Spróbujmy coś bardziej skomplikowanego, jak filtrowanie kanału RSS. Komiksy XKCD są zawsze zabawne, ale nie poznasz ich całej, dopóki nie najedziesz kursorem na komiks i zobaczysz dodatkowy tekst alternatywny. Niestety to nie zadziała, nie możesz najechać kursorem na przeglądarkę mobilną.

Załóżmy, że chcemy zmienić kanał w taki sposób, aby dodatkowe puenty były widoczne bezpośrednio w kanale, a nie najeżdżać kursorem na ekran, aby je zobaczyć. Na urządzeniu mobilnym działałoby to dobrze. Oto kod:

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

Może się to wydawać skomplikowane, ale dzieli się na proste części. Do pobierania oryginalnego kanału RSS XKCD używamy usługi pobierania adresów URL. Następnie używamy standardowego wyrażenia regularnego JavaScript w celu wykonania potrzebnych zamienników. Na koniec pakujemy edytowany kanał do obiektu TextOutput i ustawiamy typ MIME na RSS.

Aby zobaczyć, jak to działa, opublikuj skrypt jako aplikację internetową, zezwalając na dostęp anonimowy (ponieważ czytnik RSS będzie odwiedzał ją jako użytkownik anonimowy). Następnie dodaj adres URL usługi (nie oryginalnego kanału RSS) do czytnika RSS lub otwórz ją bezpośrednio w przeglądarce. Znakomicie.

Udostępnianie kodu JSON ze skryptów

Co jeszcze możemy zrobić za pomocą usługi treści? A co z udostępnianiem plików JSON innym skryptom, witrynom i usługom. Oto prosty skrypt implementujący usługę, dzięki której każdy może sprawdzić, czy dany przedział czasu w kalendarzu jest otwarty o określonej godzinie.

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

Tak jak wcześniej, opublikuj ją jako anonimową aplikację internetową, aby działała. W tym przypadku użytkownicy nowej usługi mogą z niej korzystać, dodając parametry adresu URL na końcu adresu URL usługi. Parametry start i end określają zakres czasowy do sprawdzenia, który jest określony dla standardowej epoki uniksowej.

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

Usługa zwróci plik JSON z informacją, czy w kalendarzu masz jakiekolwiek wpisy w tym zakresie.

{"available":true}

Udostępnianie formatu JSONP na stronach internetowych

Po niewielkiej zmianie usługa JSON może zmienić się w JSONP, co oznacza, że będzie można ją wywoływać z JavaScriptu w przeglądarce. Oto nowy skrypt:

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

Aby wywołać tę usługę w przeglądarce, utwórz tag skryptu, którego atrybut src to adres URL usługi z dodatkowym parametrem o nazwie prefix. Jest to nazwa funkcji w swoim kodzie JavaScript po stronie klienta, która zostanie wywołana z wartością zwracaną przez usługę.

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

W tym przykładzie wyświetli się w przeglądarce pole komunikatu z wynikami usługi, ponieważ prefiksem jest wbudowana funkcja alert() przeglądarki. Zwrócony kod JavaScript będzie wyglądać tak:

alert({"available":true})

Przekierowania

Ze względów bezpieczeństwa treści zwracane przez usługę treści nie są wyświetlane z script.google.com, tylko są przekierowane na jednorazowy adres URL pod adresem script.googleusercontent.com. Oznacza to, że jeśli używasz usługi Content do zwracania danych do innej aplikacji, musisz skonfigurować klienta HTTP tak, aby śledził przekierowania. Na przykład w narzędziu wiersza poleceń cURL dodaj flagę -L. Więcej informacji o włączaniu tego działania znajdziesz w dokumentacji klienta HTTP.