ファイル、フォルダ、ドライブを共有する

すべての Google ドライブのファイル、フォルダ、共有ドライブには、 permissions リソースが関連付けられています。各リソース は、特定の typeusergroupdomainanyone)と roleownerorganizerfileOrganizerwritercommenterreader)の権限を識別します。たとえば、 ファイルには、特定のユーザー(type=user)に読み取り専用 アクセス権(role=reader)を付与する権限と、特定の グループ(type=group)のメンバーにファイルにコメントを追加する権限(role=commenter)が設定されている場合があります。

ロールの一覧と、各ロールで許可される操作については、ロール と権限をご覧ください。

権限の仕組み

フォルダの権限リストは下位に伝播します。すべての子ファイルとフォルダは、親から権限を継承します。権限または階層が変更されると、ネストされたすべてのフォルダに再帰的に伝播されます。たとえば、ファイルがフォルダに存在し、そのフォルダが別のフォルダ内に移動した場合、新しいフォルダの権限がファイルに伝播されます。新しいフォルダでファイル ユーザーに「書き込み」などの新しいロールが付与されると、古いロールはオーバーライドされます。

逆に、ファイルがフォルダから role=writer を継承し、「閲覧者」ロールを提供する別のフォルダに移動すると、ファイルは role=reader を継承します。

継承された権限は、どのアイテムでも削除または縮小できません。代わりに、これらの 権限は、権限の発生元の親で調整するか、階層内の フォルダで アクセス制限付きの設定を有効にする必要があります。

継承された権限は、アイテムで増やすことができます。子の権限が増加した場合、新しい親の権限が子よりも大きくない限り、親の権限を変更しても子の権限には影響しません。

同じファイルに対する権限操作の同時実行はサポートされていません。最後の更新のみが適用されます。

ファイルの機能について

permissions リソースは、最終的に 現在のユーザーがファイルまたはフォルダに対してアクションを実行できるかどうかを決定するものではありません。代わりに、files リソースには、ファイルまたはフォルダに対してアクションを実行できるかどうかを示すブール値の capabilities フィールドのコレクションが含まれています。Google Drive API は、ファイルまたはフォルダに関連付けられた現在のユーザーの permissions リソースに基づいて、これらのフィールドを設定します。

たとえば、Alex がアプリにログインしてファイルを共有しようとすると、Alex のロールでファイルの権限が確認されます。ロールでファイルの共有が許可されている場合、canShare などのファイルに関連する capabilities はロールに応じて設定されます。Alex がファイルを共有しようとすると、アプリは capabilities をチェックして、canSharetrue に設定されていることを確認します。

ファイルの機能を取得する

アプリがファイルを開くときは、ファイルの機能を確認し、現在のユーザーの権限を反映するように UI を表示する必要があります。たとえば、ユーザーがファイルに対する canComment 機能を持っていない場合、UI でコメント機能が無効になっている必要があります。

機能を確認するには、get メソッドを files リソースの fileId パスパラメータと fields パラメータを capabilities フィールドに設定して呼び出します。 パラメータを使用してフィールドを返す方法について詳しくは、 特定のフィールドを返すをご覧ください。fields

次のコードサンプルは、ユーザー権限を確認する方法を示しています。レスポンスでは、ユーザーがファイルに対して持つ機能のリストが返されます。各機能は、ユーザーが実行できるきめ細かいアクションに対応しています。一部のフィールドは、共有ドライブ内のアイテムにのみ入力されます。

リクエスト

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

レスポンス

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

ドライブ リソースの共有シナリオ

