Carlos Andrés Moreno Jimenez
Te luciste oscar!
José Aldama
Es increíble lo fácil que hace el aprendizaje.
¿Cómo integrarse con la API de Google Sheets?
Integrarse con la API de Google Sheets puede abrir un mundo de posibilidades para automatizar y gestionar datos dinámicamente desde diferentes aplicaciones. En este artículo, exploramos cómo configurar esta integración en un entorno JavaScript para comunicar datos desde un bot de WhatsApp hacia una hoja de cálculo en Google Sheets. Este proceso no solo mejora la eficiencia en la gestión de datos, sino que también optimiza la interacción con los usuarios de forma automática. Profundicemos en los pasos para implementar esta integración.
¿Cómo se instala la dependencia Google APIs?
El primer paso para integrar nuestra aplicación con la API de Google Sheets es instalar la dependencia de Google APIs. Ejecutamos el siguiente comando en la terminal:
npm install googleapis
Este paquete nos permitirá trabajar fácilmente con las distintas APIs de Google. A continuación, crea un nuevo recurso dentro de la carpeta Services llamado GoogleSheetsService. Este archivo alojará la lógica para interactuar con las hojas de cálculo.
¿Cuál es la lógica básica de comunicación con la API?
La lógica para la comunicación con Google Sheets implica varios pasos importantes. Inicialmente, se importan recursos necesarios y se configura la autenticación con las credenciales apropiadas.
import path from 'path'; import { google } from 'googleapis'; const Sheets = google.sheets('v4'); // Función para agregar fila a Google Sheet async function addRowToSheet(auth, spreadsheetId, values) { const request = { spreadsheetId, range: 'reservas', valueInputOption: 'RAW', insertDataOption: 'INSERT_ROWS', resource: { values }, auth, }; try { const response = await Sheets.spreadsheets.values.append(request); return response; } catch (error) { console.error(error); } }
¿Cómo se realiza la autenticación y se utiliza el cliente autorizado?
La autenticación se establece utilizando un archivo de credenciales. Este archivo debe ubicarse de manera segura dentro de nuestro proyecto y su ruta debe definirse correctamente.
const auth = new google.auth.GoogleAuth({ keyFile: path.join(process.cwd(), 'src', 'credentials', 'credentials.json'), scopes: ['https://www.googleapis.com/auth/spreadsheets'], }); async function appendToSheet(data) { try { const authClient = await auth.getClient(); const spreadsheetId = 'tu_spreadsheet_id_aqui'; await addRowToSheet(authClient, spreadsheetId, data); console.log('Datos correctamente agregados.'); } catch (error) { console.error('Error al agregar los datos:', error); } }
¿Cómo integrar la lógica en la aplicación principal?
Una vez que tenemos nuestra lógica de servicio, debemos integrar esta función dentro de la aplicación para que, cuando un usuario complete el flujo en el bot de WhatsApp, la información se envíe a Google Sheets.
import { appendToSheet } from './services/GoogleSheetsService'; // Dentro de la función que maneja mensajes async function messageHandler(message) { // Código existente const data = [ message.from, message.name, message.petName, message.petType, message.query ]; try { await appendToSheet(data); console.log('Información enviada al Google Sheets.'); } catch (error) { console.error('Error al enviar los datos:', error); } }
¿Cuáles son los errores comunes y sus soluciones?
Durante la implementación, es común enfrentarse a errores tipográficos o problemas de configuración. Estos pueden incluir errores de tipos de datos, errores de autenticación o rutas incorrectas. Una solución frecuente es revisar cuidadosamente el código en busca de inconsistencias y asegurarse de que las credenciales estén correctamente configuradas.
spreadsheetId sea correcto y válido.Finalmente, el buen mantenimiento de un formato de código legible no solo facilita la detección de errores sino que también mejora la colaboración y la comprensión por parte de otros desarrolladores.
Evita el error del rango, recuerden en la hoja de calculo tu puedes definir un nombre a un grupo de celdas, esto es lo que llamamos un rango, y basado en el código el nombre del rango que deben de crear en tu hoja de calculo de google debe de tener el nombre de range: "reservas". Con esto el sistema podrá encontrar el lugar donde agregara la información del cliente.
En la imagen pueden ver el rango y el nombre aplicado, el código de la clase al agregar un dato moverá el rango una celda abajo. Prácticamente el rango es el inicio donde se agregaran los datos del cliente.
Carlos Andrés Moreno Jimenez
Te luciste oscar!
José Aldama
Es increíble lo fácil que hace el aprendizaje.
John J. Meza
Estuve una hora debugeando y resultó que el error era que mi hoja de Google Sheets se llamaba Sheet1 en lugar de 'reservas'
Juan David Restrepo Valenzuela
Me paso igual, solo era cambiar el nombre de la hoja
Patricio Manuel Ugarte
Mas que un curso esto es un taller para hacer especificamente el proyecto propuesto. No hay prácticamente explicaciones. Hasta se nota que el profesor está leyendo los pasos a seguir y los está copiando, no tiene sentido que tenga todas esas líneas de código memorizadas en la cabeza. Nadie trabaja así. Sería mejor que muestre la documentación que sigue y explique los conceptos para que uno pueda hacer su propia versión para lo que necesite.
En particular a mi me sirve porque ya estoy haciendo un bot y estoy tratando de ver qué más se puede hacer y agregar, pero si venís de cero dudo que entiendas algo más allá de estar copiando código como un autómata.
Ojalá me equivoque.
Oscar Rubio
Las variables del archivo de credentials, no deberia estar configurado como variables de entorno?
Arnold Kevin Guzman Campos
Sería lo mejor, pero el SDK de google auth recibe un keyFile
Matias Ezequiel Rivero
Hola, lograron encontrar la forma segura de utilizar el archivo credential para que no quede en el repositorio?
Muchas gracias, saludos.
Ricardo Gomez
No olvidar crear el rango en el sheets de google o de lo contrario sale error
Jeremias Ezequiel Gonzalez
Les regalo de parte de san DeepSeek un test manual por si no estas encontrando que falla así descartas problemas de configuración y demás con la api
creas un archivo llamado testGoogleSheets.js en la carpeta services
import appendToSheet from "./googleSheetsService.js"; // Datos de prueba const testData = [ "TEST_USER", "Test Name", "Test Pet", "Test Type", "Test Reason", new Date().toISOString(), ]; // Ejecuta la prueba async function testAppend() { try { console.log("Iniciando prueba..."); const result = await appendToSheet(testData); console.log("Resultado:", result); console.log("✅ Prueba exitosa. Revisa tu Google Sheet."); } catch (error) { console.error("❌ Error en prueba:", error); } } testAppend(); ```Ejecutas ```js node src/services/testGoogleSheets.js ```Y listo se debería ver reflejado en el documento
Andres Felipe Vargas Gonzalez
Recuerden que spreadsheetId solo la I es mayuscula, estaba cometiendo el error de escribir spreadSheetId y me estaba matando la cabeza.
Ricardo Gomez
Seria optimo que no mostrara el calendario y poder elegir directamente
Pablo Aquino
Para el caso del rango puedes optar por colocar directamente el nombre de las Sheet seguido de las columnas que abarcará la data
googleSheetService.appendToSheet('spreedsheetId', 'SheetName!ColStart:ColEnd', userData);
Francisco Manuel Sanchez Morales
Holaaaa igual estoy buscando como utilizar el archivo credential para que no quede en el repositorio, y despues hacer deploy, alguien sabe como hacer esto?
Mario Alejandro Crespo Reyes
Dentro de tu repositorio, en la raiz del proyecto dentro del archivo .gitignore puedes escribir el path del archivo para que sea ignorado en los commits y no se suba al repositorio.
seria algo como:
src/credentials/credentials.json
Eso deberia funcionarte
Jovanny Alarcon C
en esta clase fue donde mas tuve errores pero gracias a los comentarios y chat gpt , también fue donde mas rápido soluciono todo.
este fue un error nuevo. Error [ERR_UNSUPPORTED_DIR_IMPORT]: Directory import ... is not supported resolving ES modules ...
Estás intentando importar un directorio directamente, y eso no está permitido cuando usas módulos ES (ESM).
Estás intentando importar un módulo interno de googleapis accediendo directamente a su estructura de archivos (/build/src/apis/...), y eso no está permitido con módulos ES (import) en Node.js a partir de versiones recientes (como Node v22).
Además, en este caso ni siquiera necesitas importar contactcenteraiplatform, porque en el resto de tu código no lo usas para nada.
aqui el codigo como lo llevo y ya funcionando:
<
import path from 'path';
import { google } from 'googleapis';
const sheets = google.sheets('v4');
async function addRowToSheet(auth, spreadsheetId, values) {
const request = {
spreadsheetId,
range: 'reservas',
valueInputOption: 'RAW',
insertDataOption: 'INSERT_ROWS', // corregido: antes decía 'inserDataOption'
resource: {
values: [values],
},
auth,
};
try {
const response = (await sheets.spreadsheets.values.append(request)).data;
return response;
} catch (error) {
console.error(error);
}
}
const appendToSheet = async (data) => {
try {
const auth = new google.auth.GoogleAuth({
keyFile: path.join(process.cwd(), 'src/credentials', 'credentials.json'),
scopes: ['https://www.googleapis.com/auth/spreadsheets'],
});
const authClient = await auth.getClient();
const spreadsheetId = '1dLK7DJO_lVSylRQeMs6hPqtPVdyfrLZ8aR2aZqFhJ70';
await addRowToSheet(authClient, spreadsheetId, data);
return 'Data added successfully';
} catch (error) {
console.error(error);
}
};
export default appendToSheet;
>
Miguel Enrique Sánchez
Gracias! (1) en 2025 con la nueva version the Node.js la importacion ha cambiado y (2) el ajuste de insertdataoption funciono perfecto.
ANDRES ALFONSO MIRA MEJIA
✅
EUGENIO ROBERTO MACHIN
que sucede si queremos usar documentos de un proyecto de firebase-firestore