Membagikan file, folder, dan drive

Setiap file, folder, dan drive bersama Google Drive memiliki resource permissions terkait. Setiap resource mengidentifikasi izin untuk type tertentu (user, group, domain, anyone) dan role (owner, organizer, fileOrganizer, writer, commenter, reader). Misalnya, file mungkin memiliki izin yang memberikan akses hanya baca (role=reader) kepada pengguna tertentu (type=user), sedangkan izin lainnya memberikan kemampuan kepada anggota grup tertentu (type=group) untuk menambahkan komentar ke file (role=commenter).

Untuk mengetahui daftar lengkap peran dan operasi yang diizinkan oleh masing-masing, lihat Peran dan izin.

Skenario untuk berbagi resource Drive

Ada lima jenis skenario berbagi yang berbeda:

  1. Untuk membagikan file di Drive Saya, pengguna harus memiliki role=writer atau role=owner.

  2. Untuk membagikan folder di Drive Saya, pengguna harus memiliki role=writer atau role=owner.

    • Jika nilai boolean writersCanShare disetel ke false untuk file, pengguna harus memiliki role=owner yang lebih permisif.

    • Akses sementara (diatur oleh tanggal dan waktu habis masa berlaku) tidak diizinkan di folder Drive Saya dengan role=writer. Untuk mengetahui informasi selengkapnya, lihat Menetapkan tanggal habis masa berlaku untuk membatasi akses file.

  3. Untuk membagikan file di drive bersama, pengguna harus memiliki role=writer, role=fileOrganizer, atau role=organizer.

    • Setelan writersCanShare tidak berlaku untuk item di drive bersama. Opsi ini diperlakukan seolah-olah selalu ditetapkan ke true.
  4. Untuk membagikan folder di drive bersama, pengguna harus memiliki role=organizer.

    • Jika batasan sharingFoldersRequiresOrganizerPermission di drive bersama ditetapkan ke false, pengguna dengan role=fileOrganizer dapat berbagi folder di drive bersama tersebut.
  5. Untuk mengelola keanggotaan drive bersama, pengguna harus memiliki role=organizer. Hanya pengguna dan grup yang dapat menjadi anggota drive bersama.

Menetapkan tanggal habis masa berlaku untuk membatasi akses file

Saat bekerja sama dengan orang lain dalam project sensitif, Anda mungkin ingin membatasi akses mereka ke file tertentu di Drive setelah jangka waktu tertentu. Untuk file di Drive Saya, Anda dapat menetapkan tanggal habis masa berlaku untuk membatasi atau menghapus akses ke file tersebut.

Untuk menetapkan tanggal habis masa berlaku:

  • Gunakan metode create() di resource permissions dan tetapkan kolom expirationTime (beserta kolom lain yang diperlukan). Untuk mengetahui informasi selengkapnya, lihat Membuat izin.

  • Gunakan metode update() pada resource permissions dan tetapkan kolom expirationTime (beserta kolom lain yang diperlukan). Untuk mengetahui informasi selengkapnya, lihat Mengubah izin.

Kolom expirationTime menunjukkan kapan masa berlaku izin berakhir menggunakan waktu-tanggal RFC 3339. Waktu habis masa berlaku memiliki batasan berikut:

  • Izin ini hanya dapat ditetapkan pada izin pengguna dan grup.
  • Waktu harus di masa mendatang.
  • Waktu tidak boleh lebih dari satu tahun ke depan.

Untuk mengetahui informasi selengkapnya tentang tanggal habis masa berlaku, lihat artikel berikut:

Penerusan izin

Daftar izin untuk folder diterapkan ke bawah, dan semua file dan folder turunan mewarisi izin dari induk. Setiap kali izin atau hierarki diubah, penyebaran terjadi secara rekursif melalui semua folder bertingkat. Misalnya, jika file ada dalam folder dan folder tersebut kemudian dipindahkan dalam folder lain, izin di folder baru akan diterapkan ke file. Jika folder baru memberikan peran baru kepada pengguna file, seperti "penulis", peran tersebut akan menggantikan peran lama mereka.

Sebaliknya, jika file mewarisi role=writer dari folder, dan dipindahkan ke folder lain yang menyediakan peran "pembaca", file tersebut kini mewarisi role=reader.

