Récemment, j'ai eu besoin d'extraire des données de l'API GitHub et de les publier sur une feuille Google afin de pouvoir partager des graphiques sur la charge de travail de révision de code. Cet article explique comment j'ai fait fonctionner l'authentification.
J'ai écrit un script Node.js car mon cas d'utilisation était trop complexe pour BASH et semblait trop temporaire pour Go. Initialement, le script générait des données CSV ad hoc que je pouvais copier manuellement dans Google Sheets à l'aide de la fonctionnalité Coller en tant que CSV. Après quelques copies manuelles, je voulais utiliser mon temps à bon escient : j'ai estimé que je pourrais faire fonctionner une intégration Sheets en quelques heures et si c'est le cas, ce serait
probablement rentable d’ici quelques mois.
À part : Sheets n'est pas ma base de données. C'est mon interface utilisateur de reporting de données. N'utilisez pas Sheets comme base de données.
Il m'a fallu près de 4 heures pour que cela fonctionne, car l'authentification est difficile. Cet article montre le chemin le plus direct vers une solution fonctionnelle.
Il est facile de se laisser distraire par la complexité de la création d'une application oAuth, et même si j'aime particulièrement utiliser un compte de service depuis mes services Cloud, c'est
moins pratique lors de l'exécution locale.
L'astuce que j'ai apprise est que la configuration des informations d'identification par défaut de l'application par gcloud CLI peut fonctionner comme une sorte de proxy OAuth pour le code Google Workspace, en élargissant la façon dont il authentifie votre compte auprès de Google pour inclure des autorisations supplémentaires (étendues OAuth).
Pour envoyer des requêtes API à Google Sheets, activez l'API Sheets dans votre projet Cloud :
$> gcloud services enable sheets.googleapis.com Operation "operations/acat.p2-480745230567-02564c8d-c6ba-4f60-90bd-13f33e41f0fe" finished successfully.
Définissez vos identifiants d'application par défaut, en revendiquant également certaines étendues OAuth autres que celles par défaut afin que les identifiants puissent être utilisés avec des feuilles :
$> 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'
Cela déclenchera un flux OAuth qui implique la visite d'une page Web dans votre navigateur. Selon la configuration du terminal, cela peut afficher une URL ou même ouvrir la page.
Lorsque gcloud se voit accorder cette portée, le code pouvant accéder à vos informations d'identification locales aura un accès en lecture/écriture à toutes vos données Google Sheets. Vous pouvez réexécuter cette commande sans les étendues personnalisées pour activer et désactiver cet accès selon vos besoins.
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}); }
L'exemple de la documentation sur la façon d'ajouter des données à la feuille
(cliquez sur l'onglet Node.js) a bien fonctionné. Cependant, je ne comprenais pas comment faire fonctionner l'authentification à partir de là. L'exemple a fonctionné une fois que j'ai compris l'astuce ci-dessus pour ajouter les étendues OAuth manquantes aux informations d'identification de mon environnement de développement.
J'ai apporté quelques modifications pour permettre une réutilisation plus facile du client, paramétrer la requête différemment et souligner la manière dont je souhaitais que les données soient traitées par Sheets.
Mon code pour ajouter des données à la feuille, en exploitant le code d'initialisation du client ci-dessus :
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); } }
J'utilise "append" car mon script collecte des métriques mensuelles et append me permet d'ajouter de nouvelles lignes sans supprimer les lignes précédentes.
Voici un exemple de comment appeler la fonction 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 );
La documentation contient quelques bons conseils sur l'utilisation de l'API Sheets, comme la suggestion de ne pas envoyer plus d'une requête API par seconde et par feuille. Je l'ai découvert à mes dépens : écraser les données d'une première requête par les données d'une seconde.
Si je passe à la production, je pourrais passer à l'utilisation de
Tâches Cloud Scheduler et Cloud Run. Faites-moi savoir si vous souhaitez en savoir plus.
Photo de couverture par Glib Albovsky sur Unsplash
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3