- この記事は、Google Drive™ APIに関する記事を和訳したものです。
- 原文: Manage shared drives
- 元記事のライセンスは CC-BYで、この和訳記事のライセンスは CC-BYです。
- 自己責任でご利用ください。
- 和訳した時期は 2019年6月ころです。
共有ドライブを作成および管理し始めるために必要となる情報の多くは、shared drives referenceに記載されています。 共有ドライブを用いて作業するとき、幾つかの重要な考慮事項があります。
共有ドライブを作成する
新しい共有ドライブを作成するには、drives.create
を使用します。
Java
Drive driveMetadata = new Drive();
driveMetadata.setName("Project Resources");
String requestId = UUID.randomUUID().toString();
Drive drive = driveService.drives().create(requestId,
driveMetadata)
.execute();
System.out.println("Drive ID: " + drive.getId());
Python
drive_metadata = {'name': 'Project Resources'}
request_id = str(uuid.uuid4())
drive = drive_service.drives().create(body=drive_metadata,
requestId=request_id,
fields='id').execute()
print 'Drive ID: %s' % drive.get('id')
PHP
$driveMetadata = new Google_Service_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);
.NET
var driveMetadata = new Drive()
{
Name = "Project Resources"
};
var requestId = System.Guid.NewGuid().ToString();
var request = driveService.Drives.Create(driveMetadata, requestId);
request.Fields = "id";
var drive = request.Execute();
Console.WriteLine("Drive ID: " + drive.Id);
Ruby
drive_metadata = {
name: 'Project Resources'
}
request_id = SecureRandom.uuid
drive = drive_service.create_drive(request_id,
drive_metadata,
fields: 'id')
puts "Drive Id: #{drive.id}"
Node.js
var driveMetadata = {
'name': 'Project resources'
};
var requestId = uuid.v4();
driveService.drives.create({
resource: driveMetadata,
requestId: requestId,
fields: 'id'
}, function (err, drive) {
if (err) {
// Handle error
console.error(err);
} else {
console.log('Drive Id: ', drive.id);
}
});
drives.create
への呼び出しは、べき等です。
requestId
パラメータは、共有ドライブを作成するための論理的な試みを識別します。
もし、リクエストがタイムアウト、あるいは、不確定なバックエンドエラーを返したならば、同じリクエストが繰り返されるかもしれません。
requestId
およびリクエストのボディは、同じままでなければなりません。
もし、共有ドライブが以前のリクエスト上で、あるいはリトライの結果として正常に作成されたならば、通常のレスポンスが返されます。
長期間が経過した後、あるいは、リクエストのボディが変更された場合といった幾つかの場合では、requestId
を破棄しなければならないことを示す 409
エラーが返されるかもしれません。
メンバおよびパーミッションを管理する
permissions
コレクションを使用して、共有ドライブのメンバを、追加あるいは削除します。
メンバを追加するには、共有ドライブ自体にパーミッションを作成します。 パーミッションメソッドは、共有ドライブ内の個々のファイルに、メンバに追加の特権を付与し、あるいは、非メンバーが特定のアイテムをコラボレーションできるようにするために使用されることもできます。
詳細およびサンプルコードについては、ファイルとフォルダを共有するを参照してください。
共有ドライブを削除する
共有ドライブを削除するには、drives.delete
メソッドを使用します。
共有ドライブを削除する前に、共有ドライブ内のすべてのコンテンツはゴミ箱に移動される、あるいは、削除されなければなりません。
ドメイン管理者用の共有ドライブを管理する
組織を横断して共有ドライブを管理するには、drives
および permissions
リソースとともに useDomainAdminAccess
パラメータを使用します。
useDomainAdminAccess=true
を用いてこれらのメソッドを呼び出すユーザは、Drive and Docs
管理者特権を持っていなければなりません。
管理者は、任意の与えられた共有ドライブ内の管理者のメンバーシップに関係なく、共有ドライブを検索する、あるいは、彼らの組織によって所有される共有ドライブのためのパーミッションを更新することができます。
次の例は、オーガナイザーを持たなくなった共有ドライブを回復するために、これらのリソースを使用する方法を示しています。
Java
// 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")
.setEmailAddress("user@example.com");
do {
DriveList result = driveService.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 = driveService.permissions()
.create(drive.getId(), newOrganizerPermission)
.setUseDomainAdminAccess(true)
.setSupportsAllDrives(true)
.setFields("id")
.execute();
System.out.printf("Added organizer permission: %s\n",
permissionResult.getId());
}
pageToken = result.getNextPageToken();
} while (pageToken != null);
Python
# 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.
page_token = None
new_organizer_permission = {
'type': 'user',
'role': 'organizer',
'emailAddress': 'user@example.com'
}
while True:
response = drive_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: %s (%s)' % (
drive.get('title'), drive.get('id'))
permission = drive_service.permissions().create(
fileId=drive.get('id'),
body=new_organizer_permission,
useDomainAdminAccess = True,
supportsAllDrives = True,
fields='id').execute()
print 'Added organizer permission: %s ' % (permission.get('id'))
page_token = response.get('nextPageToken', None)
if page_token is None:
break
PHP
// 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 Google_Service_Drive_Permission(array(
'type' => 'user',
'role' => 'organizer',
'emailAddress' => 'user@example.com'
));
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);
}
$pageToken = $repsonse->pageToken;
} while ($pageToken != null);
.NET
// 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 = "user@example.com"
};
do
{
var request = driveService.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(string.Format(
"Found abandoned shared drive: {0} ({1})",
drive.Name, drive.Id));
// Note: For improved efficiency, consider batching
// permission insert requests
var permissionRequest = driveService.Permissions.Create(
newOrganizerPermission,
drive.Id
);
permissionRequest.UseDomainAdminAccess = true;
permissionRequest.SupportsAllDrives = true;
permissionRequest.Fields = "id";
var permissionResult = permissionRequest.Execute();
Console.WriteLine(string.Format(
"Added organizer permission: {0}", permissionResult.Id));
}
pageToken = result.NextPageToken;
} while (pageToken != null);
Ruby
# 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.
new_organizer_permission = {
type: 'user',
role: 'organizer',
email_address: 'user@example.com'
}
drives = drive_service.fetch_all(items: :drives) do |page_token|
drive_service.list_drives(
q: 'organizerCount = 0',
fields: 'nextPageToken, drives(id, name)',
use_domain_admin_access: true,
page_token: page_token)
end
for drive in drives
puts "Found shared drive without organizer: #{drive.name} #{drive.id}"
permission = drive_service.create_permission(drive.id,
new_organizer_permission,
use_domain_admin_access: true,
supports_all_drives: true,
fields: 'id')
puts "Added organizer permission: {permission.id}"
end
Node.js
var newOrganizerPermission = {
type: 'user',
role: 'organizer',
emailAddress: 'user@example.com'
};
var pageToken;
// Using the npm module 'async'
async.doWhilst(function (callback) {
driveService.drives.list({
q: "organizerCount = 0",
fields: 'nextPageToken, drives(id, name)',
useDomainAdminAccess: true,
pageToken: pageToken
}, function (err, res) {
if (err) {
// Handle error
console.error(err);
callback(err)
} else {
async.eachSeries(res.drives, function (drive, callback) {
console.log('Found shared drive without organizer:',
drive.name, drive.id);
driveService.permissions.create({
resource: newOrganizerPermission,
fileId: drive.id,
useDomainAdminAccess: true,
supportsAllDrives: true,
fields: 'id'
}, callback);
}, callback);
pageToken = res.nextPageToken;
}
});
}, function () {
return !!pageToken;
}, function (err) {
if (err) {
// Handle error
console.error(err);
} else {
// All pages fetched
}
});
共有ドライブを作成し管理するときに追加的な考慮事項
共有ドライブを監査するために drives.list
を用いて 共有ドライブを検索するときは、以下のことを考慮してください。
-
organizerCount
がゼロである共有ドライブは、管理者によってのみ管理されることができます。 -
memberCount
がゼロである共有ドライブは、管理者によってのみアクセスされることができます。 -
organizerCount
あるいはmemberCount
がゼロより大きな共有ドライブは、残りのパーミッションが空のグループのためのものである場合には管理者、あるいは、ドメインの外側での共有を無効にする前に追加された外部のユーザによって、まだアクセスされることができます。 -
organizerCount
およびmemberCount
フィールドは、組織のメンバと外部のメンバとを区別しません。 -
memberCount
がゼロである共有ドライブ内のファイルは、ファイルパーミッション上に書かれたエンティティによって、まだアクセスされることができます。