Inhaltsservice

Wenn ein Skript als Webanwendung veröffentlicht wird, werden bei jeder Anfrage an die URL des Skripts die speziellen Callback-Funktionen doGet() und doPost() aufgerufen. Anstatt ein Benutzeroberflächenobjekt zurückzugeben, das mit dem HTML-Dienst erstellt wurde, kann der Inhaltsdienst verwendet werden, um Rohtextinhalte zurückzugeben. So können Sie Skripts schreiben, die als „Dienste“ fungieren, die auf GET- und POST-Anfragen antworten und Daten verschiedener MIME-Typen bereitstellen.

Grundlagen

Hier ein einfaches Beispiel für den Inhaltsdienst:

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

Stellen Sie das Skript als Webanwendung bereit. Gehen Sie dabei genauso vor wie beim Bereitstellen einer Benutzeroberfläche. Bei einer GET-Anfrage an die URL des Skripts wird der Text Hello, world! zurückgegeben. Neben reinem Text unterstützt der Dienst auch die Rückgabe von ATOM-, CSV-, iCal-, JavaScript-, JSON-, RSS-, vCard- und XML-Inhalten.

Bereitstellung von RSS-Feeds

Versuchen wir es mit etwas komplizierterem wie dem Filtern eines RSS-Feeds. Die XKCD-Comics sind immer lustig, aber Sie erhalten den ganzen Witz nur, wenn Sie den Mauszeiger auf die Comicleiste bewegen, um den zusätzlichen Alt-Text anzuzeigen. Leider können Sie den Mauszeiger nicht auf einen mobilen Browser bewegen, daher funktioniert dies nicht.

Angenommen, wir möchten den Feed so bearbeiten, dass sich die zusätzliche Pointe direkt im Feed befindet und Sie nicht den Mauszeiger auf den Feed bewegen, sondern nur ein wenig nach unten gescrollt haben, um ihn zu sehen. Das funktioniert problemlos auf einem Mobilgerät. Hier ist der Code:

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

Das mag kompliziert erscheinen, aber es besteht aus einfachen Teilen. Wir verwenden den URL-Abrufdienst, um den ursprünglichen XKCD-RSS-Feed abzurufen. Danach verwenden wir einen regulären JavaScript-Standardausdruck, um die benötigten Substitutionen zu ersetzen. Abschließend fügen wir den bearbeiteten Feed in ein TextOutput-Objekt ein und legen als MIME-Typ „RSS“ fest.

Um dies in Aktion zu sehen, veröffentlichen Sie das Skript als Webanwendung und achten Sie dabei darauf, anonymen Zugriff zuzulassen (da Ihr RSS-Reader das Skript als anonymer Nutzer besucht). Füge dann die URL des Dienstes (nicht den ursprünglichen RSS-Feed) zu deinem RSS-Reader hinzu oder rufe sie einfach direkt in einem Webbrowser auf. Fertig!

JSON aus Skripts bereitstellen

Was können wir sonst noch mit dem Inhaltsdienst tun? Wie wäre es, JSON für andere Skripts oder andere Websites und Dienste bereitzustellen? Mit diesem einfachen Skript wird ein Dienst implementiert, mit dem jeder sehen kann, ob ein Kalenderslot zu einer bestimmten Zeit geöffnet ist.

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

Veröffentlichen Sie dies wie zuvor als anonyme Webanwendung, damit es funktioniert. In diesem Fall können Nutzer Ihres neuen Dienstes ihn verwenden, indem sie URL-Parameter an die Dienst-URL anhängen. Die Parameter start und end geben einen zu prüfenden Zeitraum an, der in der Standard-Unixzeit angegeben wird.

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

Der Dienst gibt JSON-Daten zurück, die anzeigt, ob in Ihrem Kalender etwas in diesem Bereich vorhanden ist.

{"available":true}

JSONP auf Webseiten bereitstellen

Mit einer geringfügigen Änderung kann Ihr JSON-Dienst zu JSONP werden. Das bedeutet, dass er über JavaScript in einem Browser aufgerufen werden kann. Hier ist das neue Skript:

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

Wenn Sie diesen Dienst über einen Browser aufrufen möchten, erstellen Sie ein Script-Tag, dessen src-Attribut die URL Ihres Dienstes ist, und fügen einen zusätzlichen Parameter namens prefix hinzu. Dies ist der Name der Funktion im clientseitigen JavaScript, die mit dem vom Dienst zurückgegebenen Wert aufgerufen wird.

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

Dieses Beispiel zeigt ein Nachrichtenfeld im Browser mit der Dienstausgabe, da wir die integrierte alert()-Funktion des Browsers als Präfix angeben. Der zurückgegebene JavaScript-Code sieht in etwa so aus:

alert({"available":true})

Weiterleitungen

Aus Sicherheitsgründen werden vom Inhaltsdienst zurückgegebene Inhalte nicht von script.google.com bereitgestellt, sondern an eine einmalige URL unter script.googleusercontent.com weitergeleitet. Wenn Sie also den Inhaltsdienst verwenden, um Daten an eine andere Anwendung zurückzugeben, müssen Sie dafür sorgen, dass der HTTP-Client Weiterleitungen folgt. Fügen Sie beispielsweise im Befehlszeilendienstprogramm cURL das Flag -L hinzu. Weitere Informationen zum Aktivieren dieses Verhaltens finden Sie in der Dokumentation zu Ihrem HTTP-Client.