共有ドライブ管理者追加スクリプト

/**
 * Google Workspace管理者が指定した共有ドライブに自分自身を管理者として追加するスクリプト
 * Drive API v2を使用(permissions.insert)
 */

/**
 * メイン関数:共有ドライブに管理者として自分自身を追加
 */
function addMyselfAsSharedDriveAdmin() {
  // 共有ドライブIDを指定(実際のIDに変更してください)
  const sharedDriveId = 'YOUR_SHARED_DRIVE_ID_HERE';
  
  try {
    // 現在のユーザーのメールアドレスを取得
    const currentUserEmail = Session.getActiveUser().getEmail();
    
    // 共有ドライブに管理者として追加
    const result = addAdminToSharedDrive(sharedDriveId, currentUserEmail);
    
    if (result.success) {
      console.log(`成功: ${currentUserEmail} を共有ドライブの管理者として追加しました`);
      console.log(`Permission ID: ${result.permissionId}`);
    } else {
      console.error(`エラー: ${result.error}`);
    }
    
  } catch (error) {
    console.error('処理中にエラーが発生しました:', error.toString());
  }
}

/**
 * 共有ドライブにユーザーを管理者として追加する関数
 * @param {string} sharedDriveId - 共有ドライブのID
 * @param {string} userEmail - 追加するユーザーのメールアドレス
 * @returns {Object} 結果オブジェクト
 */
function addAdminToSharedDrive(sharedDriveId, userEmail) {
  try {
    // 既存の権限を確認
    const existingPermission = checkExistingPermission(sharedDriveId, userEmail);
    
    if (existingPermission) {
      // 既に権限がある場合は更新
      if (existingPermission.role === 'organizer') {
        return {
          success: true,
          message: 'ユーザーは既に管理者権限を持っています',
          permissionId: existingPermission.id
        };
      } else {
        // 既存権限を管理者に更新
        return updatePermissionToAdmin(sharedDriveId, existingPermission.id);
      }
    } else {
      // 新規権限を作成
      return createAdminPermission(sharedDriveId, userEmail);
    }
    
  } catch (error) {
    return {
      success: false,
      error: error.toString()
    };
  }
}

/**
 * 既存の権限を確認する関数
 * @param {string} sharedDriveId - 共有ドライブのID
 * @param {string} userEmail - ユーザーのメールアドレス
 * @returns {Object|null} 既存の権限オブジェクトまたはnull
 */
function checkExistingPermission(sharedDriveId, userEmail) {
  try {
    const permissions = Drive.Permissions.list(sharedDriveId, {
      supportsAllDrives: true,
      useDomainAdminAccess: true
    });
    
    if (permissions.items) {
      return permissions.items.find(permission => 
        permission.emailAddress === userEmail
      ) || null;
    }
    
    return null;
  } catch (error) {
    console.warn('権限確認中にエラー:', error.toString());
    return null;
  }
}

/**
 * 既存権限を管理者に更新する関数
 * @param {string} sharedDriveId - 共有ドライブのID
 * @param {string} permissionId - 権限ID
 * @returns {Object} 結果オブジェクト
 */
function updatePermissionToAdmin(sharedDriveId, permissionId) {
  try {
    const updatedPermission = Drive.Permissions.update(
      {
        role: 'organizer'
      },
      sharedDriveId,
      permissionId,
      {
        supportsAllDrives: true,
        useDomainAdminAccess: true
      }
    );
    
    return {
      success: true,
      message: '権限を管理者に更新しました',
      permissionId: updatedPermission.id
    };
    
  } catch (error) {
    return {
      success: false,
      error: `権限更新エラー: ${error.toString()}`
    };
  }
}

/**
 * 新規管理者権限を作成する関数(Drive API v2のpermissions.insertを使用)
 * @param {string} sharedDriveId - 共有ドライブのID
 * @param {string} userEmail - ユーザーのメールアドレス
 * @returns {Object} 結果オブジェクト
 */
function createAdminPermission(sharedDriveId, userEmail) {
  try {
    const permission = Drive.Permissions.insert(
      {
        role: 'organizer',
        type: 'user',
        value: userEmail
      },
      sharedDriveId,
      {
        sendNotificationEmails: false, // 通知メールを送信しない
        supportsAllDrives: true,       // 共有ドライブをサポート
        useDomainAdminAccess: true     // ドメイン管理者アクセスを使用
      }
    );
    
    return {
      success: true,
      message: '管理者権限を新規作成しました',
      permissionId: permission.id
    };
    
  } catch (error) {
    return {
      success: false,
      error: `権限作成エラー: ${error.toString()}`
    };
  }
}

/**
 * 複数の共有ドライブに一括で管理者として追加する関数
 * @param {string[]} sharedDriveIds - 共有ドライブIDの配列
 */
function addMyselfToMultipleSharedDrives(sharedDriveIds) {
  const currentUserEmail = Session.getActiveUser().getEmail();
  const results = [];
  
  sharedDriveIds.forEach(driveId => {
    console.log(`処理中: ${driveId}`);
    const result = addAdminToSharedDrive(driveId, currentUserEmail);
    results.push({
      driveId: driveId,
      result: result
    });
    
    // API制限を避けるため少し待機
    Utilities.sleep(100);
  });
  
  // 結果をログ出力
  results.forEach(item => {
    if (item.result.success) {
      console.log(`✓ ${item.driveId}: ${item.result.message}`);
    } else {
      console.error(`✗ ${item.driveId}: ${item.result.error}`);
    }
  });
  
  return results;
}

/**
 * 使用例とテスト関数
 */
function testScript() {
  // 使用例1: 自分自身を管理者として追加
  console.log('=== 自分自身を管理者として追加 ===');
  // addMyselfAsSharedDriveAdmin();
  
  // 使用例2: 複数の共有ドライブに一括追加
  console.log('\n=== 複数ドライブに一括追加 ===');
  const driveIds = [
    'YOUR_SHARED_DRIVE_ID1',
    'YOUR_SHARED_DRIVE_ID2',
    'YOUR_SHARED_DRIVE_ID3'
  ];
  // addMyselfToMultipleSharedDrives(driveIds);
  
}

/**
 * Drive API v2での共有ドライブ一覧取得(参考用)
 */
function listSharedDrives() {
  try {
    let nextPageToken = null;
    let totalCount = 0;
    
    do {
      const requestParams = {
        maxResults: 100,
        useDomainAdminAccess: true
      };
      
      // nextPageTokenがある場合は追加
      if (nextPageToken) {
        requestParams.pageToken = nextPageToken;
      }
      
      const drives = Drive.Drives.list(requestParams);
      
      if (drives.items && drives.items.length > 0) {
        drives.items.forEach(drive => {
          console.log(`${drive.name} (ID: ${drive.id})`);
        });
        totalCount += drives.items.length;
      }
      
      // 次のページのトークンを取得
      nextPageToken = drives.nextPageToken || null;
      
      // API制限を避けるため少し待機
      if (nextPageToken) {
        Utilities.sleep(100);
      }
      
    } while (nextPageToken);
    
    console.log(`合計: ${totalCount}件の共有ドライブ`);
    
  } catch (error) {
    console.error('共有ドライブ一覧取得エラー:', error.toString());
  }
}