이 가이드에는 공유 드라이브 만들기와 같은 공유 드라이브 관리와 관련된 작업이 포함되어 있습니다. 공유 드라이브와 멤버 및 권한 관리를 할 수 있습니다.
공유 드라이브 폴더 한도에 대한 자세한 내용은 폴더를 참고하세요. 한도를 준수합니다.
공유 드라이브 만들기
공유 드라이브를 만들려면 drives.create
메서드를 사용합니다.
자바
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
및 요청 본문은
동일하게 유지됩니다
공유 드라이브가 이전 요청이나
재시도하면 정상 응답이 반환됩니다. 경우에 따라
요청 본문이 변경된 경우에는 409
오류가
requestId
를 삭제해야 함을 나타내는 반환됩니다.
공유 드라이브 멤버 추가 또는 삭제하기
다음을 사용하여 공유 드라이브 멤버 추가 또는 삭제
permissions
리소스
멤버를 추가하려면 공유 드라이브에서 권한을 만드세요. 권한 공유 드라이브 내 개별 파일에서도 회원에게 추가 권한을 부여하거나 비회원의 공동작업 허용 확인할 수 있습니다.
자세한 내용 및 샘플 코드는 파일, 폴더 및 드라이브로 이동합니다.
공유 드라이브 삭제하기
drives.delete
메서드를 사용하여
공유할 수 있습니다. 공유 드라이브의 모든 콘텐츠를 휴지통으로 이동하거나 삭제해야 합니다.
할 수 있습니다.
도메인 관리자를 위한 공유 드라이브 관리
useDomainAdminAccess
매개변수를 drives
및 permissions
리소스와 함께 적용하여
되었습니다.
useDomainAdminAccess=true
로 이러한 메서드를 호출하는 사용자에게는
Drive and Docs
관리자
권한이 있는지 확인합니다.
관리자는 공유 검색
공유 또는 공유 드라이브 권한 업데이트
관리자의 멤버십과 관계없이 조직 소유의 드라이브
파일을 공유할 수 있습니다.
주최자가 없는 공유 드라이브 복구하기
다음 예시는 이러한 리소스를 사용하여 공유된 더 이상 주최자가 없는 드라이브에 표시됩니다.
자바
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 Drive를 사용합니다.
항목 한도
사용자 공유 드라이브에 있는 각 폴더의 항목은 다음을 포함하여 500,000개로 제한됩니다. 파일, 폴더, 바로가기를 관리할 수 있습니다
한도에 도달하면 공유 드라이브에서 더 이상 항목을 수락할 수 없습니다. 받는사람 파일을 다시 받으려면 사용자는 폴더에서 항목을 완전히 삭제해야 합니다. 참고 휴지통에 있는 항목은 한도에 포함되지만 영구적으로 삭제된 항목은 삭제됩니다. 없습니다. 자세한 내용은 파일 삭제 또는 삭제 및 폴더를 참조하세요.
폴더 깊이 제한
공유 드라이브의 폴더는 100개 수준을 초과하는 중첩 폴더를 포함할 수 없습니다. 즉, 99개 레벨 깊이입니다. 이 제한은 하위 폴더에만 적용됩니다.
100개가 넘는 폴더 수준을 추가하려고 하면
teamDriveHierarchyTooDeep
HTTP 상태 코드 응답입니다.