콘텐츠 서비스

스크립트가 웹 앱으로 게시되면 스크립트의 URL에 대한 요청이 이루어질 때마다 특수 콜백 함수 doGet()doPost()이 호출됩니다. HTML 서비스로 만든 사용자 인터페이스 객체를 반환하는 대신 콘텐츠 서비스를 사용하여 원시 텍스트 콘텐츠를 반환할 수 있습니다. 이를 통해 GETPOST 요청에 응답하고 다양한 MIME 유형의 데이터를 제공하는 '서비스' 역할을 하는 스크립트를 작성할 수 있습니다.

기본사항

다음은 콘텐츠 서비스의 간단한 예입니다.

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

사용자 인터페이스를 제공할 때와 동일한 단계를 사용하여 스크립트를 웹 앱으로 배포합니다. 스크립트의 URL에 GET 요청이 이루어지면 텍스트 Hello, world!가 반환됩니다. 이 서비스는 일반 텍스트 외에도 ATOM, CSV, iCal, 자바스크립트, 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);
}

복잡하게 보일 수 있지만 단순한 부분으로 나뉩니다. Google은 URL 가져오기 서비스를 사용하여 원본 XKCD RSS 피드를 가져옵니다. 그런 다음 표준 자바스크립트 정규 표현식을 사용하여 필요한 대체 항목을 만듭니다. 마지막으로 수정된 피드를 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 매개변수를 추가하여 사용할 수 있습니다. startend 매개변수는 표준 Unix 에포크에 지정된 확인 기간을 제공합니다.

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

서비스가 JSON을 반환하여 해당 범위의 캘린더에 항목이 있는지 보고합니다.

{"available":true}

웹페이지에 JSONP 게재

약간의 변경으로 JSON 서비스는 JSONP가 될 수 있으며, 이는 브라우저의 자바스크립트에서 호출할 수 있다는 의미입니다. 새 스크립트는 다음과 같습니다.

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라는 추가 매개변수가 포함된 스크립트 태그를 만듭니다. 서비스에서 반환된 값으로 호출될 클라이언트 측 자바스크립트의 함수 이름입니다.

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

이 예시에서는 브라우저에서 내장된 alert() 함수를 접두사로 지정하므로 서비스 출력과 함께 메시지 상자가 표시됩니다. 반환된 자바스크립트 코드는 다음과 같습니다.

alert({"available":true})

리디렉션

보안상의 이유로 콘텐츠 서비스에서 반환된 콘텐츠는 script.google.com에서 게재되지 않고 대신 script.googleusercontent.com에서 일회성 URL로 리디렉션됩니다. 즉, 콘텐츠 서비스를 사용하여 다른 애플리케이션에 데이터를 반환하는 경우 HTTP 클라이언트가 리디렉션을 따르도록 구성되었는지 확인해야 합니다. 예를 들어 cURL 명령줄 유틸리티에서 -L 플래그를 추가합니다. 이 동작을 사용 설정하는 방법에 대한 자세한 내용은 HTTP 클라이언트 문서를 참조하세요.