【问题标题】:googleapis service account create new spreadsheet and grant permissions to usergoogleapis 服务帐户创建新电子表格并向用户授予权限
【发布时间】:2019-05-04 12:43:36
【问题描述】:

我能够使用服务帐户创建 google 表格,但无法为用户插入表格的权限:

function createSheet(jwt, apiKey) {
  const sheets = google.sheets({version: 'v4'});
  var request = {
    resource: {
      "properties": {
        "title": "testSheet"
      }
    },
    auth: jwt 
  };

以下是 create sheet api 的响应:

config: {transformRequest: {…}, transformResponse: {…}, timeout: 0, xsrfCookieName: "XSRF-TOKEN", xsrfHeaderName: "X-XSRF-TOKEN", …}
data: {spreadsheetId: "XXX", properties: {…}, sheets: Array(1), spreadsheetUrl: "https://docs.google.com/spreadsheets/d/XXX/edit"}
...
status: 200
statusText: "OK"

我的代码。

function insertPermission(fileId) {
  var body = {
    'value': 'xxx@gmail.com',
    'type': 'user',
    'role': 'owner'
  };
  var drive=google.drive({version: 'v3'});
   drive.permissions.create({
    'fileId': fileId,  //sheetID returned from create sheet response
    'resource': body
  }, function(err, response) {if (err) {
    console.error(err);
    return;
    } else{
      console.log(JSON.parse(JSON.stringify(response))) ;
    }
  });

insertPermission 出错:

index.js:114 错误:权限不足 在创建错误时

或者,有没有办法在 sheet.create api 中指定文件权限?

【问题讨论】:

  • 在这里解决了这个问题。关于服务帐户的注意点是它与您的个人帐户不同。复制服务帐户电子邮件地址并授予它访问您 Google 驱动器上目录的权限。另外用户驱动 api 来创建文件而不是工作表 api -
  • 此外,gdrive 上还有一个设置来创建文件夹并授予服务帐户对该文件夹的读/写权限。 MyDrive 可通过用户 ID 而不是服务帐户访问。问题现已解决。

标签: node.js google-api google-drive-api google-api-nodejs-client


【解决方案1】:

createError 时权限不足

通常意味着您登录的用户无权执行他们正在尝试执行的操作。

  1. 您确定它是运行此插入的服务帐户,因为它拥有文件,只有它可以转让所有权。
  2. 您是如何以服务帐户登录的?您有类似作用域的东西吗?是否添加了写入作用域之一。

如果你检查transferring_ownership

var fileId = '1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ';
var permissions = [
  {
    'type': 'user',
    'role': 'writer',
    'emailAddress': 'user@example.com'
  }, {
    'type': 'domain',
    'role': 'writer',
    'domain': 'example.com'
  }
];
// Using the NPM module 'async'
async.eachSeries(permissions, function (permission, permissionCallback) {
  drive.permissions.create({
    resource: permission,
    fileId: fileId,
    fields: 'id',
  }, function (err, res) {
    if (err) {
      // Handle error...
      console.error(err);
      permissionCallback(err);
    } else {
      console.log('Permission ID: ', res.id)
      permissionCallback();
    }
  });
}, function (err) {
  if (err) {
    // Handle error
    console.error(err);
  } else {
    // All permissions inserted
  }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多