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



  • この記事は、Google Drive™ APIに関する記事を和訳したものです。
  • 原文: Share files, folders and drives
  • 元記事のライセンスは CC-BYで、この和訳記事のライセンスは CC-BYです。
  • 自己責任でご利用ください。
  • 和訳した時期は 2019年6月ころです。

アプリケーションのユーザが、Drive内のファイルおよびフォルダを共有できるようにするには、Permissions APIリソースを使用します。 パーミッションを取得し、ユーザがファイルを開くパーミッションを持っていることを検証し、ファイルの所有権を移行し、パーミッションを付与および取り消し、複数のパーミッションを変更するためにバッチリクエストを使用することができます。

ファイルおよびフォルダを共有するには、アクセス制御リスト(ACL)内でパーミッションを指定します、それは、ユーザが、ファイル上で、読み込みあるいは書き込みといったアクションを実行することができるかどうかを決定するパーミッションのリストです。

特定のリソースのプロパティの定義については、APIリファレンスを参照してください: Permissions

パーミッションの構造

4つのフィールドがファイルのパーミッションを定義します: type, emailAddress, domain および role。 これらの値は、適切にアクセス権を制限するために連携し、完全な permissionを定義するために組み合わされます。

これら 3つのフィールドの組み合わせは、1人以上のユーザを識別します:

  • type - 1人以上のユーザ(例えば、ユーザ、グループ、ドメイン、あるいは、誰でも)のアクセスを制限します
  • emailAddress - アクセス権を持つユーザあるいはグループを提供します
  • domain - パーミッションごとにアクセス権を持つドメインを指定します

役割フィールドは、ファイルを用いて何かをするユーザの能力を制御します(例えば、owner、organizer、writer)。

役割

Google Drive APIのそれぞれのパーミッションは、ユーザがファイルを用いてできることを定義している役割を持っています。 この表は、ユーザがそれぞれの役割に対して実行することができる操作を示しています。

許可された操作 organizer/owner fileOrganizer writer commenter reader
ファイルあるいはフォルダのメタデータ(例: 名前、説明)を読み込む
ファイルのコンテンツを読み込む
フォルダ内のアイテムのリストを読み込む
ファイルにコメントを追加する
ファイルあるいはフォルダのメタデータを修正する
ファイルのコンテンツを修正する
履歴のリビジョンにアクセスする
フォルダにアイテムを追加する
My Driveフォルダからアイテムを取り除く
共有ドライブのアイテムを共有する
共有ドライブにファイルを追加する
ゴミ箱にアイテムを移動させる
共有ドライブ内のアイテムを再編成する1
アイテムを共有ドライブの外側に移動させる2
ファイルあるいはフォルダを削除する
共有ドライブ内のアイテムを削除する2
共有ドライブのメタデータを編集する
共有ドライブのメンバを追加する
空の共有ドライブを削除する

タイプおよび値

ファイルあるいはフォルダのそれぞれのパーミッションは、typeを持っています、それは、パーミッションのスコープで、どのユーザが役割を持つかを決定します。 タイプ userおよび groupsを伴うパーミッションは、emailAddressも持っています。 タイプ domainを伴うパーミッションは、ドメイン名を指定する、対応する domainプロパティを持っています。 例えば、domainのタイプを伴うパーミッションは、thecompany.comdomainを持っているかもしれません、それは、そのパーミッションが、G Suiteドメイン thecompany.comのすべてのユーザに、与えられた roleを付与していることを示しています。 この表は、利用可能なすべてのタイプおよび値を定義し、値の例を示しています。

タイプ フィールド
user emailAddress ユーザの電子メールアドレス。 (例: joe@thecompany.com)
group emailAddress Google Groupの電子メールアドレス。 (例: admins@thecompany.com)
domain domain G Suiteドメインのドメイン名。 (例: thecompany.com)
anyone N/A anyoneパーミッションは、emailAddressあるいは domainを必要としません。

IDおよび名前

idは、常に、パーミッションの値のユニークな識別子です。 IDは、不透明な値として扱われるべきです。

displayNameは、常に、パーミッションの値の "pretty" な名前です。 以下は、それぞれのタイプのパーミッションの潜在的な名前のリストです。

タイプ 可能な名前の値
user ユーザのフルネーム、彼らの Googleアカウントで定義されている。 (例: Joe Smith)
group Google Groupの名前。 (例: The Company Administrators)
domain ドメイン名文字列。 (例: thecompany.com)
anyone displayNameはありません。

パーミッションの伝播

