공유 드라이브 관리

이 가이드에는 Google Drive API를 사용하여 공유 드라이브를 만들고 멤버와 권한을 관리하는 등 공유 드라이브 관리에 관련된 작업이 포함되어 있습니다.

응답에서 반환할 필드를 지정하려면 fields 시스템 매개변수를 drives 리소스의 메서드를 사용하여 설정하면 됩니다. fields 매개변수를 지정하지 않으면 서버는 메서드에 특정한 기본 필드 집합을 반환합니다. 예를 들어 list 메서드는 각 공유 드라이브의 kind, id, 및 name 필드만 반환합니다. 자세한 내용은 특정 필드 반환을 참고하세요.

공유 드라이브 폴더 한도에 대해 자세히 알아보려면 공유 드라이브 폴더 한도를 참고하세요.

공유 드라이브 만들기

공유 드라이브를 만들려면 create 메서드를 사용하여 drives 리소스의 requestId 매개변수를 사용합니다.

requestId 매개변수는 공유 드라이브의 멱등 생성에 대한 논리적 시도를 식별합니다. 요청 시간이 초과되거나 결정할 수 없는 백엔드 오류가 반환되면 동일한 요청을 반복할 수 있으며 중복이 생성되지 않습니다. 요청의 requestId 및 본문은 동일하게 유지되어야 합니다.

다음 코드 샘플은 공유 드라이브를 만드는 방법을 보여줍니다.

자바

drive/snippets/drive_v3/src/main/java/CreateDrive.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

drive/snippets/drive-v3/drive_snippet/create_drive.py
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

drive/snippets/drive_v3/drive_snippets/create_drive.js
import {GoogleAuth} from 'google-auth-library';
import {google} from 'googleapis';
import {v4 as uuid} from 'uuid';

/**
 * Creates a new shared drive.
 * @return {Promise<string>} The ID of the created shared drive.
 */
async function createDrive() {
  // Authenticate with Google and get an authorized client.
  // TODO (developer): Use an appropriate auth mechanism for your app.
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });

  // Create a new Drive API client (v3).
  const service = google.drive({version: 'v3', auth});

  // The metadata for the new shared drive.
  const driveMetadata = {
    name: 'Project resources',
  };

  // A unique request ID to avoid creating duplicate shared drives.
  const requestId = uuid();

  // Create the new shared drive.
  const Drive = await service.drives.create({
    requestBody: driveMetadata,
    requestId,
    fields: 'id',
  });

  // Print the ID of the new shared drive.
  console.log('Drive Id:', Drive.data.id);
  if (!Drive.data.id) {
    throw new Error('Drive ID not found.');
  }
  return Drive.data.id;
}

PHP

drive/snippets/drive_v3/src/DriveCreateDrive.php
<?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

drive/snippets/drive_v3/DriveV3Snippets/CreateDrive.cs
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;
        }
    }
}

create 메서드 호출은 멱등입니다.

이전 요청에서 또는 재시도로 인해 공유 드라이브가 성공적으로 생성된 경우 메서드는 drives 리소스의 인스턴스를 반환합니다. 장시간이 경과한 후 또는 요청 본문이 변경된 경우와 같이 requestId를 삭제해야 함을 나타내는 409 오류가 반환될 수 있습니다.

공유 드라이브 가져오기

공유 드라이브의 메타데이터를 가져오려면 driveId 경로 매개변수를 사용하여 drives 리소스의 get 메서드를 사용합니다. 드라이브 ID를 모르는 경우 모든 공유 드라이브를 나열하려면 list 메서드를 사용하면 됩니다.

get 메서드는 공유 드라이브를 drives 리소스의 인스턴스로 반환합니다.

도메인 관리자로 요청을 실행하려면 useDomainAdminAccess 쿼리 매개변수를 true로 설정합니다. 자세한 내용은 도메인 관리자로 공유 드라이브 관리를 참고하세요.

공유 드라이브 나열

사용자의 공유 드라이브를 나열하려면 list 메서드를 drives 리소스에 사용합니다. 이 메서드는 공유 드라이브 목록을 반환합니다.

