"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Escriba en Google Sheets desde una secuencia de comandos local mediante la autenticación CLI de gcloud

Escriba en Google Sheets desde una secuencia de comandos local mediante la autenticación CLI de gcloud

Publicado el 2024-11-03
Navegar:198

Write to Google Sheets from a local script via gcloud CLI authentication

Recientemente necesitaba extraer datos de la API de GitHub y publicarlos en una hoja de cálculo de Google para poder compartir algunos gráficos sobre la carga de trabajo de revisión de código. Esta publicación trata sobre cómo logré que funcionara la autenticación.

Escribí un script de Node.js porque mi caso de uso era demasiado complejo para BASH y parecía demasiado temporal para Go. Inicialmente, el script generaba datos CSV ad hoc que podía copiar manualmente en Google Sheets usando la función Pegar como CSV. Después de algunas rondas de copia manual, quería usar mi tiempo sabiamente: estimé que podría lograr que una integración de Hojas de cálculo funcionara en un par de horas y, de ser así,
probablemente se amortice en unos pocos meses.

Aparte: Sheets no es mi base de datos. Es mi interfaz de usuario de informes de datos. No utilices Hojas de cálculo como base de datos.

Me tomó cerca de 4 horas hacer que esto funcionara, porque la autenticación es difícil. Esta publicación muestra el camino más directo hacia una solución funcional.

Es fácil distraerse con la complejidad de crear una aplicación oAuth y, aunque me gusta especialmente usar una cuenta de servicio de mis servicios en la nube, eso es
menos conveniente cuando se ejecuta localmente.

El truco que aprendí es que la configuración de las credenciales predeterminadas de la aplicación de la CLI de gcloud puede funcionar como una especie de proxy OAuth para el código de Google Workspace, al expandir la forma en que autentica su cuenta con Google para incluir algunos permisos más (OAuth Scopes).

? Autenticación local con la CLI de gcloud

Para realizar solicitudes de API a Google Sheets, habilite la API de Sheets en su proyecto en la nube:

$> gcloud services enable sheets.googleapis.com

Operation "operations/acat.p2-480745230567-02564c8d-c6ba-4f60-90bd-13f33e41f0fe" finished successfully.

Establezca las credenciales predeterminadas de su aplicación y reclame también algunos alcances de OAuth no predeterminados para que la credencial se pueda usar con hojas:

$> gcloud auth application-default login --scopes \
   'https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets'

Esto activará un flujo de OAuth que implica visitar una página web en su navegador. Dependiendo de la configuración del terminal, esto puede mostrar una URL o incluso abrir la página.

Cuando a gcloud se le otorga este alcance, el código que puede acceder a tus credenciales locales tendrá acceso de lectura/escritura a todos tus datos de Google Sheets. Puede volver a ejecutar este comando sin los ámbitos personalizados para activar y desactivar ese acceso según sea necesario.

?️ Inicializar un cliente Node para Google Sheets

import {google} from 'googleapis';

function sheetsClient() {
    const authConfig = new google.auth.GoogleAuth({
        scopes: [
            // Only 'spreadsheets' scope is needed in the code.
            // gcloud CLI also needs 'cloud-platform' and 'drive'.
            'https://www.googleapis.com/auth/spreadsheets'
        ],
    });
    const auth = await authConfig.getClient();
    return google.sheets({version: 'v4', auth});
}

? Agregar datos a la hoja

La muestra de los documentos sobre cómo agregar datos a la hoja
(haga clic en la pestaña Node.js) funcionó bien. Sin embargo, no podía entender cómo hacer que la autenticación funcione desde allí. El ejemplo funcionó una vez que entendí el truco anterior para agregar los ámbitos OAuth faltantes a las credenciales de mi entorno de desarrollo.

Hice algunos cambios para permitir una reutilización más sencilla del cliente, parametrizar la solicitud de manera diferente y enfatizar cómo quería que Sheets manejara los datos.

Mi código para agregar datos a la hoja, aprovechando el código de inicialización del cliente anterior:

let client;

async function appendDataToSheet(spreadsheetId, tab, values) {
    if (!client) {
        client = sheetsClient();
    }

    try {
        const result = await client.spreadsheets.values.append({
            spreadsheetId,
            range: `${tab}!A2:AG`,
            // Use my data as provided.
            valueInputOption: 'RAW',
            // Inserts rows as part of appending to reduce overwrites.
            insertDataOption: 'INSERT_ROWS',
            requestBody: { values },
        });
        console.log(`${result.data.updates.updatedCells} cells appended.`);
    } catch(e) {
        // Show the error, do not stop. Cross-reference the error with terminal output
        // and decide case-by-case to re-run the script or manually copy data.
        console.error(e);
    }
}

Estoy usando "append" porque mi secuencia de comandos recopila métricas mensuales y append me permite agregar nuevas filas sin eliminar las filas anteriores.

Aquí hay un ejemplo de cómo llamar a la función appendDataToSheet():

const values = [
  // Each nested array is a spreadsheet row.
  [1, 2, 3, 4, 'luggage'],
  [4, 5, 6, 'N/A', 'sticks'],
];
appendDataToSheet(
  'HPDkfqdu6rfIq5-4uTGDqz2tvmPxDZMul27JFexample',
  'Exported Data Tab',
  values
);

Hay algunos buenos consejos sobre cómo trabajar con la API de Hojas de cálculo en los documentos, como la sugerencia de no enviar más de una solicitud de API por segundo por hoja. Lo descubrí por las malas: sobrescribiendo los datos de una primera solicitud con los datos de una segunda.

? ¡Envíalo!

Si sigo adelante para producir esto, podría cambiar a usar
Programador de nube y trabajos de ejecución de nube. Déjame saber si quieres leer sobre eso.

Foto de portada de Glib Albovsky en Unsplash

Declaración de liberación Este artículo se reproduce en: https://dev.to/googlecloud/write-to-google-sheets-from-a-local-script-via-gcloud-cli-authentication-3p1f?1 Si hay alguna infracción, por favor contacto Study_golang@163 .comeliminar
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3