如何将电子表格.values.batchUpdate 与 Google Cloud Functions 和 NodeJS 以及“googleapis”模块结合使用

gre*_*gn3 7 google-sheets node.js google-apps-script google-cloud-functions

我正在尝试以与此处spreadsheets.values.batchUpdate所述相同的方式使用 Google Sheets API函数。此示例使用 Google Apps 脚本。我想使用 Google Cloud Functions 来代替。

电子表格.values.batchUpdate API 文档可用。请注意,它与电子表格.batchUpdate不同,后者具有不同的语法。我有兴趣使用前者。

我想使用环境做同样的事情:Google Cloud Functions + nodejs8 + googleapismodule。

这是上面链接中的 Google Apps 脚本的示例代码:

function updateGoogleSheet(spreadsheetId) {

  /* Written by Amit Agarwal */
  /* Web: ctrlq.org  Email: amit@labnol.org */
  
  var data = [
    { 
      range: "Sheet1!A1",   // Update single cell
      values: [
        ["A1"]
      ]
    },
    {
      range: "Sheet1!B1:B3", // Update a column
      values: [
        ["B1"],["B2"],["B3"]
      ]
    },
    {
      range: "Sheet1!C1:E1", // Update a row
      values: [
        ["C1","D1","E1"]
      ]
    },
    {
      range: "Sheet1!F1:H2", // Update a 2d range
      values: [
        ["F1", "F2"],
        ["H1", "H2"]
      ]
    }];
  
  var resource = {
    valueInputOption: "USER_ENTERED",
    data: data
  };
  
  Sheets.Spreadsheets.Values.batchUpdate(resource, spreadsheetId);
  
}
Run Code Online (Sandbox Code Playgroud)

这是新环境下的上述代码:

const {google} = require('googleapis');
const sheets = google.sheets({version: 'v4'});
const auth = new google.auth.JWT (credentials.client_email, null, credentials.private_key, ['https://www.googleapis.com/auth/spreadsheets']);

function updateGoogleSheet (spreadsheetId) {

  /* Written by Amit Agarwal */
  /* Web: ctrlq.org  Email: amit@labnol.org */

  var data = [
    { 
      range: "Sheet1!A1",   // Update single cell
      values: [
    ["A1"]
      ]
    },
    {
      range: "Sheet1!B1:B3", // Update a column
      values: [
    ["B1"],["B2"],["B3"]
      ]
    },
    {
      range: "Sheet1!C1:E1", // Update a row
      values: [
    ["C1","D1","E1"]
      ]
    },
    {
      range: "Sheet1!F1:H2", // Update a 2d range
      values: [
    ["F1", "F2"],
    ["H1", "H2"]
      ]
    }];

  var resource = {
    spreadsheetId: spreadsheetId,
    auth: auth,
    valueInputOption: "USER_ENTERED",
    data: data
  };

  sheets.spreadsheets.values.batchUpdate (resource);

}
Run Code Online (Sandbox Code Playgroud)

但这会产生以下错误:

Error: Invalid JSON payload received. Unknown name "data[range]": Cannot bind query parameter. Field 'data[range]' could not be found in request message. Invalid JSON payload received. Unknown name "data[values]": Cannot bind query parameter. Field 'data[values]' could not be found in request message. at Gaxios.request (/srv/node_modules/gaxios/build/src/gaxios.js:70:23) at <anonymous> at process._tickDomainCallback (internal/process/next_tick.js:229:7) response: { config: [Object], data: [Object], headers: [Object], status: 400, statusText: 'Bad Request' }, config: { url: 'https://sheets.googleapis.com/v4/spreadsheets/......spreadsheetId....../values:batchUpdate?valueInputOption=USER_ENTERED&data%5Brange%5D=Sheet1%21A1&data%5Bvalues%5D=A1&data%5Brange%5D=Sheet1%21B1%3AB3&data%5Bvalues%5D=B1&data%5Bvalues%5D=B2&data%5Bvalues%5D=B3&data%5Brange%5D=Sheet1%21C1%3AE1&data%5Bvalues%5D=C1&data%5Bvalues%5D=D1&data%5Bvalues%5D=E1&data%5Brange%5D=Sheet1%21F1%3AH2&data%5Bvalues%5D=F1&data%5Bvalues%5D=F2&data%5Bvalues%5D=H1&data%5Bvalues%5D=H2', method: 'POST', paramsSerializer: [Function], headers: [Object], params: [Object], validateStatus: [Function], retry: true, responseType: 'json', retryConfig: [Object] }, code: 400, errors: [ [Object] ]

我的问题是,如何将资源参数格式化为spreadsheets.values.batchUpdate()才能使请求成功?

我找不到任何关于此的文档,但从上面的原始代码示例来看似乎是可能的。

Tan*_*ike 3

  • 您想使用Sheets API的spreadsheets.values.batchUpdate方法来放置值。
  • 您希望使用 googleapis 和 Node.js 来实现此目的。
  • 您已经能够使用 Sheets API 为电子表格添加和获取值。

如果我的理解是正确的,那么这个修改怎么样?

从:

var resource = {
  spreadsheetId: spreadsheetId,
  auth: auth,
  valueInputOption: "USER_ENTERED",
  data: data
};
Run Code Online (Sandbox Code Playgroud)

到:

var resource = {
  spreadsheetId: spreadsheetId,
  auth: auth,
  resource: { data: data, valueInputOption: "USER_ENTERED" }
};
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 如果发生错误,请确认以下几点。
    • 电子表格与服务帐户共享。
    • 表格 API 已启用。
  • 我可以确认上述修改的脚本与 Node.js v8.0.0 和 v12.9.0(最新)的 v42.0.0(最新)的 googleapis 一起工作。

参考:

如果这没有解决您的问题,我深表歉意。