このガイドでは、共有ドライブの作成、メンバーと権限の管理など、共有ドライブの管理に関連するタスクについて説明します。
共有ドライブのフォルダの制限について詳しくは、フォルダの制限をご覧ください。
共有ドライブを作成する
共有ドライブを作成するには、drives.create
メソッドを使用します。
Java
import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.Drive; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.util.Arrays; import java.util.UUID; /* class to demonstrate use-case of Drive's create drive. */ public class CreateDrive { /** * Create a drive. * * @return Newly created drive id. * @throws IOException if service account credentials file not found. */ public static String createDrive() throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); // Build a new authorized API client service. com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) .setApplicationName("Drive samples") .build(); Drive driveMetadata = new Drive(); driveMetadata.setName("Project Resources"); String requestId = UUID.randomUUID().toString(); try { Drive drive = service.drives().create(requestId, driveMetadata) .execute(); System.out.println("Drive ID: " + drive.getId()); return drive.getId(); } catch (GoogleJsonResponseException e) { // TODO(developer) - handle error appropriately System.err.println("Unable to create drive: " + e.getDetails()); throw e; } } }
Python
import uuid import google.auth from googleapiclient.discovery import build from googleapiclient.errors import HttpError def create_drive(): """Create a drive. Returns: Id of the created drive Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for the application. """ creds, _ = google.auth.default() try: # create drive api client service = build("drive", "v3", credentials=creds) drive_metadata = {"name": "Project Resources"} request_id = str(uuid.uuid4()) # pylint: disable=maybe-no-member drive = ( service.drives() .create(body=drive_metadata, requestId=request_id, fields="id") .execute() ) print(f'Drive ID: {drive.get("id")}') except HttpError as error: print(f"An error occurred: {error}") drive = None return drive.get("id") if __name__ == "__main__": create_drive()
Node.js
/** * Create a drive. * */ async function createDrive() { // Get credentials and build service // TODO (developer) - Use appropriate auth mechanism for your app const {GoogleAuth} = require('google-auth-library'); const {google} = require('googleapis'); const uuid = require('uuid'); const auth = new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/drive', }); const service = google.drive({version: 'v3', auth}); const driveMetadata = { name: 'Project resources', }; const requestId = uuid.v4(); try { const Drive = await service.drives.create({ resource: driveMetadata, requestId: requestId, fields: 'id', }); console.log('Drive Id:', Drive.data.id); return Drive.data.id; } catch (err) { // TODO(developer) - Handle error throw err; } }
PHP
use Google\Client; use Google\Service\Drive; use Ramsey\Uuid\Uuid; function createDrive() { try { $client = new Client(); $client->useApplicationDefaultCredentials(); $client->addScope(Drive::DRIVE); $driveService = new Drive($client); $driveMetadata = new Drive\Drive(array( 'name' => 'Project Resources')); $requestId = Uuid::uuid4()->toString(); $drive = $driveService->drives->create($requestId, $driveMetadata, array( 'fields' => 'id')); printf("Drive ID: %s\n", $drive->id); return $drive->id; } catch(Exception $e) { echo "Error Message: ".$e; } }
.NET
using Google.Apis.Auth.OAuth2; using Google.Apis.Drive.v3; using Google.Apis.Drive.v3.Data; using Google.Apis.Services; namespace DriveV3Snippets { // Class to demonstrate use of Drive's create drive. public class CreateDrive { /// <summary> /// Create a drive. /// </summary> /// <returns>newly created drive Id.</returns> public static string DriveCreateDrive() { try { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredential credential = GoogleCredential.GetApplicationDefault() .CreateScoped(DriveService.Scope.Drive); // Create Drive API service. var service = new DriveService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "Drive API Snippets" }); var driveMetadata = new Drive() { Name = "Project Resources" }; var requestId = Guid.NewGuid().ToString(); var request = service.Drives.Create(driveMetadata, requestId); request.Fields = "id"; var drive = request.Execute(); Console.WriteLine("Drive ID: " + drive.Id); return drive.Id; } catch (Exception e) { // TODO(developer) - handle error appropriately if (e is AggregateException) { Console.WriteLine("Credential Not found"); } else { throw; } } return null; } } }
drives.create
メソッドの呼び出しはべき等です。
requestId
パラメータは、共有ドライブの作成を試みたロジックを識別します。リクエストがタイムアウトした場合や、不明なバックエンド エラーが返された場合は、同じリクエストを繰り返すことができます。リクエストの requestId
と本文は同じにする必要があります。
共有ドライブが以前のリクエストで正常に作成された場合、または再試行により作成された場合は、通常のレスポンスが返されます。時間が経過した後やリクエストの本文が変更された場合など、requestId
を破棄する必要があることを示す 409
エラーが返されることがあります。
共有ドライブのメンバーを追加または削除する
permissions
リソースを使用して、共有ドライブのメンバーを追加または削除します。
メンバーを追加するには、共有ドライブに権限を作成します。権限方法は、共有ドライブ内の個々のファイルにも使用できます。メンバーに追加の権限を付与したり、メンバー以外のユーザーが特定のアイテムでコラボレーションできるようにしたりできます。
詳細とサンプルコードについては、ファイル、フォルダ、ドライブを共有するをご覧ください。
共有ドライブを削除する
共有ドライブを削除するには、drives.delete
メソッドを使用します。共有ドライブを削除する前に、共有ドライブ内のすべてのコンテンツをゴミ箱に移動するか削除する必要があります。
ドメイン管理者の共有ドライブを管理する
drives
リソースと permissions
リソースで useDomainAdminAccess
パラメータを適用して、組織全体で共有ドライブを管理します。
useDomainAdminAccess=true
を使用してこれらのメソッドを呼び出すユーザーには、Drive and Docs
管理者権限が必要です。管理者は、特定の共有ドライブに対する管理者のメンバーシップに関係なく、共有ドライブを検索したり、組織が所有する共有ドライブの権限を更新したりできます。
管理者のない共有ドライブを復元する
次の例は、これらのリソースを使用して、オーガナイザーがなくなった共有ドライブを復元する方法を示しています。
Java
import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.Drive; import com.google.api.services.drive.model.DriveList; import com.google.api.services.drive.model.Permission; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /* class to demonstrate use-case of Drive's shared drive without an organizer. */ public class RecoverDrive { /** * Find all shared drives without an organizer and add one. * * @param realUser User's email id. * @return All shared drives without an organizer. * @throws IOException if shared drive not found. */ public static List<Drive> recoverDrives(String realUser) throws IOException { /*Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application.*/ GoogleCredentials credentials = GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE)); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( credentials); // Build a new authorized API client service. com.google.api.services.drive.Drive service = new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) .setApplicationName("Drive samples") .build(); List<Drive> drives = new ArrayList<Drive>(); // Find all shared drives without an organizer and add one. // Note: This example does not capture all cases. Shared drives // that have an empty group as the sole organizer, or an // organizer outside the organization are not captured. A // more exhaustive approach would evaluate each shared drive // and the associated permissions and groups to ensure an active // organizer is assigned. String pageToken = null; Permission newOrganizerPermission = new Permission() .setType("user") .setRole("organizer"); newOrganizerPermission.setEmailAddress(realUser); do { DriveList result = service.drives().list() .setQ("organizerCount = 0") .setFields("nextPageToken, drives(id, name)") .setUseDomainAdminAccess(true) .setPageToken(pageToken) .execute(); for (Drive drive : result.getDrives()) { System.out.printf("Found drive without organizer: %s (%s)\n", drive.getName(), drive.getId()); // Note: For improved efficiency, consider batching // permission insert requests Permission permissionResult = service.permissions() .create(drive.getId(), newOrganizerPermission) .setUseDomainAdminAccess(true) .setSupportsAllDrives(true) .setFields("id") .execute(); System.out.printf("Added organizer permission: %s\n", permissionResult.getId()); } drives.addAll(result.getDrives()); pageToken = result.getNextPageToken(); } while (pageToken != null); return drives; } }
Python
import google.auth from googleapiclient.discovery import build from googleapiclient.errors import HttpError def recover_drives(real_user): """Find all shared drives without an organizer and add one. Args: real_user:User ID for the new organizer. Returns: drives object Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for the application. """ creds, _ = google.auth.default() try: # create drive api client service = build("drive", "v3", credentials=creds) drives = [] # pylint: disable=maybe-no-member page_token = None new_organizer_permission = { "type": "user", "role": "organizer", "emailAddress": "user@example.com", } new_organizer_permission["emailAddress"] = real_user while True: response = ( service.drives() .list( q="organizerCount = 0", fields="nextPageToken, drives(id, name)", useDomainAdminAccess=True, pageToken=page_token, ) .execute() ) for drive in response.get("drives", []): print( "Found shared drive without organizer: " f"{drive.get('title')}, {drive.get('id')}" ) permission = ( service.permissions() .create( fileId=drive.get("id"), body=new_organizer_permission, useDomainAdminAccess=True, supportsAllDrives=True, fields="id", ) .execute() ) print(f'Added organizer permission: {permission.get("id")}') drives.extend(response.get("drives", [])) page_token = response.get("nextPageToken", None) if page_token is None: break except HttpError as error: print(f"An error occurred: {error}") return drives if __name__ == "__main__": recover_drives(real_user="gduser1@workspacesamples.dev")
Node.js
/** * Find all shared drives without an organizer and add one. * @param{string} userEmail user ID to assign ownership to * */ async function recoverDrives(userEmail) { // Get credentials and build service // TODO (developer) - Use appropriate auth mechanism for your app const {GoogleAuth} = require('google-auth-library'); const {google} = require('googleapis'); const auth = new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/drive', }); const service = google.drive({version: 'v3', auth}); const drives = []; const newOrganizerPermission = { type: 'user', role: 'organizer', emailAddress: userEmail, // Example: 'user@example.com' }; let pageToken = null; try { const res = await service.drives.list({ q: 'organizerCount = 0', fields: 'nextPageToken, drives(id, name)', useDomainAdminAccess: true, pageToken: pageToken, }); Array.prototype.push.apply(drives, res.data.items); for (const drive of res.data.drives) { console.log( 'Found shared drive without organizer:', drive.name, drive.id, ); await service.permissions.create({ resource: newOrganizerPermission, fileId: drive.id, useDomainAdminAccess: true, supportsAllDrives: true, fields: 'id', }); } pageToken = res.nextPageToken; } catch (err) { // TODO(developer) - Handle error throw err; } return drives; }
PHP
use Google\Client; use Google\Service\Drive; use Ramsey\Uuid\Uuid; function recoverDrives() { try { $client = new Client(); $client->useApplicationDefaultCredentials(); $client->addScope(Drive::DRIVE); $driveService = new Drive($client); $realUser = readline("Enter user email address: "); $drives = array(); // Find all shared drives without an organizer and add one. // Note: This example does not capture all cases. Shared drives // that have an empty group as the sole organizer, or an // organizer outside the organization are not captured. A // more exhaustive approach would evaluate each shared drive // and the associated permissions and groups to ensure an active // organizer is assigned. $pageToken = null; $newOrganizerPermission = new Drive\Permission(array( 'type' => 'user', 'role' => 'organizer', 'emailAddress' => 'user@example.com' )); $newOrganizerPermission['emailAddress'] = $realUser; do { $response = $driveService->drives->listDrives(array( 'q' => 'organizerCount = 0', 'fields' => 'nextPageToken, drives(id, name)', 'useDomainAdminAccess' => true, 'pageToken' => $pageToken )); foreach ($response->drives as $drive) { printf("Found shared drive without organizer: %s (%s)\n", $drive->name, $drive->id); $permission = $driveService->permissions->create($drive->id, $newOrganizerPermission, array( 'fields' => 'id', 'useDomainAdminAccess' => true, 'supportsAllDrives' => true )); printf("Added organizer permission: %s\n", $permission->id); } array_push($drives, $response->drives); $pageToken = $response->pageToken; } while ($pageToken != null); return $drives; } catch(Exception $e) { echo "Error Message: ".$e; } }
.NET
using Google.Apis.Auth.OAuth2; using Google.Apis.Drive.v3; using Google.Apis.Drive.v3.Data; using Google.Apis.Services; namespace DriveV3Snippets { // Class to demonstrate use-case of Drive's shared drive without an organizer. public class RecoverDrives { /// <summary> /// Find all shared drives without an organizer and add one. /// </summary> /// <param name="realUser">User ID for the new organizer.</param> /// <returns>all shared drives without an organizer.</returns> public static IList<Drive> DriveRecoverDrives(string realUser) { try { /* Load pre-authorized user credentials from the environment. TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2 for your application. */ GoogleCredential credential = GoogleCredential.GetApplicationDefault() .CreateScoped(DriveService.Scope.Drive); // Create Drive API service. var service = new DriveService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "Drive API Snippets" }); var drives = new List<Drive>(); // Find all shared drives without an organizer and add one. // Note: This example does not capture all cases. Shared drives // that have an empty group as the sole organizer, or an // organizer outside the organization are not captured. A // more exhaustive approach would evaluate each shared drive // and the associated permissions and groups to ensure an active // organizer is assigned. string pageToken = null; var newOrganizerPermission = new Permission() { Type = "user", Role = "organizer", EmailAddress = realUser }; do { var request = service.Drives.List(); request.UseDomainAdminAccess = true; request.Q = "organizerCount = 0"; request.Fields = "nextPageToken, drives(id, name)"; request.PageToken = pageToken; var result = request.Execute(); foreach (var drive in result.Drives) { Console.WriteLine(("Found abandoned shared drive: {0} ({1})", drive.Name, drive.Id)); // Note: For improved efficiency, consider batching // permission insert requests var permissionRequest = service.Permissions.Create( newOrganizerPermission, drive.Id ); permissionRequest.UseDomainAdminAccess = true; permissionRequest.SupportsAllDrives = true; permissionRequest.Fields = "id"; var permissionResult = permissionRequest.Execute(); Console.WriteLine("Added organizer permission: {0}", permissionResult.Id); } pageToken = result.NextPageToken; } while (pageToken != null); return drives; } catch (Exception e) { // TODO(developer) - handle error appropriately if (e is AggregateException) { Console.WriteLine("Credential Not found"); } else { throw; } } return null; } } }
フォルダの制限
共有ドライブのフォルダには保存容量の上限があります。詳しくは、Google ドライブにおける共有ドライブの制限をご覧ください。
アイテム数の上限
ユーザーの共有ドライブ内の各フォルダに保存できるアイテム数は、ファイル、フォルダ、ショートカットを含めて 500,000 個までに制限されています。
上限に達すると、共有ドライブにアイテムを追加できなくなります。ファイルを再び受信するには、フォルダからアイテムを完全に削除する必要があります。ゴミ箱内のアイテムは上限にカウントされますが、完全に削除されたアイテムはカウントされません。詳細については、ファイルとフォルダをゴミ箱に移動または削除するをご覧ください。
フォルダの階層の深さの制限
共有ドライブ内のフォルダに含められるフォルダ階層は最大 100 レベルです。つまり、子フォルダを 99 階層を超えるフォルダの下に保存することはできません。この制限は子フォルダにのみ適用されます。
100 を超えるレベルのフォルダを追加しようとすると、teamDriveHierarchyTooDeep
HTTP ステータス コード レスポンスが返されます。