Izin yang diwariskan tidak dapat dihapus dari file atau folder di drive bersama. Sebagai gantinya, izin ini harus disesuaikan di induk langsung atau tidak langsung yang menjadi sumber warisan izin. Izin yang diwarisi dapat dihapus dari item di bagian "Drive Saya" atau "Dibagikan kepada saya".

Sebaliknya, izin yang diwarisi dapat diganti pada file atau folder di Drive Saya. Jadi, jika file mewarisi role=writer dari folder Drive Saya, Anda dapat menetapkan role=reader pada file untuk menurunkan tingkat izinnya.

Kemampuan

Resource permissions pada akhirnya tidak menentukan kemampuan pengguna saat ini untuk melakukan tindakan pada file atau folder. Sebagai gantinya, resource files berisi kumpulan kolom capabilities boolean yang digunakan untuk menunjukkan apakah tindakan dapat dilakukan pada file atau folder. Google Drive API menetapkan kolom ini berdasarkan resource izin pengguna saat ini yang terkait dengan file atau folder.

Misalnya, saat Alex login ke aplikasi Anda dan mencoba membagikan file, peran Alex akan diperiksa untuk mengetahui izin pada file. Jika peran mengizinkan mereka membagikan file, capabilities yang terkait dengan file, seperti canShare, akan diisi secara relatif terhadap peran. Jika Alex ingin membagikan file, aplikasi Anda akan memeriksa capabilities untuk memastikan canShare disetel ke true.

Untuk contoh pengambilan file capabilities, lihat Memverifikasi izin pengguna.

Membuat izin

Dua kolom berikut diperlukan saat membuat izin:

  • type: type mengidentifikasi cakupan izin (user, group, domain, atau anyone). Izin dengan type=user berlaku untuk pengguna tertentu, sedangkan izin dengan type=domain berlaku untuk semua orang di domain tertentu.

  • role: Kolom role mengidentifikasi operasi yang dapat dilakukan type. Misalnya, izin dengan type=user dan role=reader memberikan akses hanya baca kepada pengguna tertentu ke file atau folder. Atau, izin dengan type=domain dan role=commenter memungkinkan semua orang di domain menambahkan komentar ke file. Untuk mengetahui daftar lengkap peran dan operasi yang diizinkan oleh masing-masing, lihat Peran dan izin.

Saat membuat izin dengan type=user atau type=group, Anda juga harus memberikan emailAddress untuk mengaitkan pengguna atau grup tertentu ke izin.

Saat membuat izin dengan type=domain, Anda juga harus memberikan domain untuk mengaitkan domain tertentu ke izin.

Untuk membuat izin:

  1. Gunakan metode create() dengan parameter jalur fileId untuk file atau folder terkait.
  2. Dalam isi permintaan, tentukan type dan role.
  3. Jika type=user atau type=group, berikan emailAddress. Jika type=domain, berikan domain.

Tampilkan contoh

Contoh kode berikut menunjukkan cara membuat izin. Respons menampilkan instance resource Permission, termasuk permissionId yang ditetapkan.

Permintaan

POST https://www.googleapis.com/drive/v3/files/FILE_ID/permissions
{
  "requests": [
    {
        "type": "user",
        "role": "commenter",
        "emailAddress": "alex@altostrat.com"
    }
  ]
}

Respons

{
    "kind": "drive#permission",
    "id": "PERMISSION_ID",
    "type": "user",
    "role": "commenter"
}

Menggunakan audiens target

Audiens target adalah sekelompok orang—seperti departemen atau tim—yang dapat Anda rekomendasikan kepada pengguna untuk diajak berbagi item. Anda dapat mendorong pengguna untuk berbagi item dengan audiens yang lebih spesifik atau terbatas, bukan seluruh organisasi Anda. Audiens target dapat membantu Anda meningkatkan keamanan dan privasi data, serta memudahkan pengguna untuk berbagi dengan tepat. Untuk mengetahui informasi selengkapnya, lihat Tentang audiens target.

Untuk menggunakan audiens target:

  1. Di konsol Google Admin, buka Menu > Direktori > Target audiens.

    Buka Target audiens

    Anda harus login menggunakan akun dengan hak istimewa administrator super untuk tugas ini.

  2. Di Daftar target audiens, klik nama target audiens. Untuk membuat audiens target, lihat Membuat audiens target

  3. Salin ID unik dari URL target audiens: https://admin.google.com/ac/targetaudiences/ID.

  4. Buat izin dengan type=domain, dan tetapkan kolom domain ke ID.audience.googledomains.com.

