En primer lugar, una breve descripción de nuestro caso de uso. Digamos que tengo una hoja de cálculo en Hojas de cálculo de Google que no es pública y quiero poder leer/modificar mediante programación a través de algún proceso por lotes que se ejecuta en mi máquina local o en algún servidor. Esto es algo que tuve que hacer recientemente con una aplicación Node.js y encontré la parte de autenticación un poco difícil de entender. Así que pensé en compartir mi solución y espero que ayude a alguien que lo necesite. Puede haber mejores maneras de hacer esto, pero estoy compartiendo lo que funcionó mejor para mí. Dado que no hay interacción del usuario involucrada en nuestro caso de uso, no queremos usar el proceso OAuth donde el usuario necesita abrir un navegador e iniciar sesión en su cuenta de Google para autorizar la aplicación. Para escenarios como este, Google tiene un concepto de . Una cuenta de servicio es un tipo especial de cuenta de Google destinada a representar a un usuario no humano que necesita autenticarse y estar autorizado para acceder a los datos en las API de Google. cuenta de servicio Al igual que una cuenta normal, una cuenta de servicio también tiene una dirección de correo electrónico (aunque no tiene un buzón de correo real y no puede enviar correos electrónicos a una cuenta de correo electrónico de servicio). Y al igual que puede compartir una hoja de Google con un usuario usando su dirección de correo electrónico, también puede compartir una hoja de Google con una cuenta de servicio usando su dirección de correo electrónico. Y esto es exactamente lo que vamos a hacer en este tutorial. Crearemos una hoja de cálculo en Hojas de cálculo de Google con un usuario normal, la compartiremos con una cuenta de servicio (que crearemos) y usaremos las credenciales de la cuenta de servicio en nuestro script de Node.js para leer y modificar esa hoja. requisitos previos Este tutorial asume que usted tiene: Experiencia trabajando con Node.js Una cuenta de Google Una configuración de proyecto en la consola de desarrolladores de Google donde tiene privilegios de administrador Resumen de pasos Aquí está la lista de pasos que seguiremos a través de este tutorial: Crear una hoja de cálculo en las hojas de Google Habilite la API de Google Sheets en nuestro proyecto en la consola de desarrolladores de Google Crear una cuenta de servicio Comparta la hoja de cálculo creada en el paso 1 con la cuenta de servicio creada en el paso 3 Escriba un servicio de Node.js para acceder a las hojas de Google creadas en el paso 1 usando las credenciales de la cuenta de servicio Pruebe nuestro servicio escrito en el paso 5 Ahora que tenemos un esquema de lo que vamos a hacer, comencemos. Paso 1: crea una hoja de cálculo en Hojas de cálculo de Google Este realmente no necesita ninguna instrucción. Solo necesita iniciar sesión en su cuenta de Google, abrir Google Drive y crear una nueva hoja de Google. Puedes poner algunos datos aleatorios en él. Una cosa de la que debemos tomar nota es la identificación de la hoja. Cuando tenga la hoja abierta en su navegador, la URL se verá así: . https://docs.google.com/spreadsheets/d/1-XXXXXXXXXXXXXXXXXXXSgGTwY/edit#gid=0 Y en esta URL, es la identificación de la hoja de cálculo y será diferente para cada hoja de cálculo. Tome nota porque lo necesitaremos en nuestro script Node.js para acceder a esta hoja de cálculo. Para este tutorial, aquí están los datos que hemos almacenado en nuestra hoja de cálculo: 1-XXXXXXXXXXXXXXXXXX SgGTwY Paso 2: habilite la API de Google Sheets en nuestro proyecto en la consola de desarrolladores de Google Necesitamos habilitar la API de Hojas de cálculo de Google para nuestro proyecto para poder usarla. Este tutorial asume que ya tiene un proyecto en la consola de desarrolladores de Google, por lo que si no tiene uno, puede crear uno nuevo muy fácilmente. Una vez que tenga el proyecto en la consola de desarrolladores de Google, abra el panel del proyecto. Allí debería ver un botón . Habilitar API y servicios Haga clic en él y busque la API de hojas de Google usando la barra de búsqueda. Una vez que lo vea, haga clic en él y luego haga clic en Habilitar Paso 3: crea una cuenta de servicio Una vez que habilite la API de Hojas de cálculo de Google en su proyecto, verá la página donde puede configurar los ajustes para esta API. Haga clic en la pestaña en la barra lateral izquierda. Aquí verá una lista de ID de clientes y cuentas de servicio de OAuth. Por defecto no debería haber ninguno. Credenciales Haga clic en el botón en la parte superior y seleccione la opción Crear credenciales Cuenta de servicio Ingrese el nombre y la descripción de la cuenta de servicio y haga clic en el botón . Crear Haga clic en en el siguiente cuadro de diálogo Continuar En el siguiente cuadro de diálogo, obtiene una opción para crear una clave. Este es un paso importante. Haga clic en el botón y elija como formato. Esto le pedirá que descargue el archivo JSON en su máquina local. Crear clave JSON Para este tutorial, cambié el nombre del archivo y lo guardé como en mi máquina local. service_account_credentials.json Guárdelo en un lugar seguro. Este archivo clave contiene las credenciales de la cuenta de servicio que necesitamos en nuestro script de Node.js para acceder a nuestra hoja de cálculo desde Hojas de cálculo de Google. Una vez que haya seguido todos estos pasos, debería ver la cuenta de servicio recién creada en la página de credenciales. Tome nota de la dirección de correo electrónico de la cuenta de servicio. Tendremos que compartir nuestra hoja de cálculo con esta cuenta. Paso 4: Comparta la hoja de cálculo creada en el paso 1 con la cuenta de servicio creada en el paso 3 Ahora que tenemos una cuenta de servicio, debemos compartir nuestra hoja de cálculo con ella. Es como compartir una hoja de cálculo con cualquier cuenta de usuario normal. Abra la hoja de cálculo en su navegador y haga clic en el botón en la esquina superior derecha. Eso abrirá un modal donde deberá ingresar la dirección de correo electrónico de la cuenta de servicio. Desmarque la casilla de verificación para ya que esto enviará un correo electrónico y dado que la cuenta de servicio no tiene ningún buzón de correo, le dará una notificación de falla en la entrega del correo. Compartir Notificar a las personas, Haga clic en el botón _Aceptar_ para compartir la hoja de cálculo con la cuenta de servicio. Esto completa todos los pasos de configuración. Ahora podemos llegar a la parte divertida :-) Paso 5: escriba un servicio de Node.js para acceder a la hoja de Google usando las credenciales de la cuenta de servicio Crearemos nuestro script como un servicio que se puede usar como parte de un proyecto más grande. Lo llamaremos . Expondrá las siguientes API: googleSheetsService.js getAuthToken obtener hoja de cálculo obtener valores de hoja de cálculo La función es donde manejaremos la autenticación y devolverá un token. Luego usaremos ese token y lo pasaremos a otros métodos. getAuthToken No cubriremos la escritura de datos en la hoja de cálculo, pero una vez que tenga la idea básica de cómo usar la API, será fácil ampliar el servicio para agregar más y más funciones compatibles con la API de Hojas de cálculo de Google. Usaremos el módulo npm. Entonces, comencemos creando un directorio para este proyecto de demostración. Llamémoslo . googleapis google-sheets-demo google-sheets-demo google-sheets-demo cd $HOME mkdir cd Copie el archivo que creamos en el paso 3 a este directorio ( ). Y crea nuestro nuevo archivo . service_account_credentials.json google-sheets-demo googleSheetsService.js Pegue las siguientes líneas en el archivo: { google } = ( ) SCOPES = [ ] { auth = google.auth.GoogleAuth({ : SCOPES }); authToken = auth.getClient(); authToken; } .exports = { getAuthToken, } // googleSheetsService.js const require 'googleapis' const 'https://www.googleapis.com/auth/spreadsheets' async ( ) function getAuthToken const new scopes const await return module Por ahora, nuestro servicio solo tiene una función que devuelve el token de autenticación. Agregaremos otra función pronto. Primero veamos qué hace nuestra función. getSpreadSheet Primero, requerimos el módulo npm. Luego definimos . Cuando creamos un token de autenticación usando las API de Google, existe un concepto de alcance que determina el nivel de acceso que tiene nuestro cliente. googleapis SCOPES Para leer y editar hojas de cálculo, necesitamos acceso al alcance . https://www.googleapis.com/auth/spreadsheets De manera similar, si solo tuviéramos que dar acceso de solo lectura a las hojas de cálculo, habríamos usado el alcance . https://www.googleapis.com/auth/spreadsheets.readonly Dentro de la función , estamos llamando al constructor pasando los ámbitos en el objeto de argumentos. getAuthToken new google.auth.GoogleAuth Esta función espera que estén disponibles dos variables de entorno, , que es el ID del proyecto de la consola de desarrollo de Google, y que indica la ruta del archivo que contiene las credenciales de la cuenta de servicio. GCLOUD_PROJECT GOOGLE_APPLICATION_CREDENTIALS, Tendremos que configurar estas variables de entorno desde la línea de comandos. Para obtener el ID del proyecto, puede obtenerlo de la URL del proyecto cuando lo abre en su navegador web. Debe tener un aspecto como este https://console.cloud.google.com/home/dashboard?project={ID del proyecto} Y debe contener la ruta del archivo . Entonces, vaya a la terminal y desde el directorio , ejecute los siguientes comandos para configurar estas variables de entorno: GOOGLE_APPLICATION_CREDENTIALS service_account_credentials.json google-sheets-demo GCLOUD_PROJECT={project ID of your google project} =./service_account_credentials.json export export GOOGLE_APPLICATION_CREDENTIALS Debe asegurarse de tener el archivo de credenciales copiado en el directorio actual. Ahora añadiremos dos funciones más a nuestro servicio: obtener hoja de cálculo obtener valores de hoja de cálculo El primero devolverá metadatos sobre la hoja de cálculo, mientras que el segundo devolverá los datos dentro de la hoja de cálculo. Nuestro archivo modificado debería verse así: googleSheetsService.js { google } = ( ); sheets = google.sheets( ); SCOPES = [ ]; { auth = google.auth.GoogleAuth({ : SCOPES }); authToken = auth.getClient(); authToken; } { res = sheets.spreadsheets.get({ spreadsheetId, auth, }); res; } { res = sheets.spreadsheets.values.get({ spreadsheetId, auth, : sheetName }); res; } .exports = { getAuthToken, getSpreadSheet, getSpreadSheetValues } // googleSheetsService.js const require 'googleapis' const 'v4' const 'https://www.googleapis.com/auth/spreadsheets' async ( ) function getAuthToken const new scopes const await return async ( ) function getSpreadSheet {spreadsheetId, auth} const await return async ( ) function getSpreadSheetValues {spreadsheetId, auth, sheetName} const await range return module En la parte superior hemos añadido una línea sheets = google.sheets( ); const 'v4' Esto es para usar la API de hojas. Luego hemos agregado las dos nuevas funciones y . Para ver todos los puntos de conexión de la API compatibles con la API de Hojas de cálculo de Google, consulte este enlace getSpreadSheet getSpreadSheetValues https://developers.google.com/sheets/api/reference/rest Para nuestra demostración, solo estamos usando dos de esos. La función espera el token de y el ID de hoja de como sus parámetros. Y espera un parámetro adicional que es el nombre de desde el que obtener los datos. getSpreadSheet autenticación cálculo getSpreadSheetValues hoja De forma predeterminada, una hoja de cálculo solo contiene una sola hoja y se denomina . Finalmente, exportamos las funciones recién agregadas a través . Hoja1 de module.exports Esto completa nuestro . Si necesita admitir más funciones API, puede verificar la referencia usando el enlace anterior, agregar las funciones de contenedor correspondientes en este servicio y exportarlo usando . googleSheetsService module.exports Para cualquier consumidor de este servicio, primero deberá llamar a la función para obtener el token de autenticación y luego pasar ese token a las funciones posteriores como , , etc. getAuthToken() getSpreadSheet() getSpreadSheetValues() Ahora que tenemos nuestro servicio listo, solo necesitamos probarlo para asegurarnos de que funciona bien. Paso 6: prueba nuestro servicio Así que tenemos nuestro servicio listo. ¿Pero funciona? Comprobemos eso. Si bien normalmente usaríamos un marco de prueba para ejecutar pruebas unitarias, para simplificar este tutorial, escribiremos un script simple de Node.js. Desde el directorio de nuestro proyecto, cree un nuevo archivo llamado y copie y pegue los siguientes contenidos: test.js { getAuthToken, getSpreadSheet, getSpreadSheetValues } = ( ); spreadsheetId = process.argv[ ]; sheetName = process.argv[ ]; { { auth = getAuthToken(); response = getSpreadSheet({ spreadsheetId, auth }) .log( , .stringify(response.data, , )); } (error) { .log(error.message, error.stack); } } { { auth = getAuthToken(); response = getSpreadSheetValues({ spreadsheetId, sheetName, auth }) .log( , .stringify(response.data, , )); } (error) { .log(error.message, error.stack); } } { testGetSpreadSheet(); testGetSpreadSheetValues(); } main() const require './googleSheetsService.js' const 2 const 3 async ( ) function testGetSpreadSheet try const await const await console 'output for getSpreadSheet' JSON null 2 catch console async ( ) function testGetSpreadSheetValues try const await const await console 'output for getSpreadSheetValues' JSON null 2 catch console ( ) function main Este archivo contiene dos funciones de prueba y una función que llama a esas funciones de prueba. En la parte inferior del archivo, estamos ejecutando la función . Este script espera dos argumentos de línea de comando: principal principal spreadsheetId (este es el ID que obtuvimos del paso 1) sheetName (este es el nombre de la hoja de cálculo para la que desea ver los valores. Cuando crea una nueva hoja de cálculo, es ) Sheet1 Además, asegúrese de que las variables y estén configuradas correctamente. de entorno GCLOUD_PROJECT GOOGLE_APPLICATION_CREDENTIALS Ahora, desde la terminal, ejecute este script .js node test <your google sheet's spreadsheet id> <sheet name of the worksheet> Si ha seguido todos los pasos correctamente, debería ver un resultado como este: output getSpreadSheet { : , : { : , : , : , : , : { : { : , : , : }, : { : , : , : , : }, : , : , : { : {}, : , : , : , : , : , : } } }, : [ { : { : , : , : , : , : { : , : } } } ], : } output getSpreadSheetValues { : , : , : [ [ , , ], [ , , ], [ , , ], [ , , ], [ , , ] ] } for "spreadsheetId" "1-jG5jSgGTwXXXXXXXXXXXXXXXXXXY" "properties" "title" "test-sheet" "locale" "en_US" "autoRecalc" "ON_CHANGE" "timeZone" "Asia/Calcutta" "defaultFormat" "backgroundColor" "red" 1 "green" 1 "blue" 1 "padding" "top" 2 "right" 3 "bottom" 2 "left" 3 "verticalAlignment" "BOTTOM" "wrapStrategy" "OVERFLOW_CELL" "textFormat" "foregroundColor" "fontFamily" "arial,sans,sans-serif" "fontSize" 10 "bold" false "italic" false "strikethrough" false "underline" false "sheets" "properties" "sheetId" 0 "title" "Sheet1" "index" 0 "sheetType" "GRID" "gridProperties" "rowCount" 1000 "columnCount" 26 "spreadsheetUrl" "https://docs.google.com/spreadsheets/d/1-jG5jSgGTwXXXXXXXXXXXXXXXXXXY/edit" for "range" "Sheet1!A1:Z1000" "majorDimension" "ROWS" "values" "Name" "Country" "Age" "John" "England" "30" "Jane" "Scotland" "23" "Bob" "USA" "45" "Alice" "India" "33" Si obtiene un error, significa que no ha seguido todos los pasos correctamente. Para este tutorial, la versión del módulo de googleapis era . Es posible que tenga problemas si está utilizando una versión anterior del módulo. Asegúrese de que el ID de la hoja de cálculo y el nombre de la hoja sean correctos y que las variables de entorno estén configuradas correctamente. Si aún recibe el error, debe verificar el mensaje de error y el código para ver qué podría estar causando el problema. npm 43.0.0 Referencias Documentación para el cliente Google API Node.js. https://github.com/googleapis/google-api-nodejs-cliente Referencia oficial de la API de Hojas de cálculo de Google. https://developers.google.com/sheets/api/reference/rest Definitivamente recomendaría consultar estas referencias (especialmente la referencia oficial de la API de Google Sheets) para obtener una comprensión más profunda de la API de hojas y cómo usar el cliente Node.js. Espero que hayas encontrado útil este tutorial. Gracias y feliz codificación :-) Publicado anteriormente en http://codingfundas.com/how-to-read-edit-google-sheets-using-node-js/index.html