Servicio de contenido

Cuando se publica una secuencia de comandos como una aplicación web, se invocan las funciones especiales de devolución de llamada doGet() y doPost() cada vez que se realiza una solicitud a la URL de la secuencia de comandos. En lugar de mostrar un objeto de interfaz de usuario creado con el servicio HTML, se puede usar el Servicio de contenido para mostrar contenido de texto sin procesar. Esto te permite escribir secuencias de comandos que actúan como “servicios”, que responden a solicitudes GET y POST, y que entregan datos de varios tipos de MIME.

Conceptos básicos

A continuación, se muestra un ejemplo sencillo del servicio de contenido:

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

Implementa la secuencia de comandos como una aplicación web con los mismos pasos que si incluyes una interfaz de usuario. Cuando se realiza una solicitud GET a la URL de la secuencia de comandos, se mostrará el texto Hello, world!. Además de texto sin formato, el servicio también admite mostrar contenido ATOM, CSV, iCal, JavaScript, JSON, RSS, MCN y XML.

Entrega de feeds RSS

Probemos con algo más complicado, como filtrar un feed RSS. Los cómics XKCD siempre son divertidos, pero no puedes entender el chiste completo a menos que coloques el cursor sobre la tira para ver el texto alternativo adicional. Lamentablemente, no puedes colocar el cursor sobre un navegador para dispositivos móviles, por lo que esto no funciona.

Supongamos que quisimos editar el feed para que la línea de recorte adicional aparezca directamente en él y, en lugar de colocar el cursor sobre él, te desplazaste un poco hacia abajo para verlo. Eso funcionaría bien en un dispositivo móvil. Este es el código:

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);
}

Eso puede parecer complicado, pero se desglosa en partes simples. Usamos el servicio de recuperación de URL para recuperar el feed RSS XKCD original. Luego, usamos una expresión regular estándar de JavaScript para realizar las sustituciones que necesitamos. Por último, unimos el feed editado en un objeto TextOutput y establecemos el tipo de MIME en RSS.

Para ver esto en acción, publica la secuencia de comandos como una aplicación web y asegúrate de permitir el acceso anónimo (ya que tu lector de RSS lo visitará como un usuario anónimo). Luego, agrega la URL del servicio (no el feed RSS original) a tu lector de RSS o visítalo directamente en un navegador web. Listo.

Cómo entregar archivos JSON desde secuencias de comandos

¿Qué más podemos hacer con el servicio de contenido? ¿Qué te parece entregar JSON a otras secuencias de comandos u otros sitios web y servicios! A continuación, se muestra una secuencia de comandos simple que implementa un servicio que cualquier persona puede usar para ver si un horario del calendario está abierto en un momento específico.

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);
}

Como antes, publica esto como una app web anónima para que funcione. En este caso, los usuarios de tu servicio nuevo pueden utilizarlo si agregan parámetros de URL al final de la URL del servicio. Los parámetros start y end proporcionan un rango de tiempo para verificar, que se especifica en la época Unix estándar.

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

El servicio mostrará un archivo JSON que informa si hay algo en tu calendario dentro del rango.

{"available":true}

Cómo entregar JSONP en páginas web

Con un ligero cambio, tu servicio JSON puede convertirse en JSONP, lo que significa que se puede llamar desde JavaScript en un navegador. Esta es la nueva secuencia de comandos:

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);
}

Para llamar a este servicio desde un navegador, crea una etiqueta de secuencia de comandos cuyo atributo src sea la URL de tu servicio, con un parámetro adicional llamado prefix. Este es el nombre de la función en el código JavaScript del cliente a la que se llamará con el valor que muestra el servicio.

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

En este ejemplo, se mostrará un cuadro de mensaje en el navegador con el resultado del servicio, ya que especificamos la función alert() integrada del navegador como nuestro prefijo. El código JavaScript que se mostrará se verá de la siguiente manera:

alert({"available":true})

Redireccionamientos

Por motivos de seguridad, el contenido que muestra el servicio de contenido no se entrega desde script.google.com, sino que se redirecciona a una URL única en script.googleusercontent.com. Esto significa que, si usas el servicio de contenido para mostrar datos a otra aplicación, debes asegurarte de que el cliente HTTP esté configurado para seguir redireccionamientos. Por ejemplo, en la utilidad de línea de comandos de cURL, agrega la marca -L. Consulta la documentación de tu cliente HTTP para obtener más información sobre cómo habilitar este comportamiento.