无法使用 Google 工作表 API 创建新电子表格

Unable to create a new spreadsheet with the Google Sheets API

我正在使用 googleapis 包创建新的 Google 电子表格,但它失败了。当我使用 web-based tools in the Google API documentation.

时同样的请求有效
Google.prototype.createSheet = function(filename, callback) {
    var services = google.sheets('v4');
    services.spreadsheets.create({
      properties : {title:filename},
      auth       : this.auth
    }, function(err,response) {
      if( err ) {
        console.log('Error : unable to create file, ' + err);
        return;
      } else {
        console.dir(response);
      }
    });
}

结果,

Error : unable to create file, Error: Invalid JSON payload received. Unknown name "properties": Cannot bind query parameter. Field 'properties' could not be found in request message.

我还尝试使用 "resource" 的 属性 名称而不是 "properties",因为我在其他工作表端点中发现了这一点。这也没有用,但在我调试 googleapis 代码时导致了不同的错误消息和不同的 API 请求。

Error : unable to create file, Error: Invalid JSON payload received. Unknown name "title" at 'spreadsheet': Cannot find field.

我也试过使用驱动器 API without success.

创建文件

哇。原来答案是我的两个实验的混合体。将属性封装在资源块中。

Google.prototype.createSheet = function(filename, callback) {
    var services = google.sheets('v4');
    services.spreadsheets.create({
      resource : {properties:{title:filename}},
      auth       : this.auth
    }, function(err,response) {
      if( err ) {
        console.log('Error : unable to create file, ' + err);
        return;
      } else {
        console.dir(response);
      }
    });
}

我在 Google API documentation 中没有看到 任何东西 表明这是发送请求的正确方式所以即使它有效,也不是很令人欣慰。

我建议使用 JWT/OAuth2.0 和一个服务帐户,您可以像这样通过 Google 云平台设置:

const {google} = require('googleapis');
let sheets = google.sheets('v4');

const serviceAccount = { INSERT_JSON_HERE  };

const client = new google.auth.JWT(
    serviceAccount.client_email,
    null,
    serviceAccount.private_key,
    ['https://www.googleapis.com/auth/spreadsheets', 
    'https://www.googleapis.com/auth/drive', 
    'https://www.googleapis.com/auth/drive.file'],
    null
);

  return new Promise((resolve, reject) => {
        sheets.spreadsheets.create({
            auth: client,
        }, (err, obj) => {
        if (err) {
            console.log(err);
            reject(err);
        } else {
            console.log(`New Spreadsheet ID: ${obj.data.spreadsheetId}`);
            resolve(obj);
        }
    });