Usando Google Spreadsheet como base de datos

Google ofrece un API para poder manipular directamente el contenido de sus hojas de cálculo en Google Docs, si reparamos en los detalles y la posibilidad de que pueden ser grabas, actualizadas, borradas y recuperadas filas específicas de una hoja de cálculo en particular, pues resulta evidente de que sería posible utilizar dicho API para usar las hojas de cálculo de Google Docs como un sencillo motor de base de datos.

Buscando encontré en el blog "farinspace web" una librería de PHP que permite manipular fácilmente hojas de cálculo de Google Docs, el nombre es Google_Spreadsheet, aunque no es muy imaginativo refleja claramente su finalidad. Luego se me ocurrió usarlo para una aplicación de ejemplo el clásico guessbook, pero eso requeriría la administración de login y perfiles, entonces se me ocurrió mezclarlo (hacer un mushup) con Facebook Connect. De esa forma la administración de la identidad se hace con el Facebook Connect y el registro de los comentarios se haría usando Google SpreadSheet. En pocas palabras lo único que se tiene localmente es el programa, todo los datos estarían en la red.

He preparado un pequeño server virtual con el ejemplo, que puede ser accedido en este URL. El código listo para desempaquetar y usar puede ser descargado desde este otro URL. Lo único que necesita hacer para probarlo es decargarlo en un server con soporte de PHP 5.2 o superior, tener una cuenta en Google Docs y registrar su aplicación en Facebook (más detalles sobre como registrar una aplicación en Facebook pueden ser contradas aquí). Con las credenciales del caso debe editar el archivo "config.php" de la siguiente manera:

<?

  $api_key  = "abcdefghijklmnopqrstuv0987654321"; <- API Key de Facebook
  $secret   = "1234567890abcdefghijklmnopqrstuv"; <- Secret word de FB
  $username = "user@gmail.com";             <- Usuario Google Docs
  $password = "123456";                      <- Password usuario Google Docs

?>

Con esos sencillos cambios debería de funcionar el script que pongo a disposición. Ojo esto es una prueba de concepto, no está cuidada la estética, y todo el código son dos scripts PHP monolíticos. Es decir este script tiene propósito educativo y no recomiendo su uso en entornos de producción.

Los detalles sobre Facebook Connect pueden ser revisados en la wiki de Facebook, por simplicidad en este post me limitaré a enfocarme en el uso de la librería Google Spreadsheet, en caso de que alguien esté interesado en un tutorial detallado sobre Facebook Connect, pues haganmelo saber en los comentarios, si veo que hay suficiente interés dedicaré un tiempo a escribir uno.

A revisar entonces el código de "index.php" que nos permite leer datos desde una hoja de cálculo de Google Docs.

En esta parte inicializamos el objeto $ss (spreadsheet), e indicamos que deseamos usar la hoja de cálculo "comentarios" y la página "Sheet1", es importante tener presente que los nombres son case-sensitive:

(…)
    $ss = new Google_Spreadsheet($username,$password);
    $ss->useSpreadsheet("comentarios");
    $ss->useWorksheet("Sheet1");

(…)

En esta parte asignamos a la variable $rows, todas las filas que tengan un campo "id" mayor que cero, dado que usaremos la función time() para general el campo "id", este es un número entero mayor que cero siempre. Luego con la función sizeof() obtenemos el número de filas que han sido leídas y usaremos la variable $start para acceder a ellos desde el último insertado:

(…)
    $rows = $ss->getRows("id>0");
    $size = sizeof($rows);
    $start = $size – 1;
    $count = 0;

(…)

Usamos el bucle while() para leer los diez últimos elementos del array que la función getRows() nos provee y los representamos a través de una tabla:

(…)
    echo '<hr>Diez &uacute;ltimos comentarios:<br /><br />';
    echo '<table>';
    while(($start>=0) && ($count<10)) {
         $row = $rows[$start];
        
         $nombre = $row[‘nombre’];
         $apellido = $row[‘apellido’];
         $avatar = $row[‘avatar’];
         $comment = $row[‘comment’];
         echo '<tr><td valign="top">' . '<img src="' . $avatar . '"><br />' . $nombre . '<br />' . $apellido . '<br /></td>';
         echo '<td valign="top" width="300">' . $comment . '</td></tr>';
          –$start;
          ++$count;
    }
    echo '</table>';

(…)

Como veran el algoritomo es bastante sencillo y sólo nos muestra los últimos 10 comentarios dejados en el guessbook. Ahora si queremos dejar comentarios debemos estar logueados, para ello se debe disponer de una cuenta válida en Facebook.

El script que agrega una fila a la hoja de cálculo de Facebook se llama "addrow.php" y para asegurarnos de que no puede ser usado directamente por alguien, lo primero que hace dicho script es ver si el usuario está logueado en Facebook, de estarlo lee los siguientes datos de su perfil: $nombre, $apellido, $avatar (la foto). Si no está logueado es redirigido a "index.php".

Finalmente si el usuario esta logueado y ha enviado un comentario, entonces el siguiente código se ejecuta:

(…)
      $ss = new Google_Spreadsheet($username,$password);
      $ss->useSpreadsheet("comentarios");
      $row = array (
                  "id" => time(),
                  "nombre" => $nombre,
                  "apellido" => $apellido,
                  "avatar" => $avatar,
                  "comment" => $comment
             );

      if ($ss->addRow($row)) {
         /* Si se puede agregar la fila exitosamente regresa a la pagina principal */
         $url = 'http://' . $_SERVER[‘SERVER_NAME’] . "/index.php";
         header("Location: $url") ;
      } else {
         /* Si se produce un error, nos alerta del mismo */
         echo "Error, lo sentimos pero su comentario no ha podido ser grabado.n";
      }     

(…)

Es decir creamos un objeto $ss, especificamos con que hoja de cálculo deseamos trabajar con la función userSpreadsheet() y con la función addRow() podemos escribir el contenido del array $row en la hoja de cálculo llamada "comentarios", de ser exitosa dicha operación somos redirigidos a "index.php", caso contrario se nos presenta un mensaje de error para darnos a saber de que por alguna razón el registro no pudo ser grabado en la hoja de cálculo.

Este tipo de solución es útil por ejemplo si deseamos utilizar Google App Engine con PHP. Como comenté el año pasado es posible usar PHP en App Engine a través del servlet Quercus. Sin embargo no se puede acceder directamente a BigTable desde una aplicación PHP implementada de esta manera, pero la libreria "Google SpreadSheet", debería de funcionar sin problemas en Quercus. Existen varias otros posibles escenarios en donde este tipo de soluciones serían utiles como por ejemplo hosting gratuitos o sencillamente formularios web que llenan directamente una hoja de cálculo que luego puede ser compartida por los empleados de la compañía.

Si alguien utiliza este tipo de solución en algún proyecto le agradecería que nos lo haga saber en los comentarios.

4 comentarios en «Usando Google Spreadsheet como base de datos»

    1. Hola Dario.

      Ya he puesto el archivo con el código de ejemplo de vuelta, pero el servidor virtual con el ejemplo corriendo no lo levantaré.

      Espero que el código te sea de utilidad.

  1. Hola buenos días, me gustaria realizar algo parecido pero en vez de leer el google sheet lo que quiero realizar es insertar unas filas en el google shet, basicamente lo que quiero realizar es cuando un usuario rellena un formulario que en el codigo .php que procesa el formulario tambien añada las variables nombre, email, telefono y comentario en el google sheet que tengo creado.

     

    Esto como lo podria realizar?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.