Untuk melihat cara pengguna berinteraksi dengan target audiens, lihat Pengalaman pengguna untuk berbagi link.

Mengambil semua izin untuk file, folder, atau drive bersama

Gunakan metode list() pada resource permissions untuk mengambil semua izin untuk file, folder, atau drive bersama.

Tampilkan contoh

Contoh kode berikut menunjukkan cara mendapatkan semua izin. Respons akan menampilkan daftar izin.

Permintaan

GET https://www.googleapis.com/drive/v3/files/FILE_ID/permissions

Respons

{
  "kind": "drive#permissionList",
  "permissions": [
    {
      "id": "PERMISSION_ID",
      "type": "user",
      "kind": "drive#permission",
      "role": "commenter"
    }
  ]
}

Memverifikasi izin pengguna

Saat membuka file, aplikasi Anda harus memeriksa kemampuan file dan merender UI untuk mencerminkan izin pengguna saat ini. Misalnya, jika pengguna tidak memiliki kemampuan canComment pada file, kemampuan untuk memberikan komentar harus dinonaktifkan di UI.

Untuk mengetahui informasi selengkapnya tentang capabilities, lihat bagian Kemampuan.

Untuk memeriksa kemampuan, panggil metode get() di resource files dengan parameter jalur fileId dan parameter fields yang ditetapkan ke kolom capabilities. Untuk mengetahui informasi lebih lanjut tentang cara menampilkan kolom menggunakan parameter fields, lihat Menampilkan kolom tertentu untuk file.

Tampilkan contoh

Contoh kode berikut menunjukkan cara memverifikasi izin pengguna. Respons akan menampilkan daftar kemampuan yang dimiliki pengguna pada file. Setiap kemampuan sesuai dengan tindakan terperinci yang dapat dilakukan pengguna. Beberapa kolom hanya diisi untuk item di drive bersama.

Permintaan

GET https://www.googleapis.com/drive/v3/files/FILE_ID?fields=capabilities

Respons

{
  "capabilities": {
    "canAcceptOwnership": false,
    "canAddChildren": false,
    "canAddMyDriveParent": false,
    "canChangeCopyRequiresWriterPermission": true,
    "canChangeSecurityUpdateEnabled": false,
    "canComment": true,
    "canCopy": true,
    "canDelete": true,
    "canDownload": true,
    "canEdit": true,
    "canListChildren": false,
    "canModifyContent": true,
    "canModifyContentRestriction": true,
    "canModifyLabels": true,
    "canMoveChildrenWithinDrive": false,
    "canMoveItemOutOfDrive": true,
    "canMoveItemWithinDrive": true,
    "canReadLabels": true,
    "canReadRevisions": true,
    "canRemoveChildren": false,
    "canRemoveMyDriveParent": true,
    "canRename": true,
    "canShare": true,
    "canTrash": true,
    "canUntrash": true
  }
}

Menentukan sumber peran untuk file dan folder drive bersama

Untuk mengubah peran pada file atau folder, Anda harus mengetahui sumber peran tersebut. Untuk drive bersama, sumber peran dapat didasarkan pada keanggotaan ke drive bersama, peran di folder, atau peran di file.

Untuk menentukan sumber peran untuk drive bersama, atau item dalam drive tersebut, panggil metode get() pada resource permissions dengan parameter jalur fileId dan permissionId, serta parameter fields yang ditetapkan ke kolom permissionDetails.

Untuk menemukan permissionId, gunakan metode list() pada resource permissions dengan parameter jalur fileId. Untuk mengambil kolom permissionDetails pada permintaan list, tetapkan parameter fields ke permissions/permissionDetails.

Kolom ini mencantumkan semua izin file langsung dan yang diwarisi untuk pengguna, grup, atau domain.

Tampilkan contoh

Contoh kode berikut menunjukkan cara menentukan sumber peran. Respons menampilkan permissionDetails dari resource permissions. Kolom inheritedFrom memberikan ID item tempat izin diwarisi.

Permintaan

GET https://www.googleapis.com/drive/v3/files/FILE_ID/permissions/PERMISSION_ID?fields=permissionDetails&supportsAllDrives=true

Respons

{
  "permissionDetails": [
    {
      "permissionType": "member",
      "role": "commenter",
      "inheritedFrom": "INHERITED_FROM_ID",
      "inherited": true
    },
    {
      "permissionType": "file",
      "role": "writer",
      "inherited": false
    }
  ]
}

