如何在谷歌云函数中使用谷歌表 API

IT技术 javascript google-cloud-platform google-cloud-functions
2021-03-10 07:22:34

我正在试用 Google 的 Cloud Functions 服务,我想阅读和编写 Google 电子表格,但似乎找不到任何示例或方法来执行此操作。

我的问题源于以下事实:Google 云功能的示例 javascript 是:

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

这有效,但我想以谷歌为例,从谷歌电子表格中读取:

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

有谁知道这是否可能或一个示例说明如何做类似的事情?

3个回答

这是我如何使用 Google Cloud Functions 做到的。我认为 OAuth 不太适合,因为 Cloud Functions 经常在无人值守的情况下运行。幸运的是,有服务帐户,用于机器对机器的通信。


1. 在您的 Cloud 项目中创建一个服务帐户

在此处输入图片说明

在此处输入图片说明


2. 保存服务帐号密钥

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


3. 创建 API 密钥

在此处输入图片说明


4.保存API密钥

将步骤 3 中的 API 密钥复制并保存api_key.json在项目目录中名为的文件中。它应该是这样的:

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

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

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

在此处输入图片说明


6. 调用谷歌的 Sheets API

这是我的代码,每次调用 Cloud Functions 时都会在电子表格中附加一行。

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

希望这可以帮助!

获取选项API key在 Google Cloud Console 中不再可用,或者我想它已移至其他地方。
2021-04-15 07:22:34
一直工作到现在。非常简单易懂。非常感谢小伙子!
2021-04-26 07:22:34
也许这可以通过在 Node.JS 的本地副本上通过 NPM 手动添加 Sheet API 来实现,但此功能无法在 Google 中部署,我已经尝试过,但云环境无法识别“googleapis”。
2021-05-04 07:22:34
Axel,当我将它部署到 Google 时,上面的代码对我有用。您提到服务器无法识别“googleapis”。起初我也遇到了这个错误,当时我在上面的第一行省略了“google”周围的花括号。另一件事要检查:您是否 npm install googleapis 所以它进入您的 package-lock.json 文件,并与您的代码一起部署?
2021-05-07 07:22:34
是的,我也是这样解决问题的。代码确实需要一些更新才能使用新的 API。自从我使用它已经有一段时间了,我忘记了需要以不同方式完成的事情,尤其是在 Google 控制台中,但我让一切正常,现在已经投入生产。
2021-05-11 07:22:34

我找到了一种方法,以与其他服务相同的自动身份验证方式执行此操作。

在 NodeJS API README 中,他们有一个自动身份验证示例,我们可以像这样将其应用于 Sheets API:

索引.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 });
    })
};

包.json:

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

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

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

地方发展

如果将 .env 变量设置服务帐户凭据 JSON 文件的路径,则可以使用相同的代码进行本地开发GOOGLE_APPLICATION_CREDENTIALS

例如,当您的代码在本地开发人员机器上运行时,将创建一个 JWT 身份验证客户端,当相同的代码在 Google Compute Engine 的配置实例上运行时,将创建一个计算客户端

https://github.com/googleapis/google-api-nodejs-client#service-to-service-authentication

GOOGLE_APPLICATION_CREDENTIALS="/path/to/myapp-375951-sa01517d6251.json"

https://cloud.google.com/docs/authentication/getting-started#setting_the_environment_variable

@JanKrynauw 我不知道 Python,但看起来你可以拿这个例子但使用google-auth而不是 oauth2client
2021-04-15 07:22:34
@Matt,明白了,谢谢!我会更新我的答案并指向你的。我真的很喜欢你的方法。
2021-04-22 07:22:34
谢谢你的帖子。阅读本文后几分钟就更新了我的电子表格。定义。一个可以接受的答案。
2021-04-22 07:22:34
我已经尝试过但没有运气并在此处发布详细信息:stackoverflow.com/questions/51886522/...
2021-05-05 07:22:34
是否有与此等效的python?
2021-05-07 07:22:34

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

您需要添加有关如何在没有链接的情况下解决问题的更多详细信息(链接将来可能会断开)。
2021-04-23 07:22:34
这是缓存的链接,以防万一它确实中断,另一种选择是互联网存档webcache.googleusercontent.com/...
2021-05-14 07:22:34