フォルダのパーミッションを定義する ACLは、含まれているすべてのアイテムに下方に伝播します。 パーミッションあるいは階層が変更されるたびに、伝播は、ネストされたすべてのフォルダを介して再帰的に行われます。

継承されたパーミッションは、共有ドライブ内のアイテムから削除することはできません。 代わりに、それらは、それが継承されている、直接あるいは間接的な親に対して調整されることができます。 間接的なパーミッションは、"My Drive" あるいは "Shared with me" 下のアイテムから削除されるかもしれません。

機能

機能は、アクションがファイル上で実行できるかどうかを示す、ブール値のフィールドのコレクションです。 現在のユーザの有効なパーミッションは、ファイルのメタデータの capabilitiesとして表されます。

ファイルのパーミッションを取得する

Drive内のファイルあるいはフォルダのパーミッションを取得するには、permissions.listを使用します。

アプリがファイルを開く機能を検証する

あなたのアプリがファイルを開くとき、それは機能をチェックし、リクエストしているユーザのために、適切に UIをレンダリングする必要があります。

共有ドライブのファイルのパーミッションを指定する

パーミッションの roleフィールドは、ユーザ、グループ、あるいはドメインが与えられたアイテムに対して持っている有効な役割を反映します。 有効な役割のソースを決定するには、permissionDetailsフィールドを使用します。 このフィールドは、ユーザ、グループ、あるいはドメインの、すべての継承された、および直接のファイルパーミッションを列挙します。

パーミッションを付与あるいは変更する

ユーザ、グループ、あるいはドメインに追加的なパーミッションを付与するには、permissions.createを使用します。 割り当てられた役割を変更するには、permissions.updateを使用します。

ターゲットのユーザあるいはグループが既にメンバである場合でさえ、パーミッションが、共有ドライブ内の個々のアイテムに付与されるかもしれません。 もし新しい役割が彼らのメンバーシップを経由して付与された役割よりも寛容であるならば、新しいパーミッションは、選択されたアイテムのための有効な役割になります。

アクセス権を取り消す

アイテムへのアクセス権を取り消すには、パーミッションを deleteします。 これは、共有ドライブのアイテム上のファイルの、直接のファイルアクセスパーミッションを削除するためにも使用されます。

"My Drive" のアイテムの場合、継承されたパーミッションを削除することが可能です。 そうすることで、アイテムおよび子のアイテムへのアクセスが、もしあるならば、取り消されます。

共有ドライブのアイテムの場合、継承されたパーミッションは取り消されることができません。 代わりに、親のアイテムのパーミッションを更新あるいは取り消します。

ファイルの所有権を移行する

ファイルの所有権を移行するには、owner役割を伴うパーミッションを作成あるいは更新し、transerOwnershipクエリパラメータに trueをセットします。 ファイルが移行されたとき、以前の所有者の役割は writerにダウングレードされます。

所有者の移行は、共有ドライブ内のアイテムではサポートされていません。 所有権の移行は、ユーザが共有ドライブに、あるいは、共有ドライブからアイテムを移動させたとき、暗黙的に行われます。

バッチリクエストを用いて複数のパーミッションを変更する

私たちは、複数のパーミッションを修正するためにバッチリクエストを使用することを強くお勧めします。

私たちの Drive APIクライアントライブラリを用いてバッチのパーミッション修正を実行する例を、次に示します。

Java

String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ";
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());
  }
};
BatchRequest batch = driveService.batch();
Permission userPermission = new Permission()
    .setType("user")
    .setRole("writer")
    .setEmailAddress("user@example.com");
driveService.permissions().create(fileId, userPermission)
    .setFields("id")
    .queue(batch, callback);

Permission domainPermission = new Permission()
    .setType("domain")
    .setRole("reader")
    .setDomain("example.com");
driveService.permissions().create(fileId, domainPermission)
    .setFields("id")
    .queue(batch, callback);

batch.execute();

Python

file_id = '1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ'
def callback(request_id, response, exception):
    if exception:
        # Handle error
        print exception
    else:
        print "Permission Id: %s" % response.get('id')

batch = drive_service.new_batch_http_request(callback=callback)
user_permission = {
    'type': 'user',
    'role': 'writer',
    'emailAddress': 'user@example.com'
}
batch.add(drive_service.permissions().create(
        fileId=file_id,
        body=user_permission,
        fields='id',
))
domain_permission = {
    'type': 'domain',
    'role': 'reader',
    'domain': 'example.com'
}
batch.add(drive_service.permissions().create(
        fileId=file_id,
        body=domain_permission,
        fields='id',
))
batch.execute()

PHP