共有シナリオには次の 5 種類があります。

  1. マイドライブ内のファイルを共有するには、role=writer または role=owner が必要です。

  2. マイドライブ内のフォルダを共有するには、role=writer または role=owner が必要です。

    • ファイルの writersCanShare ブール値が false に設定されている場合は、より権限の緩い role=owner が必要です。

    • 一時的なアクセス権(有効期限の日時で管理)は、role=reader のフォルダでのみ許可されます。詳しくは、 有効期限を設定してアイテムへのアクセスを制限するをご覧ください。

  3. 共有ドライブ内のファイルを共有するには、role=writerrole=fileOrganizer、または role=organizer が必要です。

    • writersCanShare 設定は、共有ドライブ内のアイテムには適用されません。常に true に設定されているものとして扱われます。
  4. 共有ドライブ内のフォルダを共有するには、role=organizer が必要です。

    • 共有ドライブの sharingFoldersRequiresOrganizerPermission 制限がfalseに設定されている場合、 role=fileOrganizerのユーザーは、その共有ドライブ内のフォルダを共有できます。
  5. 共有ドライブのメンバーシップを管理するには、role=organizer が必要です。共有ドライブのメンバーになれるのは、ユーザーとグループのみです。

fields パラメータを使用する

レスポンスで返すフィールドを指定する場合は、 fields system parameterpermissions リソースの任意のメソッドで設定します。fields パラメータを省略すると、サーバーはメソッド固有のデフォルトのフィールド セットを返します。たとえば、list メソッドは、各ファイルの idtypekindrole フィールドのみを返します。別のフィールドを返す方法については、特定のフィールドを返すをご覧ください。

権限を作成する

権限を作成するには、次の 2 つのフィールドが必要です。

  • type: type は、権限のスコープ(usergroupdomainanyone)を識別します。 type=user の権限は特定のユーザーに適用されますが、 type=domain の権限は特定のドメイン内のすべてのユーザーに適用されます。

  • role: role フィールドは、type が実行できるオペレーションを識別します。たとえば、type=userrole=reader の権限は、特定のユーザーにファイルまたはフォルダへの読み取り専用アクセス権を付与します。また、type=domainrole=commenter の権限を使用すると、ドメイン内のすべてのユーザーがファイルにコメントを追加できます。ロールの一覧と、各ロールで許可される操作については、 ロールと権限をご覧ください。

type=user または type=group の権限を作成する場合は、特定のユーザーまたはグループを権限に関連付けるために emailAddress も指定する必要があります。

type=domain の権限を作成する場合は、 domain を権限に関連付けるために 特定のドメインも指定する必要があります。

権限を作成するには:

  1. 関連付けられたファイルまたはフォルダの fileId パスパラメータを指定して、create メソッドを permissions リソースで使用します。
  2. リクエストの本文で、typerole を指定します。
  3. type=user または type=group の場合は、emailAddress を指定します。type=domain の場合は、 domain を指定します。

次のコードサンプルは、権限を作成する方法を示しています。レスポンスでは、割り当てられた permissionId を含む permissions リソースのインスタンスが返されます。

リクエスト

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

レスポンス

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

対象グループを使用する

対象グループとは、ユーザーにアイテムの共有先として推奨できるグループ(部署やチームなど)のことです。ユーザーに組織全体ではなく一部の限られたユーザー グループとアイテムを共有するよう推奨できます。対象グループを使用すると、データのセキュリティとプライバシーを強化し、ユーザーが適切に共有しやすくなります。詳しくは、対象グループ についてをご覧ください。

対象グループを使用するには:

  1. Google 管理コンソールで、メニュー アイコン > [ディレクトリ] > [対象グループ] に移動します。

    [対象グループ] に移動

    このタスクを行うには、特権管理者権限を持つアカウントでログインする必要があります。

  2. [**対象グループ**] リストで、対象グループの名前をクリックします。対象グループを作成するには、対象グループを作成する をご覧ください。

  3. 対象グループの URL https://admin.google.com/ac/targetaudiences/ID から一意の ID をコピーします。

  4. 権限を作成し、type=domain を使用して domain フィールドを ID.audience.googledomains.com に設定します。

ユーザーが対象グループを操作する方法については、リンク共有のユーザー エクスペリエンスをご覧ください。