다음 쿼리 매개변수를 전달하여 공유 드라이브의 페이지 나누기를 맞춤설정하거나 공유 드라이브를 필터링합니다.

  • pageSize: 페이지당 반환할 최대 공유 드라이브 수입니다.

  • pageToken: 이전 목록 호출에서 받은 페이지 토큰입니다. 후속 페이지를 가져오려면 이 토큰을 제공하세요.

  • q: 공유 드라이브 검색을 위한 쿼리 문자열입니다. 자세한 내용은 공유 드라이브 검색을 참고하세요.

  • useDomainAdminAccess: 요청자가 관리자인 도메인의 모든 공유 드라이브를 반환하기 위해 도메인 관리자로 요청을 실행하려면 true로 설정합니다. 자세한 내용은 도메인 관리자로 공유 드라이브 관리를 참고하세요.

공유 드라이브 업데이트

공유 드라이브의 메타데이터를 업데이트하려면 update 메서드를 drives 리소스의 driveId 경로 매개변수와 함께 사용합니다.

이 메서드는 공유 드라이브를 drives 리소스의 인스턴스로 반환합니다.

도메인 관리자로 요청을 실행하려면 useDomainAdminAccess 쿼리 매개변수를 true로 설정합니다. 자세한 내용은 도메인 관리자로 공유 드라이브 관리를 참고하세요.

공유 드라이브 숨기기 및 숨기기 해제

기본 뷰에서 공유 드라이브를 숨기려면 hide 매개변수를 사용하여 drives 리소스의 driveId 메서드를 사용합니다.

공유 드라이브가 숨겨지면 Drive는 공유 드라이브 리소스를 hidden=true로 표시합니다. 숨겨진 공유 드라이브는 Drive UI 또는 반환된 파일 목록에 표시되지 않습니다.

공유 드라이브를 기본 뷰로 복원하려면 unhide 메서드를 사용하여 drives 리소스의 driveId 매개변수를 사용합니다.

두 메서드는 공유 드라이브를 drives 리소스의 인스턴스로 반환합니다.

공유 드라이브 삭제

공유 드라이브를 영구적으로 삭제하려면 delete 매개변수를 사용하여 drives 리소스의 driveId 메서드를 사용합니다.

공유 드라이브를 삭제하기 전에 공유 드라이브의 모든 콘텐츠를 휴지통으로 이동하거나 삭제해야 합니다. 사용자는 공유 드라이브 폴더에 role=organizer도 있어야 합니다. 자세한 내용은 파일 및 폴더 휴지통으로 이동 또는 삭제를 참고하세요.

다음 쿼리 매개변수를 전달하여 공유 드라이브를 필터링합니다.

  • useDomainAdminAccess: 요청자가 관리자인 도메인의 모든 공유 드라이브를 반환하기 위해 도메인 관리자로 요청을 실행하려면 true로 설정합니다. 자세한 내용은 도메인 관리자로 공유 드라이브 관리를 참고하세요.

  • allowItemDeletion: 공유 드라이브 내에서 항목을 삭제하려면 true로 설정합니다. useDomainAdminAccesstrue로 설정된 경우에만 지원됩니다.

공유 드라이브 멤버 추가 또는 삭제

permissions 리소스를 사용하여 공유 드라이브 멤버를 추가하거나 삭제합니다.

멤버를 추가하려면 공유 드라이브에 권한을 만듭니다. 권한 메서드는 공유 드라이브 내의 개별 파일에도 사용하여 멤버에게 추가 권한을 부여하거나 비멤버가 특정 항목에 공동작업할 수 있도록 허용할 수 있습니다.

자세한 내용과 샘플 코드는 파일, 폴더, 드라이브 공유를 참고하세요.

도메인 관리자로 공유 드라이브 관리

drivespermissions 리소스와 함께 useDomainAdminAccess 매개변수를 적용하여 조직 전체에서 공유 드라이브를 관리합니다.

useDomainAdminAccess=true로 이러한 메서드를 호출하는 사용자는 Drive and Docs 관리자 권한이 있어야 합니다. 관리자는 특정 공유 드라이브의 관리자 멤버십 과 관계없이 조직 소유의 공유 드라이브를 검색하거나 공유 드라이브의 권한을 업데이트할 수 있습니다.

