REST para el problema del viajante de comercio: Uso de datos de Google en Salesforce.com

Lane LiaBraaten, Programas para desarrolladores de Google
Noviembre de 2007

Introducción

Salesforce.com y Google alojan aplicaciones populares de "software como servicio", y ambas organizaciones proporcionan APIs que permiten a los desarrolladores acceder a los grandes almacenes de datos que impulsan estas aplicaciones. Las cosas se vuelven interesantes cuando combinamos ambos conjuntos de APIs. G Suite se sigue usando cada vez más en el entorno empresarial, y Salesforce.com creó una plataforma extensa para crear aplicaciones comerciales personalizadas, por lo que hay muchas oportunidades para que los desarrolladores (¡como tú!) combinen el poder de Google y Salesforce.com.

En este artículo, se muestra cómo usar las APIs de Google Data basadas en REST para comenzar a crear combinaciones empresariales, incluso si recién estás comenzando a usar la plataforma de Salesforce.com o el protocolo de Google Data. Te ayudaré a configurar tu entorno de desarrollo, instalar una combinación existente de Salesforce.com y Google, y, luego, escribir la tuya.

Hola, Salesforce.com.

Si eres principiante en Salesforce.com, como yo, deberás registrarte para obtener una cuenta de desarrollador en ADN, la red de desarrolladores de Apex. La cuenta de desarrollador te brinda una cuenta de Salesforce.com con todas las funciones, además de acceso a la wiki de Apex y a los foros de debate.

A continuación, deberás obtener el Apex Toolkit para Eclipse. El kit de herramientas requiere Java 1.5 y Eclipse 3.2.2, o versiones posteriores. Si conoces Eclipse, el sitio de actualización de software del kit de herramientas es http://www.adnsandbox.com/eclipsetoolkit/10.0/. Si no conoces los complementos de Eclipse o algo sale mal durante la instalación, la wiki de Apex incluye instrucciones de instalación detalladas.

Una vez que se instale el kit de herramientas, podrás acceder al contenido de ayuda de Apex integrado en el sistema de ayuda de Eclipse. En Eclipse, ve a Help | Help Contents | Apex Toolkit for Eclipse para ver este contenido. Uno de los recursos de ayuda es un instructivo de inicio rápido que te mostrará cómo crear un proyecto nuevo y agregar S-Controls, clases y activadores. Si nunca trabajaste con código de Apex, debes completar este instructivo y crear un proyecto de Apex antes de continuar.

Cómo exportar eventos al Calendario de Google

Ron Hess escribió una aplicación de combinación de Calendario de Google que te permite exportar eventos de Salesforce.com al Calendario de Google. Ron también escribió un artículo en el que explica cómo funciona su combinación. La aplicación de Hojas de cálculo de Google que te mostraré cómo compilar más adelante se basa en la combinación de Calendario de Google de Ron. Gracias, Ron.

Si eres un usuario avanzado de Salesforce.com, probablemente puedas integrar y usar la aplicación de Calendario de Google de Ron sin instrucciones. Al principio, necesité un poco de ayuda, así que esto es lo que hice para ver la app de Ron en acción.

  1. Instala la aplicación:
    • Ve a la página Google Calendar Mash-up y haz clic en Get It Now.
    • Ingresa tus credenciales de ADN y haz clic en Continuar.
    • Lee los Términos y Condiciones y haz clic en Continuar.
    • Haz clic en Siguiente en la página "Examina el contenido del paquete".
    • Elige un nivel de seguridad y haz clic en Siguiente.
    • Haz clic en Install.
  2. Configura el proxy de AJAX de Salesforce.com.
    • En el menú "Configuración de administración", haz clic en Controles de seguridad | Configuración de sitios remotos.
    • Haz clic en Nuevo sitio remoto.
    • Ingresa Google como el "Nombre del sitio remoto" y, para la "URL del sitio remoto", usa https://www.google.com.
    • Haz clic en Guardar.
  3. Agrega el botón "Agregar a Google" a la página de detalles del evento:
    • En el menú "Configuración de la app", haz clic en Personalizar | Actividades | Diseños de la página del evento.
    • Haz clic en Editar en la fila “Diseño del evento”.
    • Haz doble clic en el área "Detail Page Buttons".
    • Destaca "Agregar a Google" y haz clic en la flecha hacia la derecha (>) para agregar el botón.
    • Haz clic en Aceptar.
    • Haz clic en Guardar en la página "Propiedades de diseño de página".
  4. Exporta un evento.
    • Haz clic en Página principal en la esquina superior izquierda para ver tu calendario.
    • Si no tienes ningún evento, haz clic en Evento nuevo para crear uno.
    • Haz clic en un evento para ver la página Event Detail.
    • Haz clic en el botón Agregar a Google.
    • Haz clic en Aceptar en la alerta de JavaScript.
    • Accede con tu nombre de usuario y contraseña de Google.
    • Haz clic en Grant access para otorgar a la aplicación de Salesforce acceso de escritura a tu Calendario de Google.
    • Ver el evento en tu Calendario de Google

Compila una aplicación de Hojas de cálculo de Google

