Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a spreadsheet with google api and set a proper permissions with PHP?

I have this

define('CLIENT_SECRET_PATH', __DIR__ . '/config_api.json');
define('ACCESS_TOKEN', '0b502651********c52b3');

I can create a spreadsheet with this and get the id and url.

$requestBody = new Google_Service_Sheets_Spreadsheet();
$response = $service->spreadsheets->create($requestBody);
print_r($response);
$new_spr_id = $response['spreadsheetId'];

But this spreadsheet does not appears in the google sheets list as it is "protected" or something. I am trying to set the permissions with this but get an error: Fatal error: Call to undefined method Google_Service_Drive_Permission::setValue()

insertPermission($service, $new_spr_id, '**@gmail.com' , 'user', 'owner');
function insertPermission($service, $fileId, $value, $type, $role) {
  $newPermission = new Google_Service_Drive_Permission();
  $newPermission->setValue($value);
  $newPermission->setType($type);
  $newPermission->setRole($role);
  try {
    return $service->permissions->insert($fileId, $newPermission);
  } catch (Exception $e) {
    print "An error occurred: " . $e->getMessage();
  }
  return NULL;
}

I need an example of creating a new spreadsheet and setting the proper permissions to it so I can modify this spreadsheet from my account etc.

Many many thanks!

like image 715
SERG Avatar asked Mar 31 '17 15:03

SERG


2 Answers

Your code is not able to locate class and unable to create instance of Google_Service_Drive_Permission(). I would suggest, don't use individual function to create object of Google_Service_Drive_Permission(). Place all your code to set permissions within the code part, where you are creating file. Also if you are using multiple files, check if your files are loading properly and are located by PHP parser. Because Fatal Error for undefined method call is not due to implementation of API methods, its due to calling for methods that does not exist or you PHP parser is unable to locate.

For reference this might be helpful

http://hotexamples.com/examples/-/Google_Service_Drive_Permission/setValue/php-google_service_drive_permission-setvalue-method-examples.html

like image 114
Atul Jindal Avatar answered Oct 18 '22 06:10

Atul Jindal


I had the same problem and wasn't able to figure it out using Google API PHP Client methods designed specifically for altering permissions. However, there is a possibility to retrieve a Guzzle instance with the authentication info from PHP Client. Therefore, we can simply call the desired API endpoint to send the request. The code below is a complete workaround for changing file owner/permission on Google Drive:

//if you're using Service Account, otherwise follow your normal authorization
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/json');
$client = new Google_Client();
$client->setScopes(Google_Service_Drive::DRIVE);
$client->useApplicationDefaultCredentials();

//Now the main code to change the file permission begins
$httpClient = $client->authorize(); //It returns a Guzzle instance with proper Headers
$result = $httpClient->request('POST', 'https://www.googleapis.com/drive/v3/files/[FILE_ID]/permissions?transferOwnership=true', [
  'json' => [
    'role' => 'owner',
    'type' => 'user', 
    'emailAddress' => '[email protected]'
  ]
]);

And the sample response of $result->getBody()->getContents() is:

{
 "kind": "drive#permission",
 "id": "14...",
 "type": "user",
 "role": "owner"
}
like image 20
Hossein Shahsahebi Avatar answered Oct 18 '22 06:10

Hossein Shahsahebi