서비스 계정을 사용하는 경우 서비스 계정 가장을 사용하여 인증된 관리자를 가장해야 할 수 있습니다. 서비스 계정은 사용자 계정과 달리 Google Workspace 도메인에 속하지 않습니다. 문서 또는 이벤트와 같은 Google Workspace 애셋을 전체 Google Workspace 도메인과 공유할 경우 서비스 계정과 공유되지 않습니다. 자세한 내용은 서비스 계정 개요를 참고하세요.

관리자가 없는 공유 드라이브 복구

다음 코드 샘플은 더 이상 관리자가 없는 공유 드라이브를 복구하는 방법을 보여줍니다.

자바

drive/snippets/drive_v3/src/main/java/RecoverDrive.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

drive/snippets/drive-v3/drive_snippet/recover_drives.py
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

drive/snippets/drive_v3/drive_snippets/recover_drives.js
import {GoogleAuth} from 'google-auth-library';
import {google} from 'googleapis';

/**
 * Finds all shared drives without an organizer and adds one.
 * @param {string} userEmail The email of the user to assign ownership to.
 * @return {Promise<object[]>} A list of the recovered drives.
 */
async function recoverDrives(userEmail) {
  // Authenticate with Google and get an authorized client.
  // TODO (developer): Use an appropriate auth mechanism for your app.
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });

  // Create a new Drive API client (v3).
  const service = google.drive({version: 'v3', auth});

  // The permission to add to the shared drive.
  const newOrganizerPermission = {
    type: 'user',
    role: 'organizer',
    emailAddress: userEmail, // e.g., 'user@example.com'
  };

  // List all shared drives with no organizers.
  const result = await service.drives.list({
    q: 'organizerCount = 0',
    fields: 'nextPageToken, drives(id, name)',
    useDomainAdminAccess: true,
  });

  // Add the new organizer to each found shared drive.
  for (const drive of result.data.drives ?? []) {
    if (!drive.id) {
      continue;
    }

    console.log('Found shared drive without organizer:', drive.name, drive.id);
    await service.permissions.create({
      requestBody: newOrganizerPermission,
      fileId: drive.id,
      useDomainAdminAccess: true,
      supportsAllDrives: true,
      fields: 'id',
    });
  }
  return result.data.drives ?? [];
}

PHP

drive/snippets/drive_v3/src/DriveRecoverDrives.php
<?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

drive/snippets/drive_v3/DriveV3Snippets/RecoverDrives.cs
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;
        }
    }
}

다른 사용자가 파일을 다운로드, 인쇄, 복사하지 못하도록 차단하기

사용자가 공유 드라이브 내에서 파일을 다운로드, 인쇄, 복사하는 방법을 제한할 수 있습니다.

사용자가 공유 드라이브의 관리자가 적용한 다운로드 제한 을 변경할 수 있는지 확인하려면 capabilities.canChangeDownloadRestriction 불리언 필드를 확인합니다. capabilities.canChangeDownloadRestrictiontrue로 설정된 경우 공유 드라이브에 다운로드 제한을 적용할 수 있습니다. 자세한 내용은 파일 기능 이해를 참고하세요.

drives 리소스에는 공유 드라이브에서 작업을 실행할 수 있는지 여부를 나타내는 데 사용되는 불리언 restrictions 필드 모음이 포함되어 있습니다. 제한사항은 공유 드라이브 또는 공유 드라이브 내의 항목에 적용됩니다. 제한사항은 drives.update 메서드를 사용하여 설정할 수 있습니다.