Ubah izin

Untuk mengubah izin pada file atau folder, Anda dapat mengubah peran yang ditetapkan:

  1. Panggil metode update() pada resource permissions dengan parameter jalur permissionId ditetapkan ke izin untuk diubah dan parameter jalur fileId ditetapkan ke file, folder, atau drive bersama terkait. Untuk menemukan permissionId, gunakan metode list() pada resource permissions dengan parameter jalur fileId.

  2. Dalam permintaan, identifikasi role baru.

Anda dapat memberikan izin pada setiap file atau folder di drive bersama meskipun pengguna atau grup sudah menjadi anggota. Misalnya, Alex memiliki role=commenter sebagai bagian dari keanggotaannya ke drive bersama. Namun, aplikasi Anda dapat memberikan Alex role=writer untuk file di drive bersama. Dalam hal ini, karena peran baru lebih permisif daripada peran yang diberikan melalui langganannya, izin baru menjadi peran efektif untuk file atau folder.

Tampilkan contoh

Contoh kode berikut menunjukkan cara mengubah izin pada file atau folder dari pemberi komentar menjadi penulis. Respons menampilkan instance resource permissions.

Permintaan

PATCH https://www.googleapis.com/drive/v3/files/FILE_ID/permissions/PERMISSION_ID
{
  "requests": [
    {
        "role": "writer"
    }
  ]
}

Respons

{
  "kind": "drive#permission",
  "id": "PERMISSION_ID",
  "type": "user",
  "role": "writer"
}

Mencantumkan dan menyelesaikan proposal akses yang tertunda

Proposal akses adalah proposal dari pemohon kepada pemberi persetujuan untuk memberikan akses kepada penerima ke item Drive.

Pengajuan dapat meninjau dan menindaklanjuti semua proposal akses yang belum terselesaikan di seluruh file Drive. Artinya, Anda dapat mempercepat proses persetujuan dengan mengkueri proposal akses secara terprogram, lalu me-resolve-nya. Hal ini juga memungkinkan proposal dilihat secara gabungan oleh pemberi persetujuan.

Drive API menyediakan resource accessproposals sehingga Anda dapat melihat dan menyelesaikan proposal akses yang tertunda. Metode resource accessproposals berfungsi pada file, folder, file dalam drive bersama, tetapi tidak di drive bersama.

Istilah berikut khusus untuk proposal akses:

  • Pemohon: Pengguna yang memulai proposal akses ke item Drive.
  • Penerima: Pengguna yang menerima izin tambahan pada file jika proposal akses diberikan. Sering kali penerima sama dengan peminta, tetapi tidak selalu.
  • Penyetuji: Pengguna yang bertanggung jawab untuk menyetujui (atau menolak) proposal akses. Hal ini biasanya karena mereka adalah pemilik dokumen atau mereka memiliki kemampuan untuk membagikan dokumen.

Mencantumkan proposal akses yang tertunda

Untuk mencantumkan semua proposal akses yang tertunda di item Drive, panggil metode list() pada resource accessproposals dan sertakan parameter jalur fileId.

Hanya pemberi persetujuan di file yang dapat mencantumkan proposal yang tertunda di file. Pengajuan adalah pengguna dengan kemampuan can_approve_access_proposals pada file. Jika peminta bukan merupakan pemberi persetujuan, daftar kosong akan ditampilkan. Untuk mengetahui informasi selengkapnya tentang capabilities, lihat bagian Kemampuan.

Isi respons terdiri dari objek AccessProposal yang mewakili daftar proposal akses yang belum terselesaikan pada file.

Objek AccessProposal menyertakan info tentang setiap proposal seperti peminta, penerima, dan pesan yang ditambahkan oleh pemohon. Objek ini juga menyertakan objek AccessProposalRoleAndView yang mengelompokkan role yang diusulkan pemohon dengan view. Karena role adalah kolom berulang, beberapa kolom dapat ada untuk setiap proposal. Misalnya, proposal mungkin memiliki objek AccessProposalRoleAndView dari role=reader dan view=published, ditambah objek AccessProposalRoleAndView tambahan dengan hanya nilai role=writer. Untuk informasi selengkapnya, lihat Tampilan.

Teruskan parameter kueri berikut untuk menyesuaikan penomoran halaman, atau memfilter, proposal akses:

  • pageToken: Token halaman, diterima dari panggilan daftar sebelumnya. Berikan token ini untuk mengambil halaman berikutnya.

  • pageSize: Jumlah maksimum proposal akses yang akan ditampilkan per halaman.

