コンテンツ サービス

スクリプトがウェブアプリとして公開されると、スクリプトの URL にリクエストが行われるたびに、特別なコールバック関数 doGet()doPost() が呼び出されます。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);
}

一見すると難しいように見えますが、シンプルな要素に分けられます。元の XKCD RSS フィードを取得するには、URL 取得サービスを使用します。次に、標準の JavaScript 正規表現を使用して、必要な置換を行います。最後に、編集したフィードを TextOutput オブジェクトでラップし、MIME タイプを RSS に設定します。

実際の動作を確認するには、スクリプトをウェブアプリとして公開し、匿名アクセスを必ず許可してください(RSS リーダーは匿名ユーザーとしてアクセスするため)。次に、(元の RSS フィードではなく)サービスの URL を 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 から配信されず、1 回限りの URL(script.googleusercontent.com)にリダイレクトされます。つまり、コンテンツ サービスを使用して別のアプリケーションにデータを返す場合、リダイレクトに従うように HTTP クライアントを構成する必要があります。たとえば、cURL コマンドライン ユーティリティで、-L フラグを追加します。この動作を有効にする方法について詳しくは、HTTP クライアントのドキュメントをご覧ください。