如何在Google云端功能中使用Google Sheet API

Fra*_*k E 13 javascript google-cloud-platform google-cloud-functions

我正在尝试Google的云功能服务,我想阅读和编写Google Spreadsheets,但似乎无法找到任何示例或方法来执行此操作.

我的问题是因为Google云功能的示例javascript是:

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

这有效,但我想以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);
    });
    });
  }
Run Code Online (Sandbox Code Playgroud)

有谁知道这是可能的还是一个例子,说明如何做类似的事情?

Mar*_*der 18

以下是我使用Google云功能的方法.我认为OAuth不太适合,因为云功能通常无人值守.幸运的是,有一些服务帐户,用于机器到机器的通信.


1.在Cloud项目中创建服务帐户

在此输入图像描述

在此输入图像描述


2.保存服务帐户密钥

在步骤1中,在您的计算机上下载了JSON格式的密钥文件.将其保存在项目目录中并重命名credentials.json.


3.创建API密钥

在此输入图像描述


4.保存API密钥

将步骤3中的API密钥复制并保存api_key.json在项目目录中调用的文件中.它应该如下所示:

{
  "key": "<PASTE YOUR API KEY HERE>"
}
Run Code Online (Sandbox Code Playgroud)

5.授予对服务帐户的电子表格访问权限

与使用步骤1中创建的服务帐户电子邮件共享电子表格.

在此输入图像描述


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);
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 是的,我也是这样解决问题的。该代码确实需要进行一些更新才能使用新的 API。自从我使用这个以来已经有一段时间了,我忘记了需要以不同方式完成的事情,尤其是在 Google 控制台中,但我让一切正常工作,并且现在正在生产中。 (2认同)

Mat*_*att 11

我找到了一种与其他服务相同的自动身份验证方法。

在NodeJS API README中,他们有一个自动身份验证示例,我们可以将其应用于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 });
    })
};
Run Code Online (Sandbox Code Playgroud)

package.json:

{
  "dependencies": {
    "googleapis": "^42"
  }
}
Run Code Online (Sandbox Code Playgroud)

最后,将表格与运行云功能的服务帐户的电子邮件地址共享。

google.auth.getClient在该示例中,将检测到附加到云功能的服务帐户的凭据。因此,您可以与Sheets API进行交互,而无需管理任何身份验证机密。


小智 6

我已经浏览了几个小时的网页,以寻求有关如何将 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

  • 您需要添加有关如何在没有链接的情况下解决问题的更多详细信息(链接将来可能会断开)。 (4认同)