スクリプトがウェブアプリとして公開されると、スクリプトの 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 クライアントのドキュメントをご覧ください。