権限を取得する

権限を取得するには、get メソッド を permissions リソースで、 fileIdpermissionId パスパラメータを指定して使用します。権限 ID がわからない場合は、すべての権限を一覧表示するには、list メソッドを使用します。

次のコードサンプルは、ID で権限を取得する方法を示しています。レスポンスでは、permissions リソースのインスタンスが返されます。

リクエスト

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

レスポンス

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

すべての権限を一覧表示する

ファイル、フォルダ、共有ドライブの権限を一覧表示するには、fileId パスパラメータを指定して、permissions リソースの list メソッドを使用します。

次のクエリ パラメータを渡して、権限の ページネーションをカスタマイズしたり、権限をフィルタしたりします。

  • pageSize: ページごとに返す権限の最大数。共有ドライブ内のファイルに設定されていない場合、最大 100 件の結果が返されます。共有ドライブにないファイルに設定されていない場合は、リスト全体が返されます。

  • pageToken: 前回のリスト呼び出しで受信したページトークン。このトークンを指定すると、次のページを取得できます。

  • supportsAllDrives: リクエスト元のアプリがマイドライブと共有ドライブの両方をサポートしているかどうか。

  • useDomainAdminAccess: ドメイン管理者としてリクエストを発行するには、true に設定します。fileId パラメータが共有ドライブを参照し、リクエスタが共有ドライブが属するドメインの管理者である場合。詳しくは、ドメイン管理者として共有ドライブを 管理するをご覧ください。

  • includePermissionsForView: レスポンスに含める追加ビューの権限。published のみがサポートされています。

次のコードサンプルは、すべての権限を取得する方法を示しています。レスポンスでは、ファイル、フォルダ、共有ドライブの権限のリストが返されます。

リクエスト

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

レスポンス

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

権限を更新する

ファイルまたはフォルダの権限を更新するには、割り当てられたロールを変更します。ロールのソースの確認について詳しくは、ロールのソースを特定する をご覧ください。

  1. 関連付けられたファイル、フォルダ、共有ドライブに fileId path パラメータを設定し、変更する権限に permissionId パス パラメータを設定して、 permissions リソースの update メソッドを呼び出します。 permissionId を確認するには、fileId パスパラメータを指定して、permissions リソースの list メソッド を使用します。

  2. リクエストで、新しい role を特定します。

ユーザーまたはグループがすでにメンバーであっても、共有ドライブ内の個々のファイルまたはフォルダに権限を付与できます。たとえば、Alex は共有ドライブのメンバーシップの一部として role=commenter を持っています。ただし、アプリは共有ドライブ内のファイルに対して role=writer を Alex に付与できます。この場合、新しいロールはメンバーシップを通じて付与されたロールよりも権限が緩いため、新しい権限がファイルまたはフォルダの有効なロールになります。

更新はパッチ セマンティクスで適用できます。つまり、リソースの一部を変更できます。リクエストで変更するフィールドを明示的に設定する必要があります。リクエストに含まれていないフィールドは、既存の値を保持します。詳しくは、部分リソースの操作をご覧ください。

次のコードサンプルは、ファイルまたはフォルダの権限を commenter から writer に変更する方法を示しています。レスポンスでは、permissions リソースのインスタンスが返されます。

リクエスト

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

レスポンス

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

ロールのソースを特定する

ファイルまたはフォルダのロールを変更するには、ロールのソースを知る必要があります。 共有ドライブの場合、ロールのソースは、共有ドライブのメンバーシップ、フォルダのロール、ファイルのロールに基づく場合があります。

共有ドライブまたはそのドライブ内のアイテムのロールのソースを特定するには、 fileId パスパラメータと permissionId パスパラメータを指定し、fields パラメータを permissionDetails フィールドに設定して、 permissions リソースの get メソッドを呼び出します。