Bien, probablemente te cansaste de hacer clics en las páginas de Salesforce.com y estás listo para escribir código. Vuelve a iniciar Eclipse y verás que el proyecto de Apex que creaste ahora contiene los S-Controls para la app de Calendario de Google de Ron. Esto se debe a que Apex Toolkit para Eclipse se sincroniza constantemente con Salesforce.com. Es genial, ¿verdad?

Puedes crear tu propia app de Google Data reutilizando algunas de las funciones de la combinación de Calendario de Google, como los controles de autenticación. En el resto de esta sección, te mostraré cómo compilar una app que exporte tus contactos de Salesforce.com a una hoja de cálculo de Google.

Publicación de un S-Control simple

Un S-Control es un archivo alojado por Salesforce.com y ejecutado en navegadores web cuando los usuarios acceden a tu aplicación. Un S-Control puede contener cualquier tipo de contenido que se pueda mostrar o ejecutar en un navegador web, como HTML, CSS o JavaScript.

Hay varios componentes en un mashup de Salesforce.com y Google, por lo que lo primero que hice fue agregar un botón "Exportar a Google" a la página de la lista de contactos que invoca un simple S-Control, solo para asegurarme de que todas las conexiones fueran correctas antes de estar hasta las rodillas en JavaScript.

En tu proyecto de Apex, haz clic con el botón derecho en la carpeta "S-Controls" y elige Apex | New S-Control. Asigna al nuevo S-Control una etiqueta y un nombre de export_contacts, deja el tipo como HTML personalizado y haz clic en Finalizar.

El nuevo S-Control contendrá un archivo HTML básico. Agregarás mucho código JavaScript en <head>, pero puedes completar <body> primero para que haya algo que mostrarle al usuario mientras se exportan los contactos. Copia este código HTML en el cuerpo de tu S-Control para mostrar los "puntos de espera" y el logotipo de Hojas de cálculo de Google:

<div id="waiting" align="center" />
  <img src="/img/icon/home32.png" height="64" width="64" />
  <img src="/img/waiting_dots.gif" alt="Please wait..." title="Please wait..." height="25" width="196" />
  <img src="http://docs.google.com/images/doclist/logo_docs.gif" />
  <p><h3>Exporting contacts to Google Spreadsheets, please wait...</h3></p>

</div>

Ahora puedes publicar el S-Control y configurar un botón que lo invocará.

  1. Usa Eclipse para publicar el archivo de S-Control:
    • Haz clic con el botón derecho en tu proyecto de Apex y selecciona Apex | Synchronize with Salesforce.
    • Busca tu nuevo S-Control en el árbol de directorios, haz clic con el botón derecho y elige Override remote and publish to server.
    • Si no encuentras tu S-Control, es posible que Apex Toolkit ya lo haya subido por ti, pero es una buena idea usar la perspectiva de sincronización para asegurarte de que el código más reciente se ejecute en el servidor.
  2. Usa la IU de Salesforce.com para definir un botón que invocará este S-Control:
    • En el menú "Configuración de la app", haz clic en Personalizar | Contactos | Botones y vínculos.
    • En la sección "Botones y vínculos personalizados", haz clic en Nuevo.
    • Ingresa Export to Google para la etiqueta y conserva Export_to_Google como el nombre.
    • Elige "Botón de lista" como el tipo de visualización.
    • Elige "S-Control personalizado" como la fuente de contenido.
    • Elige "Mostrar en la ventana existente con barra lateral" como el comportamiento.
    • Selecciona "export_contacts" en el menú de S-Controls personalizados.
  3. Agrega el botón a la lista de contactos:
    • En el menú "Configuración de la app", haz clic en Personalizar | Contactos | Diseños de búsqueda.
    • Haz clic en Editar en la fila “Vista de lista de contactos”.
    • Destaca "Exportar a Google" y haz clic en la flecha hacia la derecha (>) para agregar el botón.
    • Haz clic en Guardar.
  4. Prueba la función:
    • Haz clic en la pestaña Contactos.
    • Selecciona "Todos los contactos" como la vista y haz clic en Ir.
    • Haz clic en el nuevo y brillante botón Exportar a Google.
    • Mira los "puntos de espera", pero no esperes que suceda nada más.

Cómo interactuar con Hojas de cálculo de Google

Si observas el código fuente de Google Calendar Mash-up, verás que el archivo gcal_snippet.scf contiene una abstracción para un servidor de Calendario de Google. Para interactuar con Hojas de cálculo de Google, deberás crear un archivo similar para un servidor de Hojas de cálculo de Google. Reutilicé el código de Ron Hess para usar el proxy de AJAX de Salesforce.com y autenticarme con Google AuthSub, y reemplacé la función que escribe eventos en el Calendario de Google por una que escribe información en Hojas de cálculo de Google. El código fuente completo de este archivo está disponible en gspreadsheet_snippet.scf.

Luego, agregué JavaScript al S-Control export_contacts.scf para consultar Salesforce.com en busca de información de contacto y escribirla en una hoja de cálculo de Google. Es fácil extraer datos de Salesforce.com. Solo tienes que crear una consulta y proporcionar una función de devolución de llamada para ejecutarla cuando se devuelvan los datos. Por ejemplo:

  var query = 'Select FirstName, LastName, Phone From Contact';
  var queryResult = sforce.connection.query(query, queryCallback);

