Pirobits
Blog@bypirob
⚛️ Curso de Next.JS y React

Tutorial: Google Sheets como base de datos con Node.js

alberto avatar
development
Alberto Sola · 5/20/2024 · 6 min

Cuando quieres construir un producto de IT, muchas veces necesitas una capa de almacenamiento. Lo más común es recurrir a bases de datos relacionales SQL o NoSQL. Pero, ¿existen otras alternativas?

En general cualquier base de datos funcionará bien. En mi caso después de haber probado varias de ellas me siento muy cómodo trabajando tanto con MySQL como con SQLite. Si lo necesito puedo elegir y probar otras bases de datos. Como siempre digo dependerá de las necesidades del problema a resolver, y sobre bases de datos tengo mucho contenido por contar.

Si comparamos dos proyectos, uno que tiene capa de almacenamiento y otro que no, todos estaremos de acuerdo en que gestionar el proyecto que no tiene capa de almacenamiento es mucho más simple: menos coste, menos tiempo de mantenimiento o gestión y menos problemas.

Es por esto que cada vez me gusta empezar los productos que creo de forma la forma más simple que puedo. Hace unas pocas semanas empecé a construir una herramienta de visualización de datos, para la que he utilizado Next.js y estoy disfrutando mucho el construirlo.

Mi intención es poder iterarlo yo sólo de forma rápida y ágil. El problema surge cuando aparece la necesidad de gestionar usuarios y permisos. Lo más obvio en estos casos es decidir utilizar una base de datos relacional, tal y como comento al inicio del post.

A veces no nos paramos a pensar las consecuencias de añadir complejidad a nuestros proyectos. Por ejemplo, añadir una base de datos requiere:

  • Gestionar esquemas.
  • Gestionar migraciones.
  • Gestionar la propia base de datos (aunque siempre puedes utilizar algún sistema cloud que te gestiona la base de datos y te despreocupas de algunas cosas).
  • Dar acceso a terceros, que no tienen por qué saber de IT, para que gestionen permisos, requiere algún tipo de herramienta por simple que sea.

Al final, al ser un producto pequeño con el que puedo experimentar, al estar yo sólo desarrollando y querer construirlo rápido, decidí no utilizar este sistema de base de datos y probar algo nuevo.

He creado un sistema de sesiones para la capa de autenticación, que comprueba si el usuario existe en una hoja de Google Sheets. De esta forma no tengo que gestionar bases de datos y cualquier persona con acceso puede modificar los datos. Aunque es divertido gestionar una base de datos, requiere tiempo, y el tiempo es limitado. Cuando haces una cosa dejas de hacer otras, esto es lo que se conoce como el coste de oportunidad.

Google Sheets es una aplicación en la nube de hojas de cálculo desarrollada por Google, que además ofrece una API gratuita mediante Google Cloud Platform para acceder y modifcar los datos. Esta es una herramienta muy interesante cuando quieres evolucionar rápidamente un producto y no tener que mantener una base de datos, de forma que te puedes preocupar de, primero, construir el producto en sí y luego si lo necesitas, siempre puedes añadir una base de datos y toda la complejidad que tu proyecto requiera.

Lo único que tienes que tener cuidado es con los límites de la API, que en general son bastante laxos y que con una capa de caché en tu aplicación puedes eludir.

Por lo general estoy muy contento con esta decisión, además el tener un producto pequeño donde experimentar para aprender, explorar nuevas opciones y descubrir las ventajas e inconvenientes de cada opción es algo que me apasiona.

A continuación te voy a explicar cómo acceder utilizando Node.js y la API de Google a los datos de Google Sheet. En este post no voy a hablar de sesiones, cachés ni otros temas por lo que si estás interesado recuerda suscribirte a la newsletter. Puedes dejar un comentario en el vídeo de youtube o ponerte en contacto conmigo.

Tutorial: utilizando Google Sheets API con Node

Primero tenemos que configurar y acceder a nuestra cuenta de Google Cloud Platform para configurar esta parte:

  • Primero creamos una cuenta en Google Cloud Console.
  • Creamos un nuevo proyecto.
  • Buscamos el producto "Google Sheets API" y lo activamos.
  • Buscamos el producto "Service Accounts" dentro de "IAM" y creamos una nueva cuenta de servicio.
  • Al crearla, nos proporcionará un e-mail que debemos anotar. Lo utilizaremos más adelante.
  • Entramos en la cuenta de servicio, y en el menú "Claves" creamos una nueva clave de tipo json que descargaremos.

Luego, con tu cuenta de Gmail debes realizar los siguientes pasos: - Creamos una hoja de Google Sheets con tu cuenta de corrreo. - Invitamos a la cuenta de email que hemos generado en Google Cloud Platform. - Aquí puedes darle permisos de sólo lectura o de lectura y escritura. En mi caso he utilizado sólo lectura ya que los accesos a la herramienta son manuales. - Anotaremos el ID de la hoja, que lo puedes encontrar en la URL del navegador.

Ya tenemos los preparativos listos. Ahora lo único que queda es irnos a tu aplicación, utilizando tu lenguaje preferido. En mi caso estoy utilizando Node.js por lo que los pasos son los siguientes:

Instalamos las siguientes dependencias:

npm i google-auth-library googleapis

En el código, creamos una función que se conectará a la API de Google y tenemos que pasarle el ID de la hoja de cálculo que hemos creado. El proceso es el siguiente:

  • Nos autenticamos con GoogleAuth y nuestro service account.
  • Nos conectamos con la API de Google Sheets utilizando las credenciales generadas, y con esto ya tendríamos acceso a los datos.

Una función de ejemplo en node quedaría tal que así:

import { GoogleAuth } from "google-auth-library";
import { sheets } from "googleapis/build/src/apis/sheets";

export async function getGoogleSheetByID(sheetId: string): Promise<Data> {
    const auth = new GoogleAuth({
        keyFile: "crendentials.json",
        scopes: "https://www.googleapis.com/auth/spreadsheets.readonly"
    });

    const mysheet = sheets({ version: "v4", auth });

    try {
        const response = await mysheet.spreadsheet.values.get({
            spreadsheetId: sheetId,
            range: "Accounts"
        });

        const rows = response.data.values;

        // your logic

    } catch (e) {
        // Handle error
    }
}

Con este código ya tenemos la información en la variable rows de forma que podemos recorrerla y acceder a los datos.

Si te ha resultado útil este artículo agradecería si te suscribes a mi newsletter. Recibirás contenido exclusivo de calidad y también me ayudarás enormemente. Cada suscripción apoya el trabajo que realizo y me permite conocer mejor los temas que te interesan, de forma que puedo mejorar los conocimientos que comparto contigo.


Posts recientes