如何用Google Apps Script获取域内所有用户的全部Drive文件
解决方法:通过域范围委派模拟用户调用Drive API
前置准备
- 确保你的Apps Script项目已关联到配置了域范围委派的Cloud Platform项目(在Apps Script编辑器中,依次点击「资源」>「云平台项目」,选择已配置服务账号的项目)
- 安装OAuth2库:在Apps Script编辑器中,点击「资源」>「库」,输入库ID
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF,选择最新版本添加
核心实现步骤
1. 存储服务账号密钥
将服务账号的JSON密钥内容存入脚本的属性中(避免硬编码):
- 在Apps Script编辑器中,点击「文件」>「项目属性」>「脚本属性」
- 添加一个名为
SERVICE_ACCOUNT_KEY的属性,值为服务账号JSON密钥的完整内容
2. 编写模拟用户身份的OAuth2授权函数
function getOAuthService(userEmail) { const serviceAccountKey = JSON.parse(PropertiesService.getScriptProperties().getProperty('SERVICE_ACCOUNT_KEY')); return OAuth2.createService('DriveImpersonation') .setTokenUrl('https://oauth2.googleapis.com/token') .setPrivateKey(serviceAccountKey.private_key) .setIssuer(serviceAccountKey.client_email) .setSubject(userEmail) // 指定要模拟的用户邮箱 .setPropertyStore(PropertiesService.getScriptProperties()) .setScope('https://www.googleapis.com/auth/drive.readonly'); // 只读权限足够获取文件列表 }
3. 获取域内所有用户列表
function getDomainUsers() { const users = []; let pageToken = null; do { const response = AdminDirectory.Users.list({ domain: '你的域名.com', // 替换为你的Workspace域名 maxResults: 500, pageToken: pageToken }); users.push(...response.users); pageToken = response.nextPageToken; } while (pageToken); return users.map(user => user.primaryEmail); }
注意:需要先启用Admin Directory服务,在Apps Script编辑器中点击「资源」>「高级Google服务」,找到「Admin Directory API」并启用
4. 模拟用户获取Drive文件
function getUserDriveFiles(userEmail) { const service = getOAuthService(userEmail); if (!service.hasAccess()) { throw new Error(`无法获取用户 ${userEmail} 的授权:${service.getLastError()}`); } const files = []; let pageToken = null; do { const url = `https://www.googleapis.com/drive/v3/files?pageSize=1000&pageToken=${pageToken}&fields=files(id,name,mimeType,createdTime,owners)`; const response = UrlFetchApp.fetch(url, { headers: { 'Authorization': `Bearer ${service.getAccessToken()}` } }); const data = JSON.parse(response.getContentText()); files.push(...data.files); pageToken = data.nextPageToken; } while (pageToken); return files; }
5. 主函数:遍历所有用户并收集文件
function collectAllDomainDriveFiles() { const userEmails = getDomainUsers(); const allFiles = []; for (const email of userEmails) { try { const userFiles = getUserDriveFiles(email); allFiles.push(...userFiles.map(file => ({ ...file, ownerEmail: email }))); console.log(`已获取用户 ${email} 的 ${userFiles.length} 个文件`); } catch (e) { console.error(`获取用户 ${email} 文件失败:${e.message}`); } } // 示例:将结果写入当前Google表格 const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.clear(); sheet.appendRow(['文件ID', '文件名', '文件类型', '创建时间', '所有者邮箱']); allFiles.forEach(file => { sheet.appendRow([file.id, file.name, file.mimeType, file.createdTime, file.ownerEmail]); }); }
设置每日触发
- 在Apps Script编辑器中,点击「编辑」>「当前项目的触发器」
- 点击「添加触发器」,配置:
- 运行函数:
collectAllDomainDriveFiles - 部署类型:「Head」
- 事件源:「时间驱动」
- 时间基于:「日计时器」
- 选择每日执行的时间段(如「上午9点到10点」)
- 保存即可
- 运行函数:
内容的提问来源于stack exchange,提问作者Graham
相关产品推荐
相关产品推荐

