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 efficace.
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 informations d'identification par défaut de l'application, en revendiquant également certaines étendues OAuth autres que celles par défaut afin que les informations d'identification puissent être utilisées 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 qui peut 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 la façon d'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
Tâches Cloud Scheduler et Cloud Run. Faites-moi savoir si vous souhaitez en savoir plus à ce sujet.
Photo de couverture par Glib Albovsky sur Unsplash
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!