【问题标题】:Google sheets API v4 Create sheet and invite usersGoogle 表格 API v4 创建表格并邀请用户
【发布时间】:2016-10-24 09:21:27
【问题描述】:

我正在使用服务帐户身份验证来使用 Google 表格 API 创建一个 google 表格。我想创建一个电子表格并允许我的团队打开它。

    $private_key  = file_get_contents($rootDir . '/config/googleApiCredentials.p12');
    $client_email = 'project-names@positive-water-134xxx.iam.gserviceaccount.com';
    $scopes       = implode(' ', ["https://www.googleapis.com/auth/drive"]);

    $credentials = new \Google_Auth_AssertionCredentials(
        $client_email,
        $scopes,
        $private_key
    );
    // tried once with additional constructor params:
    // $privateKeyPassword = 'notasecret',
    // $assertionType = 'http://oauth.net/grant_type/jwt/1.0/bearer',
    // $sub = 'myMail@gmail.com

    $this->googleClient = new \Google_Client();
    $this->googleClient->setAssertionCredentials($credentials);
    if ($this->googleClient->getAuth()->isAccessTokenExpired()) {
        $this->googleClient->getAuth()->refreshTokenWithAssertion();
    }
    $service = new \Google_Service_Sheets($this->googleClient);
    $newSheet = new \Google_Service_Sheets_Spreadsheet();
    $newSheet->setSpreadsheetId('34534534'); // <- hardcoded for test
    $response = $service->spreadsheets->create($newSheet);
    print_r($response);

工作表正在创建,我收到响应

[spreadsheetId] => 34534534

但是,我无法通过浏览器使用我的 google 帐户打开此文件,即使我在 Google 的开发者控制台中添加为所有者、编辑者、作者和读者,在项目的权限中也是如此。浏览器说我未经授权,我可以联系管理员获取权限

有什么建议吗?有没有人管理过如何创建文档并为任何“人类”提供访问权限?

【问题讨论】:

  • 您在创建文件时以谁身份进行身份验证? goole-api-services 是什么意思?另外请添加 $service 的创建,以便我们可以更轻松地查看您的身份验证方式。
  • @DalmTo,我正在使用在开发人员控制台中创建的服务帐户。它看起来像:project-name@positive-water-134xxx.iam.gserviceaccount.com

标签: php google-api google-sheets google-api-php-client service-accounts


【解决方案1】:

服务帐户是虚拟用户。它有自己的驱动器帐户,它拥有在其帐户上创建的文件。服务帐户将需要授予您的个人 google drive 帐户访问所述文件的权限。 (与其他用户一样与您分享)

Permissions: insert 为文件插入权限。

注意:您目前已获得使用 Google 表格 API 的身份验证,您必须在 Google 开发人员控制台上将 google drive API(范围)添加到您的代码和项目中。无法通过 google sheet API 更改文件的权限。

是的,您将必须为您希望允许查看/编辑此文件的团队中的每个成员添加权限。

提示:当您添加 google drive API 时,请尝试执行 files.list 在结果中查找 downloadUrl、alternateLink 和 embedLink。有时这些已填写,可用于仅向其他用户共享可见内容。

【讨论】:

  • 谢谢,会试试的!你知道有没有什么方法可以使用别名同时为多个用户添加权限?
  • 不,您必须一次添加一个。但是首先查看谷歌驱动器api的新v3,我的链接都是v2,这是我最有经验的。它可能有一些更好的选择。
【解决方案2】:

可以为域帐户授予权限:

private function createNewSheet($title)
{
    $properties = new \Google_Service_Sheets_SpreadsheetProperties();
    $properties->setTitle($title);

    $newSheet = new \Google_Service_Sheets_Spreadsheet();
    $newSheet->setProperties($properties);

    $response = $this->sheetService->spreadsheets->create($newSheet);
    $fileId = $response['spreadsheetId'];

    $domainPermission = new \Google_Service_Drive_Permission([
        'type'  => 'domain',
        'role'  => 'writer',
        'value' => 'myCompany.com' //eg user@myCompany.com
    ]);

    $this->driveService->permissions->insert($fileId, $domainPermission);
    return $response;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多