Menyelesaikan proposal akses yang tertunda

Untuk menyelesaikan semua proposal akses yang tertunda di item Drive, panggil metode resolve() di resource accessproposals dan sertakan parameter jalur fileId dan proposalId.

Metode resolve() menyertakan parameter kueri action yang menunjukkan tindakan yang akan dilakukan pada proposal. Objek Action melacak perubahan status proposal sehingga kita tahu apakah proposal tersebut disetujui atau ditolak.

Metode resolve() juga menyertakan parameter kueri opsional role dan view. Satu-satunya peran yang didukung adalah writer, commenter, dan reader. Jika tidak ditentukan, peran akan ditetapkan secara default ke reader. Parameter kueri opsional tambahan send_notification memungkinkan Anda mengirim notifikasi email kepada peminta saat proposal diterima atau ditolak.

Sama seperti metode list(), pengguna yang me-resolve proposal harus memiliki kemampuan can_approve_access_proposals pada file. Untuk mengetahui informasi selengkapnya tentang capabilities, lihat bagian Kemampuan.

Proposal diselesaikan menggunakan pola yang sama yang tercantum di bagian Skenario untuk berbagi resource Drive. Jika ada beberapa proposal untuk pengguna yang sama, tetapi dengan peran yang berbeda, hal berikut berlaku:

  • Jika satu proposal diterima dan satu ditolak, peran yang diterima akan berlaku untuk item Drive.
  • Jika kedua proposal diterima secara bersamaan, proposal dengan izin yang lebih tinggi (misalnya, role=writer versus role=reader) akan diterapkan. Proposal akses lainnya akan dihapus dari item.

Setelah mengirimkan proposal ke metode resolve(), tindakan berbagi selesai. AccessProposal tidak lagi ditampilkan melalui metode list(). Setelah proposal disetujui, pengguna harus menggunakan kumpulan permissions untuk memperbarui izin pada file atau folder. Untuk mengetahui informasi selengkapnya, lihat bagian Mengubah izin.

Mencabut akses ke file atau folder

Untuk mencabut akses ke file atau folder, panggil metode delete() pada resource permissions dengan parameter jalur fileId dan permissionId yang ditetapkan untuk menghapus izin.

Untuk item di "Drive Saya", Anda dapat menghapus izin yang diwariskan. Menghapus izin yang diwariskan akan mencabut akses ke item dan item turunan, jika ada.

Untuk item di drive bersama, izin yang diwariskan tidak dapat dicabut. Perbarui atau cabut izin pada file atau folder induk.

Metode delete() juga digunakan untuk menghapus izin yang langsung diterapkan ke file atau folder drive bersama.

Tampilkan contoh

Contoh kode berikut menunjukkan cara mencabut akses dengan menghapus permissionId. Jika berhasil, isi respons akan kosong. Untuk mengonfirmasi bahwa izin telah dihapus, gunakan metode list() pada resource permissions dengan parameter jalur fileId.

Permintaan

DELETE https://www.googleapis.com/drive/v3/files/FILE_ID/permissions/PERMISSION_ID

Mentransfer kepemilikan file ke akun Google Workspace lain di organisasi yang sama

Kepemilikan file yang ada di "Drive Saya" dapat ditransfer dari satu akun Google Workspace ke akun lain di organisasi yang sama. Organisasi yang memiliki drive bersama memiliki file di dalamnya. Oleh karena itu, transfer kepemilikan tidak didukung untuk file dan folder di drive bersama. Penyelenggara drive bersama dapat memindahkan item dari drive bersama tersebut ke "Drive Saya" miliknya sendiri, yang akan mentransfer kepemilikan kepada mereka.

Untuk mentransfer kepemilikan file di "Drive Saya", lakukan salah satu hal berikut:

  • Buat izin file yang memberikan akses pemilik (role=owner) kepada pengguna tertentu (type=user).

  • Perbarui izin file yang ada dengan role=owner dan transfer kepemilikan ke pengguna yang ditentukan (transferOwnership=true).

Mentransfer kepemilikan file dari satu akun konsumen ke akun konsumen lainnya