Una vez que tengas la información de contacto de Salesforce.com, debes determinar dónde exportarla. En el protocolo de datos de Google basado en REST, cada hoja de cálculo se puede identificar con una URL única. Para obtener la lista de hojas de cálculo de un usuario (y las URLs asociadas), consulta la URL del metafeed: http://spreadsheets.google.com/feeds/spreadsheets/private/full. El siguiente método itera a través de estas hojas de cálculo y busca una con un título específico. Cuando encuentra la hoja de cálculo correcta, primero obtiene la lista de hojas y, luego, devuelve la URL del feed de celdas de la primera hoja.

function getCellFeedUrl() {
  var SPREADSHEET_TITLE = 'Salesforce.com Contacts';
  var WORKSHEET_REL = 'http://schemas.google.com/spreadsheets/2006#worksheetsfeed';
  var CELLSFEED_REL = 'http://schemas.google.com/spreadsheets/2006#cellsfeed';

  // Query to find the spreadheet called "Salesforce.com Contacts"
  var spreadsheets = g.getFeed('http://spreadsheets.google.com/feeds/spreadsheets/private/full');
  var entries = g.getEntryList(spreadsheets);
  for (var e in entries) {
    if (g.getTitle(entries[e]) == SPREADSHEET_TITLE) {
      var worksheetsFeedUrl = g.link(entries[e],WORKSHEET_REL);
      var worksheets = g.getFeed(worksheetsFeedUrl);
      var worksheetEntries = g.getEntryList(worksheets);
      return g.link(worksheetEntries[0], CELLSFEED_REL);
    }
  }
}

Puedes encontrar más información sobre los feeds disponibles en la API de datos de Hojas de cálculo de Google en la Guía de referencia.

La función queryCallback usa el método getCellFeedUrl para encontrar la URL del feed de celdas necesaria para enviar solicitudes de actualización de celdas y, luego, escribe la información de contacto de una celda a la vez.

function queryCallback(queryResult) {
  var cellFeedUrl = getCellFeedUrl();
  var contacts = queryResult.getArray('records');
  for (var i=0; i<contacts.length; i++) {
    g.updateCell(cellFeedUrl, i+1, 1, contacts[i].LastName + ", " + contacts[i].FirstName);
    g.updateCell(cellFeedUrl, i+1, 2, contacts[i].Phone);
  }
  
  jumpback(); // Return to the contacts page when your done
}

El método updateCell existe en el S-Control gspreadsheet_snippet.scf. El método obtiene la URL de edición de la celda en la fila y la columna determinadas y, luego, envía un mensaje PUT HTTP que contiene la representación de datos de Google de la celda actualizada:

GoogleSpreadsheet.prototype.updateCell = function(cellsFeedUrl, row, column, content ) {
  var cellEntry = this.getFeed(cellsFeedUrl+'/R'+row+'C'+column);
  var cellEditUrl = this.link(cellEntry,'edit');

  var newCellEntry = "<atom:entry xmlns:atom='http://www.w3.org/2005/Atom'>" +
      "<atom:category scheme='http://schemas.google.com/spreadsheets/2006' " +
      "term='http://schemas.google.com/spreadsheets/2006#cell' />" +
      "<gs:cell xmlns:gs='http://schemas.google.com/spreadsheets/2006' " +
      "row='" + row + "' col='" + column + "' inputValue='" + content + "' />" +
      "</atom:entry>";

  this.putEntry(cellEditUrl, newCellEntry);
} 

En la guía para desarrolladores, encontrarás más información para actualizar celdas con la API de datos de Hojas de cálculo de Google.

La API de datos de Hojas de cálculo de Google usa el subdominio https://spreadsheets.google.com, por lo que, antes de que funcione el código anterior, deberás configurar el servidor proxy de AJAX de Salesforce.com y agregar https://spreadsheets.google.com.

También deberás ir a Documentos de Google y crear una nueva hoja de cálculo para almacenar los datos. Asegúrate de guardarlo como Contactos de Salesforce.com.

Una vez que subas estos S-Controls, podrás exportar tu información de contacto a una hoja de cálculo de Google. ¿Y si lo hacemos al revés? Con tus nuevos conocimientos sobre Salesforce.com y las APIs de datos de Google, también puedes escribir código para importar información de contacto de Hojas de cálculo de Google a Salesforce.com.

Conclusión

Este artículo apenas abordó la superficie, pero ahora que conoces la plataforma de Salesforce.com y las APIs de datos de Google, piensa en todas las aplicaciones que puedes escribir para aprovechar estos potentes sistemas. La familia de APIs de Google Data siempre está en crecimiento y expone más información para que la aproveches en tus aplicaciones. Además, la plataforma de Salesforce.com ofrece muchas herramientas útiles que no se trataron en este artículo. Buscaré tu próxima combinación empresarial en AppExchange.

¡Feliz codificación!

Recursos