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

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

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

Чтобы узнать больше об ограничениях на количество папок на общих дисках, см. раздел «Ограничения на количество папок на общих дисках» .

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

Для создания общего диска используйте метод create ресурса drives с параметром requestId .

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

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

Java

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;
    }  

}

.СЕТЬ

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 с параметром ` driveId . Если идентификатор диска неизвестен, вы можете вывести список всех общих дисков с помощью метода list .

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

Чтобы отправить запрос от имени администратора домена, установите параметр запроса useDomainAdminAccess в true . Дополнительную информацию см. в разделе «Управление общими дисками от имени администраторов домена» .

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

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

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

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

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

  • q : Строка запроса для поиска на общих дисках. Дополнительную информацию см. в разделе «Поиск на общих дисках» .

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

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

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

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

Чтобы отправить запрос от имени администратора домена, установите параметр запроса useDomainAdminAccess в true . Дополнительную информацию см. в разделе «Управление общими дисками от имени администраторов домена» .

Скрытие и отображение общего диска

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пользователи, вызывающие эти методы с useDomainAdminAccess=true должны обладать правами администратора Google Drive and Docs . Администраторы могут искать общие диски или обновлять разрешения для общих дисков, принадлежащих их организации, независимо от членства администратора в каком-либо конкретном общем диске.

При использовании служебных учетных записей может потребоваться имитация прав авторизованного администратора с помощью функции имитации служебной учетной записи . Обратите внимание, что служебные учетные записи, в отличие от учетных записей пользователей, не принадлежат вашему домену Google Workspace. Если вы предоставляете общий доступ к ресурсам Google Workspace, таким как документы или события, всему вашему домену Google Workspace, они не будут доступны для служебных учетных записей. Для получения дополнительной информации см. раздел «Обзор служебных учетных записей» .

Восстановите данные с общего диска, на котором отсутствует органайзер.

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

Java

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;
   }
}

.СЕТЬ

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 true обновляет логическое поле restrictedForReaders объекта DownloadRestriction , указывая, что для читателей ограничены как загрузка, так и копирование.

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

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

В следующей таблице перечислены поля ресурсов 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 Диск» .

Крышка предмета

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

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

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

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

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