- この記事は、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.com
の domain
を持っているかもしれません、それは、そのパーミッションが、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);
}
}];