공유 드라이브에 다운로드 제한을 적용하려면 공유 드라이브 관리자가 restrictions.downloadRestriction 필드를 drives 리소스를 사용하여 DownloadRestriction 객체를 설정하면 됩니다. restrictedForReaders 불리언 필드를 true로 설정하면 다운로드와 복사가 모두 읽기 권한이 있는 사용자에게 제한됨을 선언합니다. restrictedForWriters 불리언 필드를 true로 설정하면 다운로드와 복사가 모두 쓰기 권한이 있는 사용자에게 제한됨을 선언합니다. restrictedForWriters 필드가 true이면 읽기 권한이 있는 사용자에게도 다운로드와 복사가 제한됩니다. 마찬가지로 restrictedForWriterstrue로 설정하고 restrictedForReadersfalse로 설정하는 것은 restrictedForWritersrestrictedForReaders를 모두 true로 설정하는 것과 같습니다.

이전 버전과의 호환성

DownloadRestriction 객체가 도입됨에 따라 restrictions.copyRequiresWriterPermission 불리언 필드의 기능이 업데이트되었습니다.

이제 restrictions.copyRequiresWriterPermissiontrue로 설정하면 restrictedForReaders 불리언 필드가 DownloadRestriction 객체의 true로 업데이트되어 다운로드와 복사가 모두 읽기 권한이 있는 사용자에게 제한됨을 선언합니다.

copyRequiresWriterPermission 필드를 false로 설정하면 restrictedForWritersrestrictedForReaders 필드가 모두 false로 업데이트됩니다. 즉, 모든 사용자에 대해 다운로드 또는 복사 제한 설정이 삭제됩니다.

다운로드, 인쇄, 복사 기능을 제어하는 필드

다음 표에는 다운로드, 인쇄, 복사 기능에 영향을 미치는 drives 리소스 필드 가 나와 있습니다.

필드 설명 버전
capabilities.canCopy 현재 사용자가 공유 드라이브에서 파일을 복사할 수 있는지 여부입니다. v2 및 v3
capabilities.canDownload 현재 사용자가 공유 드라이브에서 파일을 다운로드할 수 있는지 여부입니다. v2 및 v3
capabilities.canChangeCopyRequiresWriterPermission 현재 사용자가 공유 드라이브의 copyRequiresWriterPermission 제한을 변경할 수 있는지 여부입니다. v2 및 v3
capabilities.canResetDriveRestrictions 현재 사용자가 공유 드라이브 제한을 기본값으로 재설정할 수 있는지 여부입니다. v2 및 v3
capabilities.canChangeDownloadRestriction 현재 사용자가 공유 드라이브의 다운로드 제한을 변경할 수 있는지 여부입니다. v3 전용
restrictions.copyRequiresWriterPermission 읽기 권한이 있는 사용자 및 댓글 작성자에게 공유 드라이브 내에서 파일을 복사, 인쇄 또는 다운로드하는 옵션이 사용 중지되어 있는지 여부입니다. true이면 이 공유 드라이브 내의 모든 파일에 대해 이름이 비슷한 필드를 true로 설정합니다. v2 및 v3
restrictions.downloadRestriction 공유 드라이브 관리자가 적용한 다운로드 제한입니다. v3 전용

폴더 제한사항

공유 드라이브 폴더에는 몇 가지 저장용량 제한이 있습니다. 자세한 내용은 Google Drive의 공유 드라이브 한도를 참고하세요.

항목 한도

각 사용자의 공유 드라이브에는 파일, 폴더, 바로가기를 포함하여 최대 500,000개의 항목이 추가될 수 있습니다.

한도에 도달하면 공유 드라이브에서 더 이상 항목을 수락할 수 없습니다. 파일 수신을 재개하려면 사용자가 공유 드라이브에서 항목을 영구적으로 삭제해야 합니다. 휴지통의 항목은 한도에 포함되지만 영구적으로 삭제된 항목은 포함되지 않습니다. 자세한 내용은 파일 및 폴더 휴지통으로 이동 또는 삭제 를 참고하세요.

폴더 깊이 한도

공유 드라이브의 폴더에는 중첩 폴더가 100개 이상 포함될 수 없습니다. 즉, 깊이가 99단계를 초과하는 폴더 아래에는 하위 폴더를 저장할 수 없습니다. 이 제한은 하위 폴더에만 적용됩니다.

100개 이상의 폴더를 추가하려고 하면 teamDriveHierarchyTooDeep HTTP 상태 코드 응답이 반환됩니다.