Administrar unidades compartidas

En esta guía, se incluyen tareas relacionadas con la administración de unidades compartidas, como la creación de unidades compartidas y la administración de miembros y permisos, con la API de Google Drive.

Si deseas especificar los campos que se devolverán en la respuesta, puedes establecer el parámetro del sistema fields con cualquier método del recurso drives. Si no especificas el parámetro fields, el servidor devuelve un conjunto predeterminado de campos específicos del método. Por ejemplo, el método list solo devuelve los campos kind, id y name para cada unidad compartida. Para obtener más información, consulta Cómo devolver campos específicos.

Para obtener más información sobre los límites de carpetas de unidades compartidas, consulta Límites de carpetas de unidades compartidas.

Crea una unidad compartida

Para crear una unidad compartida, usa el método create en el recurso drives con el parámetro requestId.

El parámetro requestId identifica el intento lógico de creación idempotente de una unidad compartida. Si la solicitud agota el tiempo de espera o devuelve un error indeterminado del backend, se puede repetir la misma solicitud y no se crearán duplicados. El requestId y el cuerpo de la solicitud deben seguir siendo los mismos.

En el siguiente ejemplo de código, se muestra cómo crear una unidad compartida:

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
/**
 * 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

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

Las llamadas al método create son idempotentes.

Si la unidad compartida se creó correctamente en una solicitud anterior o debido a un reintento, el método devuelve una instancia del recurso drives. En ocasiones, como después de un tiempo prolongado o si cambió el cuerpo de la solicitud, es posible que se muestre un error 409 que indica que se debe descartar el requestId.

Cómo obtener una unidad compartida

Para obtener metadatos de una unidad compartida, usa el método get en el recurso drives con el parámetro de ruta de acceso driveId. Si no conoces el ID de la unidad, puedes enumerar todas las unidades compartidas con el método list.

El método get devuelve una unidad compartida como una instancia de un recurso drives.

Para emitir la solicitud como administrador del dominio, establece el parámetro de consulta useDomainAdminAccess en true. Para obtener más información, consulta Administra unidades compartidas como administrador del dominio.

Cómo enumerar unidades compartidas

Para enumerar las unidades compartidas de un usuario, usa el método list en el recurso drives. El método devuelve una lista de unidades compartidas.

Pasa los siguientes parámetros de consulta para personalizar la paginación o filtrar las unidades compartidas:

  • pageSize: Es la cantidad máxima de unidades compartidas que se mostrarán por página.

  • pageToken: Es un token de página que se recibió de una llamada a lista anterior. Proporciona este token para recuperar la página siguiente.

  • q: Es la cadena de búsqueda para buscar unidades compartidas. Para obtener más información, consulta Cómo buscar unidades compartidas.

  • useDomainAdminAccess: Se establece en true para emitir la solicitud como administrador del dominio y devolver todas las unidades compartidas del dominio en el que el solicitante es administrador. Para obtener más información, consulta Administra unidades compartidas como administrador de dominio.

Actualiza una unidad compartida

Para actualizar los metadatos de una unidad compartida, usa el método update en el recurso drives con el parámetro de ruta de acceso driveId.

El método devuelve una unidad compartida como una instancia de un recurso drives.

Para emitir la solicitud como administrador del dominio, establece el parámetro de consulta useDomainAdminAccess en true. Para obtener más información, consulta Administra unidades compartidas como administrador del dominio.

Cómo ocultar y mostrar una unidad compartida

Para ocultar una unidad compartida de la vista predeterminada, usa el método hide en el recurso drives con el parámetro driveId.

Cuando se oculta una unidad compartida, Drive marca el recurso de la unidad compartida como hidden=true. Las unidades compartidas ocultas no aparecen en la IU de Drive ni en la lista de archivos devueltos.

Para restablecer una unidad compartida a la vista predeterminada, usa el método unhide en el recurso drives con el parámetro driveId.

Ambos métodos devuelven una unidad compartida como una instancia de un recurso drives.

Cómo borrar una unidad compartida

Para borrar de forma permanente una unidad compartida, usa el método delete en el recurso drives con el parámetro driveId.

Antes de borrar una unidad compartida, todo su contenido debe moverse a la papelera o borrarse. El usuario también debe tener el permiso role=organizer en la carpeta de la unidad compartida. Para obtener más información, consulta Cómo borrar o eliminar archivos y carpetas.

Pasa los siguientes parámetros de búsqueda para filtrar las unidades compartidas:

  • useDomainAdminAccess: Se establece en true para emitir la solicitud como administrador del dominio y devolver todas las unidades compartidas del dominio en el que el solicitante es administrador. Para obtener más información, consulta Administra unidades compartidas como administrador de dominio.

  • allowItemDeletion: Se establece en true para borrar elementos dentro de la unidad compartida. Solo se admite cuando useDomainAdminAccess también se establece en true.

Cómo agregar o quitar miembros de una unidad compartida

Agrega o quita miembros de unidades compartidas con el recurso permissions.

Para agregar un miembro, crea el permiso en la unidad compartida. Los métodos de permisos también se pueden usar en archivos individuales dentro de una unidad compartida para otorgar privilegios adicionales a los miembros o permitir que los no miembros colaboren en elementos específicos.

Para obtener más información y código de muestra, consulta Cómo compartir archivos, carpetas y unidades.

Administra unidades compartidas como administrador del dominio

Aplica el parámetro useDomainAdminAccess con los recursos drives y permissions para administrar las unidades compartidas en una organización.

Los usuarios que llamen a estos métodos con useDomainAdminAccess=true deben tener el privilegio de administrador de Drive and Docs. Los administradores pueden buscar unidades compartidas o actualizar los permisos de las unidades compartidas que pertenecen a su organización, independientemente de si el administrador es miembro de una unidad compartida determinada.

Cuando usas cuentas de servicio, es posible que debas suplantar la identidad de un administrador autenticado con la identidad temporal como cuenta de servicio. Ten en cuenta que las cuentas de servicio no pertenecen a tu dominio de Google Workspace, a diferencia de las cuentas de usuario. Si compartes elementos de Google Workspace, como documentos o eventos, con todo tu dominio de Google Workspace, no se compartirán con las cuentas de servicio. Para obtener más información, consulta la Descripción general de las cuentas de servicio.

Recupera una unidad compartida que no tiene organizador

En el siguiente ejemplo de código, se muestra cómo recuperar unidades compartidas que ya no tienen un organizador.

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
/**
 * 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

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

Cómo evitar que los usuarios descarguen, impriman o copien tu archivo

Puedes limitar la forma en que los usuarios pueden descargar, imprimir y copiar archivos en las unidades compartidas.

Para determinar si el usuario puede cambiar las restricciones de descarga aplicadas por el organizador de una unidad compartida, verifica el campo booleano capabilities.canChangeDownloadRestriction. Si capabilities.canChangeDownloadRestriction se establece en true, se pueden aplicar restricciones de descarga a la unidad compartida. Para obtener más información, consulta Información sobre las capacidades de los archivos.

El recurso drives contiene una colección de campos booleanos restrictions que se usan para indicar si se puede realizar una acción en una unidad compartida. Las restricciones se aplican a una unidad compartida o a los elementos que contiene. Las restricciones se pueden establecer con el método drives.update.

Para aplicar restricciones de descarga a una unidad compartida, un administrador de la unidad compartida puede establecer el campo restrictions.downloadRestriction del recurso drives con el objeto DownloadRestriction. Si se establece el campo booleano restrictedForReaders en true, se declara que tanto la descarga como la copia están restringidas para los lectores. Si se establece el campo booleano restrictedForWriters en true, se declara que tanto la descarga como la copia están restringidas para los escritores. Ten en cuenta que, si el campo restrictedForWriters es true, la descarga y la copia también están restringidas para los lectores. Del mismo modo, establecer restrictedForWriters en true y restrictedForReaders en false equivale a establecer restrictedForWriters y restrictedForReaders en true.

Retrocompatibilidad

Con la introducción del objeto DownloadRestriction, se actualizó la funcionalidad del campo booleano restrictions.copyRequiresWriterPermission.

Ahora, establecer restrictions.copyRequiresWriterPermission en true actualiza el campo booleano restrictedForReaders del objeto DownloadRestriction a true para declarar que tanto la descarga como la copia están restringidas para los lectores.

Si configuras el campo copyRequiresWriterPermission como false, se actualizarán los campos restrictedForWriters y restrictedForReaders a false. Esto significa que se quitarán los parámetros de configuración de restricción de descarga o copia para todos los usuarios.

Campos que controlan las funciones de descarga, impresión y copia

En la siguiente tabla, se enumeran los campos de recursos de drives que afectan la funcionalidad de descarga, impresión y copia:

Campo Descripción Versión
capabilities.canCopy Indica si el usuario actual puede copiar archivos en una unidad compartida. v2 y v3
capabilities.canDownload Indica si el usuario actual puede descargar archivos en una unidad compartida. v2 y v3
capabilities.canChangeCopyRequiresWriterPermission Indica si el usuario actual puede cambiar la restricción copyRequiresWriterPermission de una unidad compartida. v2 y v3
capabilities.canResetDriveRestrictions Indica si el usuario actual puede restablecer las restricciones de la unidad compartida a los valores predeterminados. v2 y v3
capabilities.canChangeDownloadRestriction Indica si el usuario actual puede cambiar la restricción de descarga de una unidad compartida. Solo v3
restrictions.copyRequiresWriterPermission Indica si las opciones para copiar, imprimir o descargar archivos dentro de una unidad compartida están inhabilitadas para los lectores y comentaristas. Cuando es true, establece el campo con un nombre similar en true para cualquier archivo dentro de esta unidad compartida. v2 y v3
restrictions.downloadRestriction Son las restricciones de descarga que aplican los administradores de unidades compartidas. Solo v3

Límites de carpetas

Las carpetas de unidades compartidas tienen algunos límites de almacenamiento. Para obtener más información, consulta Límites de unidades compartidas en Google Drive.

Límite de elementos

La unidad compartida de cada usuario tiene un límite de 500,000 elementos, incluidos archivos, carpetas y accesos directos.

Cuando se alcanza el límite, la unidad compartida ya no puede aceptar elementos. Para volver a recibir archivos, los usuarios deben borrar de forma permanente los elementos de la unidad compartida. Ten en cuenta que los elementos de la papelera se incluyen en el límite, pero los elementos borrados definitivamente no. Para obtener más información, consulta Cómo borrar o eliminar archivos y carpetas.

Límite de profundidad de la carpeta

Una carpeta de una unidad compartida no puede contener más de 100 niveles de carpetas anidadas. Esto significa que una carpeta secundaria no se puede almacenar en una carpeta que tenga más de 99 niveles de profundidad. Esta limitación solo se aplica a las carpetas secundarias.

Si se intenta agregar más de 100 niveles de carpetas, se devuelve un código de estado HTTP teamDriveHierarchyTooDeep.