內容服務

將指令碼發布為網頁應用程式時,每當對指令碼的網址發出要求時,都會叫用特殊回呼函式 doGet()doPost()。您可以使用內容服務傳回原始文字內容,而非傳回使用 HTML 服務建立的使用者介面物件。這可讓您編寫做為「服務」的指令碼,回應 GETPOST 要求,並提供各種 MIME 類型的資料。

基本概念

以下是內容服務的簡易範例:

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

使用與提供使用者介面時相同的步驟,將指令碼部署為網頁應用程式。當指令碼的網址發出 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 動態消息。然後使用標準 JavaScript 規則運算式進行需要的替代項。最後,我們會將編輯過的動態饋給納入 TextOutput 物件中,並將 MIME 類型設為 RSS。

如要實際查看,請將指令碼發布為網頁應用程式,務必允許匿名存取 (因為 RSS 閱讀器會以匿名使用者身分造訪)。接著將服務網址 (而非原始的 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);
}

和先前一樣,請以匿名網頁應用程式的形式發布該內容。在此情況下,新服務的使用者只要將網址參數新增至服務網址的結尾,即可使用服務。startend 參數提供檢查的時間範圍 (以標準 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 屬性設為服務的網址,以及名為 prefix 的額外參數。這是用戶端 JavaScript 中的函式名稱,系統會使用服務回傳的值呼叫該函式。

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

由於我們將瀏覽器內建的 alert() 函式指定為前置字串,因此此範例會在瀏覽器中顯示含有服務輸出內容的訊息方塊。傳回的 JavaScript 程式碼如下所示:

alert({"available":true})

重新導向

基於安全考量,內容服務傳回的內容不會從 script.google.com 提供,而是在 script.googleusercontent.com 重新導向至一次性網址。這表示如果您使用內容服務將資料傳回其他應用程式,請務必將 HTTP 用戶端設定為追蹤重新導向。舉例來說,在 cURL 指令列公用程式中加上旗標 -L。如要進一步瞭解如何啟用此行為,請參閱 HTTP 用戶端的說明文件。