permissionId を確認するには、 list メソッドを permissions リソースの fileId パスパラメータとともに使用します。list リクエストで permissionDetails フィールドを取得するには、fields パラメータを permissions/permissionDetails に設定します。

このフィールドには、ユーザー、グループ、ドメインの継承されたファイル権限と直接的なファイル権限がすべて列挙されます。

次のコードサンプルは、ロールのソースを特定する方法を示しています。レスポンスでは、permissions リソースの permissionDetails が返されます。inheritedFrom フィールドには、権限が継承されたアイテムの ID が表示されます。

リクエスト

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

レスポンス

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

バッチ リクエストで複数の権限を更新する

複数の権限を変更するには、バッチ リクエストを使用することを強くおすすめします。

クライアント ライブラリを使用してバッチ権限を変更する例を次に示します。

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
import {GoogleAuth} from 'google-auth-library';
import {google} from 'googleapis';

/**
 * Shares a file with a user and a domain.
 * @param {string} fileId The ID of the file to share.
 * @param {string} targetUserEmail The email address of the user to share with.
 * @param {string} targetDomainName The domain to share with.
 * @return {Promise<Array<string>>} A promise that resolves to an array of permission IDs.
 */
async function shareFile(fileId, targetUserEmail, targetDomainName) {
  // 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});

  /** @type {Array<string>} */
  const permissionIds = [];

  // The permissions to create.
  const permissions = [
    {
      type: 'user',
      role: 'writer',
      emailAddress: targetUserEmail, // e.g., 'user@partner.com'
    },
    {
      type: 'domain',
      role: 'writer',
      domain: targetDomainName, // e.g., 'example.com'
    },
  ];

  // Iterate through the permissions and create them one by one.
  for (const permission of permissions) {
    const result = await service.permissions.create({
      requestBody: permission,
      fileId,
      fields: 'id',
    });

    if (result.data.id) {
      permissionIds.push(result.data.id);
      console.log(`Inserted permission id: ${result.data.id}`);
    } else {
      throw new Error('Failed to create permission');
    }
  }
  return permissionIds;
}

PHP

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

権限を削除する

ファイルまたはフォルダへのアクセスを取り消すには、 delete メソッドを permissions リソースで呼び出し、fileIdpermissionId パスパラメータを設定して権限を削除します。

継承された権限を取り消すことはできません。代わりに、親フォルダの権限を更新または削除します。フォルダの権限を削除すると、子アイテムの同等のアクセス権も取り消されます。

親と比較して権限を減らすには、 アクセス制限付きの設定を使用する必要があります。

次のコードサンプルは、permissionId を削除してアクセスを取り消す方法を示しています。成功した場合、レスポンスの本文は空の JSON オブジェクトになります。権限が削除されたことを確認するには、fileId パスパラメータを指定して、permissions リソースの list メソッドを使用します。

リクエスト

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

有効期限を設定してアイテムへのアクセスを制限する

機密性の高いプロジェクトで作業している場合は、一定期間後にドライブ内の特定のアイテムへのアクセスを制限することが必要になることがあります。ファイルとフォルダの場合は、有効期限を設定して、そのアイテムへのアクセスを制限または削除できます。

有効期限を設定するには:

  • create メソッドを permissions リソースで使用し、 expirationTime フィールド(他の必須フィールドとともに)を設定します。詳しくは、 権限を作成するをご覧ください。

  • update メソッドを permissions リソースで使用し、expirationTime フィールド( 他の必須フィールドとともに)を設定します。詳しくは、権限を 更新するをご覧ください。

The expirationTime フィールドは、RFC 3339 の日時を使用して権限の有効期限を示します。有効期限には次の制限があります。

  • ユーザー権限とグループ権限にのみ設定できます。
  • 時刻は未来である必要があります。
  • 時刻は 1 年以上先にはできません。
  • フォルダの有効期限付きのアクセス権を付与できるのは、reader ロールのみです。

有効期限について詳しくは、次の記事をご覧ください。