Kepemilikan file dapat ditransfer dari satu akun konsumen ke akun konsumen lainnya. Namun, Drive tidak mentransfer kepemilikan file antara dua akun konsumen hingga calon pemilik secara eksplisit menyetujui transfer tersebut. Untuk mentransfer kepemilikan file dari satu akun konsumen ke akun lainnya:

  1. Pemilik saat ini memulai transfer kepemilikan dengan membuat atau memperbarui izin file calon pemilik. Izin harus menyertakan setelan ini: role=writer, type=user, dan pendingOwner=true. Jika pemilik saat ini membuat izin untuk calon pemilik, notifikasi email akan dikirim kepada calon pemilik yang menunjukkan bahwa mereka diminta untuk mengambil alih kepemilikan file.

  2. Calon pemilik menerima permintaan transfer kepemilikan dengan membuat atau memperbarui izin file mereka. Izin harus menyertakan setelan ini: role=owner dan transferOwnership=true. Jika calon pemilik membuat izin baru, notifikasi email akan dikirim ke pemilik sebelumnya yang menunjukkan bahwa kepemilikan telah ditransfer.

Saat file ditransfer, peran pemilik sebelumnya akan diturunkan ke writer.

Mengubah beberapa izin dengan permintaan batch

Sebaiknya gunakan permintaan batch untuk mengubah beberapa izin.

Berikut adalah contoh melakukan perubahan izin batch dengan library klien.

Java

drive/snippets/drive_v3/src/main/java/ShareFile.java
import com.google.api.client.googleapis.batch.BatchRequest;
import com.google.api.client.googleapis.batch.json.JsonBatchCallback;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpHeaders;
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.Drive;
import com.google.api.services.drive.DriveScopes;
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 modify permissions. */
public class ShareFile {

  /**
   * Batch permission modification.
   * realFileId file Id.
   * realUser User Id.
   * realDomain Domain of the user ID.
   *
   * @return list of modified permissions if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static List<String> shareFile(String realFileId, String realUser, String realDomain)
      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.application*/
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();

    final List<String> ids = new ArrayList<String>();


    JsonBatchCallback<Permission> callback = new JsonBatchCallback<Permission>() {
      @Override
      public void onFailure(GoogleJsonError e,
                            HttpHeaders responseHeaders)
          throws IOException {
        // Handle error
        System.err.println(e.getMessage());
      }

      @Override
      public void onSuccess(Permission permission,
                            HttpHeaders responseHeaders)
          throws IOException {
        System.out.println("Permission ID: " + permission.getId());

        ids.add(permission.getId());

      }
    };
    BatchRequest batch = service.batch();
    Permission userPermission = new Permission()
        .setType("user")
        .setRole("writer");

