web-dev-qa-db-ja.com

Google Cloud関数内でGoogle Sheets APIを使用する方法

私はGoogleのCloud Functionsサービスを試していますが、Googleスプレッドシートを読み書きしたいのですが、これを行う例や方法が見つからないようです。

私の問題は、Googleクラウド関数のサンプルJavaScriptが次のとおりであるという事実から生じます。

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

これは機能しますが、Googleが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);
    });
    });
  }

これが可能かどうか、またはこれに似た方法を実行する方法を示す例を誰かが知っていますか?

16
Frank E

これがGoogle Cloud Functionsでどのように実行したかです。 Cloud Functionsは無人で実行されることが多いため、OAuthは適していません。幸い、サービスアカウント、マシン間通信用です。


1. Cloudプロジェクトにサービスアカウントを作成する

enter image description here

enter image description here


2.サービスアカウントキーを保存します

手順1では、JSON形式のキーファイルがコンピューターにダウンロードされました。それをプロジェクトディレクトリに保存し、名前をcredentials.jsonに変更します。


3. APIキーを作成する

enter image description here


4. APIキーを保存します

手順3のAPIキーをコピーして、プロジェクトディレクトリのapi_key.jsonというファイルに保存します。次のようになります。

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

5.サービスアカウントへのスプレッドシートアクセスを許可する

手順1で作成したサービスアカウントのメールとスプレッドシートを共有します。

enter image description here


6. GoogleのSheets APIを呼び出す

Cloud Functionが呼び出されるたびにスプレッドシートに行を追加するコードを次に示します。

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);
    }
  });
}

お役に立てれば!

21
Martin Omander

他のサービス ができるのと同じ自動認証された方法でこれを行う方法を見つけました。

NodeJS APIのREADMEに、 auto-auth example があり、次のようにSheets APIに適用できます。

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"
  }
}

最後に、クラウド機能を実行しているサービスアカウントのメールアドレスとシートを共有します。

google.auth.getClientその例では、Cloud Functionにアタッチされているサービスアカウントの認証情報を検出します。そのため、認証シークレットを管理する必要なくSheets APIを操作できます。

13
Matt

Google Sheets APIをFirebase Cloud Functionsと統合する方法についてのヘルプを探して、何時間もウェブを閲覧してきました。

幸い、私はこの正確なトピックを扱っているこの投稿をMediumで見つけました:

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