Управление общими дисками

В этом руководстве содержатся задачи, связанные с управлением общими дисками, такие как создание общих дисков и управление участниками и разрешениями с помощью API Google Drive.

Если вы хотите указать поля, возвращаемые в ответе, вы можете задать системный параметр fields с помощью любого метода ресурса drives . Если параметр fields не указан, сервер вернет набор полей по умолчанию, специфичный для данного метода. Например, метод list возвращает только поля kind , id и name для каждого общего диска. Подробнее см. в разделе Возврат определённых полей .

Дополнительную информацию об ограничениях папок на общих дисках см. в разделе Ограничения папок на общих дисках .

Создать общий диск

Чтобы создать общий диск, используйте метод create на ресурсе drives с параметром requestId .

Параметр requestId идентифицирует логическую попытку идемпотентного создания общего диска. Если запрос истёк по тайм-ауту или возвращает неопределённую ошибку бэкенда, тот же запрос можно повторить, не создавая дубликатов. requestId и тело запроса должны оставаться неизменными.

В следующем примере кода показано, как создать общий диск:

Ява

диск/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;
    }
  }
}

Питон

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_v3/drive_snippets/create_drive.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

диск/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;
    }  

}

.СЕТЬ

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 . Иногда, например, после длительного времени или при изменении текста запроса, может быть возвращена ошибка 409 , указывающая на необходимость удаления requestId .

Получите совместный диск

Чтобы получить метаданные общего диска, используйте метод get ресурса drives с параметром path driveId . Если вы не знаете идентификатор диска, вы можете получить список всех общих дисков с помощью метода list .

Метод get возвращает общий диск как экземпляр ресурса drives .

Чтобы выполнить запрос от имени администратора домена, установите для параметра запроса useDomainAdminAccess значение true . Подробнее см. в статье Управление общими дисками от имени администраторов домена .

Список общих дисков

Чтобы вывести список общих дисков пользователя, используйте метод list ресурса drives . Этот метод возвращает список общих дисков.

Передайте следующие параметры запроса для настройки пагинации или фильтрации общих дисков:

  • pageSize : максимальное количество общих дисков, возвращаемых на странице.

  • pageToken : токен страницы, полученный при предыдущем вызове списка. Укажите этот токен для получения следующей страницы.

  • q : Строка запроса для поиска общих дисков. Подробнее см. в разделе Поиск общих дисков .

  • useDomainAdminAccess : установите значение true , чтобы выполнить запрос от имени администратора домена и получить все общие диски домена, в котором запрашивающая сторона является администратором. Подробнее см. в разделе Управление общими дисками от имени администраторов домена .

Обновить общий диск

Чтобы обновить метаданные общего диска, используйте метод update ресурса drives с параметром пути driveId .

Метод возвращает общий диск как экземпляр ресурса drives .

Чтобы выполнить запрос от имени администратора домена, установите для параметра запроса useDomainAdminAccess значение true . Подробнее см. в статье Управление общими дисками от имени администраторов домена .

Скрыть и показать общий диск

Чтобы скрыть общий диск из представления по умолчанию, используйте метод hide на ресурсе drives с параметром driveId .

Когда общий диск скрыт, Диск помечает ресурс общего диска как hidden=true . Скрытые общие диски не отображаются в пользовательском интерфейсе Диска или в списке возвращаемых файлов.

Чтобы восстановить вид общего диска по умолчанию, используйте метод unhide на ресурсе drives с параметром driveId .

Оба метода возвращают общий диск как экземпляр ресурса drives .

Удалить общий диск

Чтобы окончательно удалить общий диск, используйте метод delete на ресурсе drives с параметром driveId .

Перед удалением общего диска всё его содержимое необходимо переместить в корзину или удалить. Пользователь также должен иметь role=organizer в папке общего диска. Подробнее см. в разделе Корзина или удаление файлов и папок .

Передайте следующие параметры запроса для фильтрации общих дисков:

  • useDomainAdminAccess : установите значение true , чтобы выполнить запрос от имени администратора домена и получить все общие диски домена, в котором запрашивающая сторона является администратором. Подробнее см. в разделе Управление общими дисками от имени администраторов домена .

  • allowItemDeletion : установите значение true , чтобы удалить элементы на общем диске. Поддерживается только в том случае, если useDomainAdminAccess также установлен в true .

Добавить или удалить участников общего диска

Добавляйте или удаляйте участников общего диска с помощью ресурса permissions .

