首页 > 解决方案 > 更改已上传工作表的权限

问题描述

我遇到了一个问题,我有一张使用 Sheets PHP API 上传的工作表,现在我需要更改该工作表的权限。如果权限是在上传时设置或稍后更改,对我来说并不重要。这是我的上传代码的样子

function createSheet(){
    $client = getClient();
    $service = new Google_Service_Sheets($client);
    $spreadsheet = new Google_Service_Sheets_Spreadsheet([
        'properties' => [
            'title' => "test_sheet3",
        ]
    ]);
    $spreadsheet = $service->spreadsheets->create($spreadsheet, [
        'fields' => 'spreadsheetId'
    ]);
    printf("Spreadsheet ID: %s\n", $spreadsheet->spreadsheetId);
    return $spreadsheet->spreadsheetID;
}

我一直在寻找这个谷歌文档,但每次我尝试在属性 JSON 前包含任何设置时:

        'properties' => [
            'title' => "test_sheet3",
            'type' => 'group'
        ]
    ]);

我得到错误

"Invalid JSON payload received. Unknown name \"type\" at 'spreadsheet.properties': Cannot find field."

所以我不完全确定我的语法是否不正确,或者应该将它们添加到不是属性 JSON 的不同 JSON 附件中。

标签: phpgoogle-drive-apigoogle-sheets-api

解决方案


我想提出以下修改。

修改点:

  • 您可以使用 Drive API 中的“权限:创建”方法授予权限。您的问题中已经提到了这一点。在这种情况下,请求参数不能包含在 Sheets API 中的“spreadsheets.create”方法中。请使用 Drive API 中的“权限:创建”方法请求它。

当以上几点反映到您的脚本时,它变成如下。

修改后的脚本:

$client = getClient();
$service = new Google_Service_Sheets($client);
$spreadsheet = new Google_Service_Sheets_Spreadsheet([
    'properties' => [
        'title' => "test_sheet3",
    ]
]);
$spreadsheet = $service->spreadsheets->create($spreadsheet, [
    'fields' => 'spreadsheetId'
]);
printf("Spreadsheet ID: %s\n", $spreadsheet->spreadsheetId);


// I added below script
$drive = new Google_Service_Drive($client);
$newPermission = new Google_Service_Drive_Permission();
$newPermission->setEmailAddress('###@gmail.com');
$newPermission->setType('group');
$newPermission->setRole('writer');
$res = $drive->permissions->create($spreadsheet->spreadsheetId, $newPermission);
// print_r($res);


return $spreadsheet->spreadsheetID;

笔记:

  • 在这种情况下,作为测试,我使用了https://www.googleapis.com/auth/drive. 为此,请使用以下脚本。并且当您修改范围时,请包含刷新令牌的文件并重新授权范围。这样,修改后的范围可以反映到访问令牌中。请注意这一点。

      $client->setScopes(array(Google_Service_Sheets::SPREADSHEETS, Google_Service_Drive::DRIVE));
    
  • 当您想使用grouptype,请设置电子邮件地址。

  • 如果您想将权限授予用户,请修改$newPermission->setType('group');$newPermission->setType('user');并请使用电子邮件地址。

参考:


推荐阅读