    userPermission.setEmailAddress(realUser);
    try {
      service.permissions().create(realFileId, userPermission)
          .setFields("id")
          .queue(batch, callback);

      Permission domainPermission = new Permission()
          .setType("domain")
          .setRole("reader");

      domainPermission.setDomain(realDomain);

      service.permissions().create(realFileId, domainPermission)
          .setFields("id")
          .queue(batch, callback);

      batch.execute();

      return ids;
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to modify permission: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/file_snippet/share_file.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def share_file(real_file_id, real_user, real_domain):
  """Batch permission modification.
  Args:
      real_file_id: file Id
      real_user: User ID
      real_domain: Domain of the user ID
  Prints modified permissions

  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)
    ids = []
    file_id = real_file_id

    def callback(request_id, response, exception):
      if exception:
        # Handle error
        print(exception)
      else:
        print(f"Request_Id: {request_id}")
        print(f'Permission Id: {response.get("id")}')
        ids.append(response.get("id"))

    # pylint: disable=maybe-no-member
    batch = service.new_batch_http_request(callback=callback)
    user_permission = {
        "type": "user",
        "role": "writer",
        "emailAddress": "user@example.com",
    }
    batch.add(
        service.permissions().create(
            fileId=file_id,
            body=user_permission,
            fields="id",
        )
    )
    domain_permission = {
        "type": "domain",
        "role": "reader",
        "domain": "example.com",
    }
    domain_permission["domain"] = real_domain
    batch.add(
        service.permissions().create(
            fileId=file_id,
            body=domain_permission,
            fields="id",
        )
    )
    batch.execute()

  except HttpError as error:
    print(f"An error occurred: {error}")
    ids = None

  return ids


if __name__ == "__main__":
  share_file(
      real_file_id="1dUiRSoAQKkM3a4nTPeNQWgiuau1KdQ_l",
      real_user="gduser1@workspacesamples.dev",
      real_domain="workspacesamples.dev",
  )

Node.js

drive/snippets/drive_v3/file_snippets/share_file.js
/**
 * Batch permission modification
 * @param{string} fileId file ID
 * @param{string} targetUserEmail username
 * @param{string} targetDomainName domain
 * @return{list} permission id
 * */
async function shareFile(fileId, targetUserEmail, targetDomainName) {
  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});
  const permissionIds = [];

  const permissions = [
    {
      type: 'user',
      role: 'writer',
      emailAddress: targetUserEmail, // 'user@partner.com',
    },
    {
      type: 'domain',
      role: 'writer',
      domain: targetDomainName, // 'example.com',
    },
  ];
  // Note: Client library does not currently support HTTP batch
  // requests. When possible, use batched requests when inserting
  // multiple permissions on the same item. For this sample,
  // permissions are inserted serially.
  for (const permission of permissions) {
    try {
      const result = await service.permissions.create({
        resource: permission,
        fileId: fileId,
        fields: 'id',
      });
      permissionIds.push(result.data.id);
      console.log(`Inserted permission id: ${result.data.id}`);
    } catch (err) {
      // TODO(developer): Handle failed permissions
      console.error(err);
    }
  }
  return permissionIds;
}

PHP

drive/snippets/drive_v3/src/DriveShareFile.php
use Google\Client;
use Google\Service\Drive;
function shareFile()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $realFileId = readline("Enter File Id: ");
        $realUser = readline("Enter user email address: ");
        $realDomain = readline("Enter domain name: ");
        $ids = array();
            $fileId = '1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ';
            $fileId = $realFileId;
            $driveService->getClient()->setUseBatch(true);
            try {
                $batch = $driveService->createBatch();

                $userPermission = new Drive\Permission(array(
                    'type' => 'user',
                    'role' => 'writer',
                    'emailAddress' => 'user@example.com'
                ));
                $userPermission['emailAddress'] = $realUser;
                $request = $driveService->permissions->create(
                    $fileId, $userPermission, array('fields' => 'id'));
                $batch->add($request, 'user');
                $domainPermission = new Drive\Permission(array(
                    'type' => 'domain',
                    'role' => 'reader',
                    'domain' => 'example.com'
                ));
                $userPermission['domain'] = $realDomain;
                $request = $driveService->permissions->create(
                    $fileId, $domainPermission, array('fields' => 'id'));
                $batch->add($request, 'domain');
                $results = $batch->execute();

                foreach ($results as $result) {
                    if ($result instanceof Google_Service_Exception) {
                        // Handle error
                        printf($result);
                    } else {
                        printf("Permission ID: %s\n", $result->id);
                        array_push($ids, $result->id);
                    }
                }
            } finally {
                $driveService->getClient()->setUseBatch(false);
            }
            return $ids;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    }

}

.NET

drive/snippets/drive_v3/DriveV3Snippets/ShareFile.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Drive.v3.Data;
using Google.Apis.Requests;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use-case of Drive modify permissions.
    public class ShareFile
    {
        /// <summary>
        /// Batch permission modification.
        /// </summary>
        /// <param name="realFileId">File id.</param>
        /// <param name="realUser">User id.</param>
        /// <param name="realDomain">Domain id.</param>
        /// <returns>list of modified permissions, null otherwise.</returns>
        public static IList<String> DriveShareFile(string realFileId, string realUser, string realDomain)
        {
            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 ids = new List<String>();
                var batch = new BatchRequest(service);
                BatchRequest.OnResponse<Permission> callback = delegate(
                    Permission permission,
                    RequestError error,
                    int index,
                    HttpResponseMessage message)
                {
                    if (error != null)
                    {
                        // Handle error
                        Console.WriteLine(error.Message);
                    }
                    else
                    {
                        Console.WriteLine("Permission ID: " + permission.Id);
                    }
                };
                Permission userPermission = new Permission()
                {
                    Type = "user",
                    Role = "writer",
                    EmailAddress = realUser
                };

                var request = service.Permissions.Create(userPermission, realFileId);
                request.Fields = "id";
                batch.Queue(request, callback);

                Permission domainPermission = new Permission()
                {
                    Type = "domain",
                    Role = "reader",
                    Domain = realDomain
                };
                request = service.Permissions.Create(domainPermission, realFileId);
                request.Fields = "id";
                batch.Queue(request, callback);
                var task = batch.ExecuteAsync();
                task.Wait();
                return ids;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}