ショコラ
PHP Google_Service_Driveでサービスアカウントで作成したファイルを本アカウントで確認するには?
オーナーは変えられないようなので、共有にしました。
もっさん先輩
このエラーに数時間悩まされました。サービスアカウントで作成したスプレッドシートのファイルにアクセスできませんでした。
{
"error": {
"code": 403,
"message": "The transferOwnership parameter must be enabled when the permission role is 'owner'.",
"errors": [
{
"message": "The transferOwnership parameter must be enabled when the permission role is 'owner'.",
"domain": "global",
"reason": "forbidden",
"location": "transferOwnership",
"locationType": "parameter"
}
]
}
}
2,3時間悩んでたどり着いたコードです。鍵はたった2行です。
$google_credentials_json = "あのグーグルのJSON形式の文字列";
$google_sheet_id = "シートID(URLのところ)";
$client = new \Google_Client();
$client->addScope( \Google_Service_Sheets::SPREADSHEETS );
// 認証
$auth = tempnam('/tmp','auth-');
file_put_contents($auth,$google_credentials_json);
$client->setAuthConfig($auth);
unlink($auth);
// サービスを取得
$driveService = new \Google_Service_Drive($client);
// 新しいファイルを作成
$fileMetadata = new \Google_Service_Drive_DriveFile([
'name' => 'Sample File',
'mimeType' => 'application/vnd.google-apps.document'
]);
$file = $driveService->files->create($fileMetadata, [
'fields' => 'id', // 作成したファイルの ID を取得
]);
// パーミッションをオーナーではなくwriteで共有します
$drive_permission = new \Google_Service_Drive_Permission();
$drive_permission->setType('user');
$drive_permission->setRole('writer');
$drive_permission->setEmailAddress('グーグルのメールアドレス');
$driveService->permissions->create($file->id,$drive_permission, [
'transferOwnership' => false
]);
因みにこちらがエラーになっていたコードです。
$google_credentials_json = "あのグーグルのJSON形式の文字列";
$google_sheet_id = "シートID(URLのところ)";
$client = new \Google_Client();
$client->addScope( \Google_Service_Sheets::SPREADSHEETS );
// 認証
$auth = tempnam('/tmp','auth-');
file_put_contents($auth,$google_credentials_json);
$client->setAuthConfig($auth);
unlink($auth);
// サービスを取得
$driveService = new \Google_Service_Drive($client);
// 新しいファイルを作成
$fileMetadata = new \Google_Service_Drive_DriveFile([
'name' => 'Sample File',
'mimeType' => 'application/vnd.google-apps.document'
]);
$file = $driveService->files->create($fileMetadata, [
'fields' => 'id', // 作成したファイルの ID を取得
]);
// パーミッションをオーナーではなくwriteで共有します
$drive_permission = new \Google_Service_Drive_Permission();
$drive_permission->setType('user');
$drive_permission->setRole('owner');
$drive_permission->setEmailAddress('グーグルのメールアドレス');
$driveService->permissions->create($file->id,$drive_permission, [
'transferOwnership' => true
]);
以上