$fileId = '1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ';
$driveService->getClient()->setUseBatch(true);
try {
    $batch = $driveService->createBatch();

    $userPermission = new Google_Service_Drive_Permission(array(
        'type' => 'user',
        'role' => 'writer',
        'emailAddress' => 'user@example.com'
    ));
    $request = $driveService->permissions->create(
        $fileId, $userPermission, array('fields' => 'id'));
    $batch->add($request, 'user');
    $domainPermission = new Google_Service_Drive_Permission(array(
        'type' => 'domain',
        'role' => 'reader',
        'domain' => 'example.com'
    ));
    $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);
        }
    }
} finally {
    $driveService->getClient()->setUseBatch(false);
}

.NET

var fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ";
var batch = new BatchRequest(driveService);
BatchRequest.OnResponse<Permission> callback = delegate (
    Permission permission,
    RequestError error,
    int index,
    System.Net.Http.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 = "user@example.com"
};
var request = driveService.Permissions.Create(userPermission, fileId);
request.Fields = "id";
batch.Queue(request, callback);

Permission domainPermission = new Permission()
{
    Type = "domain",
    Role = "reader",
    Domain = "example.com"
};
request = driveService.Permissions.Create(domainPermission, fileId);
request.Fields = "id";
batch.Queue(request, callback);
var task = batch.ExecuteAsync();

Ruby

file_id = '1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ'
callback = lambda do |res, err|
  if err
    # Handle error...
    puts err.body
  else
    puts "Permission ID: #{res.id}"
  end
end
drive_service.batch do |service|
  user_permission = {
      type: 'user',
      role: 'writer',
      email_address: 'user@example.com'
  }
  service.create_permission(file_id,
                            user_permission,
                            fields: 'id',
                            &callback)
  domain_permission = {
      type: 'domain',
      role: 'reader',
      domain: 'example.com'
  }
  service.create_permission(file_id,
                            domain_permission,
                            fields: 'id',
                            &callback)
end

Node.js

var fileId = '1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ';
var permissions = [
  {
    'type': 'user',
    'role': 'writer',
    'emailAddress': 'user@example.com'
  }, {
    'type': 'domain',
    'role': 'writer',
    'domain': 'example.com'
  }
];
// Using the NPM module 'async'
async.eachSeries(permissions, function (permission, permissionCallback) {
  drive.permissions.create({
    resource: permission,
    fileId: fileId,
    fields: 'id',
  }, function (err, res) {
    if (err) {
      // Handle error...
      console.error(err);
      permissionCallback(err);
    } else {
      console.log('Permission ID: ', res.id)
      permissionCallback();
    }
  });
}, function (err) {
  if (err) {
    // Handle error
    console.error(err);
  } else {
    // All permissions inserted
  }
});

Objective-C

NSString *fileId = @"1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ";
GTLRBatchQuery *batchQuery = [GTLRBatchQuery batchQuery];

GTLRDrive_Permission *userPermission = [GTLRDrive_Permission object];
userPermission.type = @"user";
userPermission.role = @"writer";
userPermission.emailAddress = @"user@example.com";
GTLRDriveQuery_PermissionsCreate *createUserPermission =
    [GTLRDriveQuery_PermissionsCreate queryWithObject:userPermission
                                               fileId:fileId];
createUserPermission.fields = @"id";
createUserPermission.completionBlock = ^(GTLRServiceTicket *ticket,
                           GTLRDrive_Permission *permission,
                           NSError *error) {
    if (error == nil) {
        NSLog(@"Permisson ID: %@", permission.identifier);
    } else {
        NSLog(@"An error occurred: %@", error);
    }

};
[batchQuery addQuery:createUserPermission];

GTLRDrive_Permission *domainPermission = [GTLRDrive_Permission object];
domainPermission.type = @"domain";
domainPermission.role = @"reader";
domainPermission.domain = @"example.com";

GTLRDriveQuery_PermissionsCreate *createDomainPermission =
    [GTLRDriveQuery_PermissionsCreate queryWithObject:domainPermission
                                               fileId:fileId];
createDomainPermission.fields = @"id";
createDomainPermission.completionBlock = ^(GTLRServiceTicket *ticket,
                           GTLRDrive_Permission *permission,
                           NSError *error) {
    if (error == nil) {
        NSLog(@"Permisson ID: %@", permission.identifier);
    } else {
        NSLog(@"An error occurred: %@", error);
    }
};
[batchQuery addQuery:createDomainPermission];

[driveService executeQuery:batchQuery completionHandler:^(GTLRServiceTicket *ticket,
                                                     GTLRBatchResult *batchResult,
                                                     NSError *error) {
    if (error) {
        NSLog(@"An error occurred: %@", error);
    }
}];