web-dev-qa-db-fra.com

Comment utiliser l'API Google Sheets dans une fonction Google Cloud

J'essaie le service Google Cloud Functions et je veux lire et écrire une feuille de calcul Google, mais je n'arrive pas à trouver d'exemples ou de façons de le faire.

Mon problème découle du fait que l'exemple de javascript pour une fonction cloud de Google est:

exports.helloWorld = function helloWorld (req, res) {
  res.send(`Hello ${req.body.name || 'World'}!`);
};

Cela fonctionne, mais je veux faire ce que google a comme exemple à lire à partir d'une feuille de calcul Google:

  gapi.load('client:auth2', initClient);

  function initClient() {
    gapi.client.init({
      discoveryDocs: DISCOVERY_DOCS,
      clientId: CLIENT_ID,
      scope: SCOPES
    }).then(function () {
      // Listen for sign-in state changes.
      gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);

      // Handle the initial sign-in state.
              gapi.client.sheets.spreadsheets.values.get({
      spreadsheetId: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms',
      range: 'Class Data!A2:E',
    }).then(function(response) {
      var range = response.result;
      if (range.values.length > 0) {
        appendPre('Name, Major:');
        for (i = 0; i < range.values.length; i++) {
          var row = range.values[i];
          // Print columns A and E, which correspond to indices 0 and 4.
          appendPre(row[0] + ', ' + row[4]);
        }
      } else {
        appendPre('No data found.');
      }
    }, function(response) {
      appendPre('Error: ' + response.result.error.message);
    });
    });
  }

Est-ce que quelqu'un sait si c'est possible ou un exemple qui montre comment faire quelque chose de similaire à cela?

16
Frank E

Voici comment je l'ai fait avec Google Cloud Functions. Je pensais que OAuth ne serait pas un bon choix, car les fonctions cloud fonctionnent souvent sans surveillance. Heureusement, il existe des comptes de service , destiné à la communication de machine à machine.


1. Créez un compte de service dans votre projet Cloud

enter image description here

enter image description here


2. Enregistrez la clé du compte de service

À l'étape 1, un fichier clé au format JSON a été téléchargé sur votre ordinateur. Enregistrez-le dans votre répertoire de projet et renommez-le credentials.json.


3. Créez une clé API

enter image description here


4. Enregistrez la clé API

Copiez et enregistrez la clé API de l'étape 3 dans un fichier appelé api_key.json dans le répertoire de votre projet. Ça devrait ressembler à ça:

{
  "key": "<PASTE YOUR API KEY HERE>"
}

5. Accordez l'accès aux feuilles de calcul au compte de service

Partagez la feuille de calcul avec l'e-mail du compte de service créé à l'étape 1.

enter image description here


6. Appelez l'API Google Sheets

Voici mon code qui ajoute une ligne à la feuille de calcul à chaque appel de la fonction Cloud.

const {google} = require('googleapis');

exports.reply = (req, res) => {
  var jwt = getJwt();
  var apiKey = getApiKey();
  var spreadsheetId = '<PASTE YOUR SPREADSHEET ID HERE>';
  var range = 'A1';
  var row = [new Date(), 'A Cloud Function was here'];
  appendSheetRow(jwt, apiKey, spreadsheetId, range, row);
  res.status(200).type('text/plain').end('OK');
};

function getJwt() {
  var credentials = require("./credentials.json");
  return new google.auth.JWT(
    credentials.client_email, null, credentials.private_key,
    ['https://www.googleapis.com/auth/spreadsheets']
  );
}

function getApiKey() {
  var apiKeyFile = require("./api_key.json");
  return apiKeyFile.key;
}

function appendSheetRow(jwt, apiKey, spreadsheetId, range, row) {
  const sheets = google.sheets({version: 'v4'});
  sheets.spreadsheets.values.append({
    spreadsheetId: spreadsheetId,
    range: range,
    auth: jwt,
    key: apiKey,
    valueInputOption: 'RAW',
    resource: {values: [row]}
  }, function(err, result) {
    if (err) {
      throw err;
    }
    else {
      console.log('Updated sheet: ' + result.data.updates.updatedRange);
    }
  });
}

J'espère que cela t'aides!

21
Martin Omander

J'ai trouvé un moyen de le faire de la même manière auto-authentifiée que le autres services peut.

Dans le README de l'API NodeJS, ils ont un exemple d'authentification automatique que nous pouvons appliquer à l'API Sheets comme ceci:

index.js:

const { google } = require('googleapis');
const { promisify } = require('util');

exports.main = (req, res) => {
  google.auth.getClient({
    scopes: ['https://www.googleapis.com/auth/spreadsheets'],
  }).then(auth => {
    const api = google.sheets({ version: 'v4', auth });
    const getSheets = promisify(api.spreadsheets.get.bind(api.spreadsheets));
    return getSheets({ spreadsheetId: 'SPREADSHEET_ID' });
  })
    // This just prints out all Worksheet names as an example
    .then(({ data: { sheets } }) => {
      res.status(200).send({ sheets });
    })
    .catch(err => {
      res.status(500).send({ err });
    })
};

package.json:

{
  "dependencies": {
    "googleapis": "^42"
  }
}

Enfin, partagez la feuille avec l'adresse e-mail du compte de service exécutant la fonction cloud.

google.auth.getClient dans cet exemple détectera les informations d'identification du compte de service associé à la fonction cloud. Vous pouvez donc interagir avec l'API Sheets sans avoir à gérer de secrets d'authentification.

13
Matt

Je navigue sur le Web depuis des heures à la recherche d'aide sur la façon d'intégrer l'API Google Sheets aux fonctions Cloud de Firebase.

Heureusement, j'ai trouvé cet article sur Medium qui traite de ce sujet précis:

https://medium.com/@elon.danziger/fast-flexible-and-free-visualizing-newborn-health-data-with-firebase-nodejs-and-google-sheets-1f73465a18bc

5
Jérôme Pott