콘텐츠 서비스

스크립트가 웹 앱으로 게시되면 스크립트의 URL에 요청이 있을 때마다 특수 콜백 함수 doGet()doPost()가 호출됩니다. HTML 서비스로 만든 사용자 인터페이스 객체를 반환하는 대신 콘텐츠 서비스를 사용하여 원시 텍스트 콘텐츠를 반환할 수 있습니다. 이렇게 하면 GETPOST 요청에 응답하고 다양한 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);
}

어려워 보일 수 있지만 간단한 부분으로 나뉩니다. URL Fetch 서비스를 사용하여 원본 XKCD RSS 피드를 가져옵니다. 그런 다음 표준 자바스크립트 정규 표현식을 사용하여 필요한 대체 항목을 만듭니다. 마지막으로 수정된 피드를 TextOutput 객체에 래핑하고 MIME 유형을 RSS로 설정합니다.

실제 동작을 확인하려면 스크립트를 웹 앱으로 게시하고 익명 액세스를 허용해야 합니다 (RSS 리더가 익명 사용자로 방문하므로). 그런 다음 RSS 리더에 원본 RSS 피드가 아닌 서비스의 URL을 추가하거나 웹브라우저에서 직접 방문합니다. 이제 완료됐습니다.

스크립트에서 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 매개변수는 표준 유닉스 에포크로 지정된, 확인할 기간을 제공합니다.

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를 사용합니다. 이는 서비스에서 반환한 값으로 호출할 클라이언트 측 자바스크립트의 함수 이름입니다.

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

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

alert({"available":true})

리디렉션

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