Чтобы добавить участника, создайте разрешение на общем диске. Методы разрешения также можно использовать для отдельных файлов на общем диске, чтобы предоставить участникам дополнительные привилегии или разрешить не участникам совместно работать над определёнными объектами.

Дополнительную информацию и пример кода см. в разделе Общий доступ к файлам, папкам и дискам .

Управляйте общими дисками как администраторы домена

Примените параметр useDomainAdminAccess к ресурсам drives и permissions для управления общими дисками в организации.

Пользователи, вызывающие эти методы с параметром 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;
  }
}

Питон

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

диск/сниппеты/диск_v3/диск_сниппеты/recover_drives.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

диск/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;
   }
}

.СЕТЬ

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.canChangeDownloadRestriction равно true , ограничения загрузки могут быть применены к общему диску. Подробнее см. в разделе «Общие сведения о возможностях файлов» .

Ресурс drives содержит набор полей с логическими restrictions которые указывают, можно ли выполнить действие на общем диске. Ограничения применяются к общему диску или элементам на нём. Ограничения можно задать с помощью метода drives.update .

Чтобы применить ограничения загрузки к общему диску, менеджер общих дисков может задать поле restrictions.downloadRestriction ресурса drives с помощью объекта DownloadRestriction . Установка логического поля restrictedForReaders в значение true означает, что и загрузка, и копирование ограничены для читателей. Установка логического поля restrictedForWriters в true означает, что и загрузка, и копирование ограничены для писателей. Обратите внимание: если поле restrictedForWriters имеет значение true , загрузка и копирование также ограничены для читателей. Аналогично, установка restrictedForWriters в true и restrictedForReaders в значение false эквивалентна установке обоих restrictedForWriters и restrictedForReaders в true .

Обратная совместимость

С введением объекта DownloadRestriction была обновлена функциональность логического поля restrictions.copyRequiresWriterPermission .

Теперь установка restrictions.copyRequiresWriterPermission в true обновляет логическое поле restrictedForReaders объекта DownloadRestriction до значения true , объявляя, что и загрузка, и копирование ограничены для читателей.

Установка поля copyRequiresWriterPermission в значение false меняет значения полей restrictedForWriters и restrictedForReaders на false . Это означает, что настройки ограничений на загрузку и копирование будут сняты для всех пользователей.

Поля, управляющие функциями загрузки, печати и копирования

В следующей таблице перечислены поля ресурсов drives , которые влияют на функциональность загрузки, печати и копирования:

Поле Описание Версия
capabilities.canCopy Может ли текущий пользователь копировать файлы на общем диске. версии 2 и 3
capabilities.canDownload Может ли текущий пользователь загружать файлы на общий диск. версии 2 и 3
capabilities.canChangeCopyRequiresWriterPermission Может ли текущий пользователь изменить ограничение copyRequiresWriterPermission общего диска. версии 2 и 3
capabilities.canResetDriveRestrictions Может ли текущий пользователь сбросить ограничения общего диска до значений по умолчанию. версии 2 и 3
capabilities.canChangeDownloadRestriction Может ли текущий пользователь изменить ограничение загрузки для общего диска. только v3
restrictions.copyRequiresWriterPermission Отключены ли возможности копирования, печати или загрузки файлов на общем диске для читателей и комментаторов? Если true , то для любого файла на этом общем диске поле с таким же именем устанавливается в значение true . версии 2 и 3
restrictions.downloadRestriction Ограничения на загрузку, накладываемые менеджерами общих дисков. только v3

Ограничения папок

Папки общего диска имеют определённые ограничения по объёму хранилища. Подробнее см. в статье Ограничения общего диска в Google Диске .

Ограничение по количеству предметов

Общий диск каждого пользователя имеет ограничение в 500 000 элементов, включая файлы, папки и ярлыки.

При достижении лимита общий диск больше не может принимать файлы. Чтобы возобновить приём файлов, пользователи должны безвозвратно удалить элементы с общего диска. Обратите внимание, что элементы в корзине учитываются при подсчёте лимита, а безвозвратно удалённые — нет. Подробнее см. в разделе Корзина или удаление файлов и папок .

Ограничение глубины папки

Папка на общем диске не может содержать более 100 уровней вложенности папок. Это означает, что дочерняя папка не может находиться в папке, глубина вложенности которой превышает 99 уровней. Это ограничение применяется только к дочерним папкам.

Попытка добавить более 100 уровней папок возвращает ответ с кодом состояния HTTP teamDriveHierarchyTooDeep .