共有ドライブを管理する



  • この記事は、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を用いて 共有ドライブを検索するときは、以下のことを考慮してください。

  1. organizerCount がゼロである共有ドライブは、管理者によってのみ管理されることができます。
  2. memberCountがゼロである共有ドライブは、管理者によってのみアクセスされることができます。
  3. organizerCountあるいは memberCountがゼロより大きな共有ドライブは、残りのパーミッションが空のグループのためのものである場合には管理者、あるいは、ドメインの外側での共有を無効にする前に追加された外部のユーザによって、まだアクセスされることができます。
  4. organizerCountおよび memberCountフィールドは、組織のメンバと外部のメンバとを区別しません。
  5. memberCountがゼロである共有ドライブ内のファイルは、ファイルパーミッション上に書かれたエンティティによって、まだアクセスされることができます。