Предоставить доступ к электронной таблице с помощью Google Sheets API - PullRequest
0 голосов
/ 06 августа 2020

У меня настроен и работает Google Sheets API (я могу читать и обновлять существующие электронные таблицы, если они используются совместно с моими учетными данными), и мне нужно экспортировать некоторые данные с моего веб-сайта в таблицу Google. Чтобы пользователи не видели чужие листы, мне нужно создать новую электронную таблицу, когда пользователь хочет экспортировать данные. Мне удалось создать новую электронную таблицу вроде этой:

public function init(){
    $user = Socialite::driver('google')->stateless()->user();
    $token = [
        'access_token'  => $user->token,
        'refresh_token' => $user->refreshToken,
        'expires_in'    => $user->expiresIn
    ];

    $client = new \Google_Client();
    $client->setApplicationName('Sheets');
    $client->setScopes([\Google_Service_Sheets::SPREADSHEETS]);
    $client->setAccessType('offline');
    $client->setAuthConfig('../credentials.json');
    $client->setAccessToken($token);

    $service = new Google_Service_Sheets($client);
    $serviceDrive = new Google_Service_Drive($client);

    $spreadsheet = new Google_Service_Sheets_Spreadsheet([
        'properties' => [
            'title' => 'Testing Sheet'
        ]
    ]);
    $spreadsheet = $service->spreadsheets->create($spreadsheet, [
        'fields' => 'spreadsheetId'
    ]);

    $this->insertPermission($serviceDrive, $spreadsheet->spreadsheetId, $user->email, 'user', 'owner');
}

Когда я dd($spreadsheet) я вижу, что она действительно создана, и могу получить ее идентификатор. Но дело в том, что если я попытаюсь открыть его, я получаю уведомление о том, что мне нужно получить доступ, поскольку у меня его нет. Я много искал решение и пробовал несколько способов. Я попытался передать такую ​​роль:

$spreadsheet = $service->spreadsheets->create($spreadsheet, [
    'fields' => 'spreadsheetId',
    'role' => 'owner'
    'email' => 'useremail@gmail.com'
]);

Также попытался вставить разрешение с помощью этого метода:

function insertPermission($service, $fileId, $value, $type, $role) {
    $newPermission = new Google_Service_Drive_Permission();
    $newPermission->setEmailAddress($value);
    $newPermission->setType($type);
    $newPermission->setRole($role);
    try {
      return $service->permissions->create($fileId, $newPermission);
    } catch (Exception $e) {
      print "An error occurred: " . $e->getMessage();
    }
    return NULL;
  }

Но этот метод выдает мне ошибку при вызове функции create(), которая говорит "code": 403, "message": "Insufficient Permission: Request had insufficient authentication scopes.". Есть ли способ предоставить аутентифицированному пользователю доступ к вновь созданной таблице и в чем моя ошибка?

1 Ответ

2 голосов
/ 06 августа 2020
  • Вы пытаетесь предоставить разрешение с помощью Drive API
  • Ваш код содержит только $client->setScopes([\Google_Service_Sheets::SPREADSHEETS]);
  • Чтобы использовать как Таблицы, так и Drive API с одним и тем же клиентом, назначьте клиенту ОБЕИ соответствующие объемы
...