如何获取Google Workspace近7天域内共享的Drive文件及共享信息
问题解答
可以实现你的需求,不需要更换API,但需要调整服务账号的授权逻辑和API调用方式,核心是利用域范围授权模拟域管理员身份,并结合文件权限查询来获取所需信息。
关键调整点
模拟域管理员身份
服务账号本身没有域内文件的访问权限,必须通过域范围授权模拟域内管理员的身份,才能查看整个域的文件。正确配置API查询参数
- 使用
corpora: "domain"指定搜索整个域的文件 - 构造
q参数过滤近7天内有共享变更的文件 - 调用
permissions.list接口获取每个文件的共享详情,筛选域内用户的共享记录
- 使用
权限范围确认
确保服务账号的域范围授权已添加正确的scope:https://www.googleapis.com/auth/drive.readonly(或drive,按需选择),且管理员账号拥有域内Drive的全局访问权限。
修改后的参考脚本
const { google } = require('googleapis'); const path = require('path'); const moment = require('moment'); // 需要先安装moment:npm install moment // 服务账号密钥文件路径 const SERVICE_ACCOUNT_FILE = path.join(__dirname, 'doman_wide_delegation_service_account.json'); // 要模拟的域管理员邮箱 const ADMIN_EMAIL = 'admin@your-domain.com'; // 所需权限范围 const SCOPES = ['https://www.googleapis.com/auth/drive.readonly']; async function listDomainSharedFiles() { try { // 创建授权客户端,模拟域管理员 const auth = new google.auth.GoogleAuth({ keyFile: SERVICE_ACCOUNT_FILE, scopes: SCOPES, clientOptions: { subject: ADMIN_EMAIL // 关键:模拟管理员身份 } }); const drive = google.drive({ version: 'v3', auth }); // 计算7天前的时间戳(RFC3339格式) const sevenDaysAgo = moment().subtract(7, 'days').toISOString(); // 查询近7天内有权限变更的域内文件 const fileResponse = await drive.files.list({ corpora: 'domain', // 搜索整个域 q: `modifiedTime >= '${sevenDaysAgo}' and trashed = false`, fields: 'nextPageToken, files(id, name)', includeItemsFromAllDrives: true, supportsAllDrives: true, pageSize: 100 // 按需调整每页数量 }); const files = fileResponse.data.files || []; if (!files.length) { console.log('未找到近7天内有共享变更的文件'); return; } console.log('近7天内域内共享文件列表:'); console.log('文件名 | 共享日期 | 共享对象 | 共享者 | 角色'); console.log('--- | --- | --- | --- | ---'); // 遍历每个文件,查询其权限记录 for (const file of files) { const permResponse = await drive.permissions.list({ fileId: file.id, fields: 'permissions(id, emailAddress, role, grantedTime, grantedBy)', supportsAllDrives: true }); const permissions = permResponse.data.permissions || []; // 筛选近7天内添加的、域内用户的权限记录 const recentDomainPermissions = permissions.filter(perm => { return perm.grantedTime >= sevenDaysAgo && perm.emailAddress?.endsWith('@your-domain.com'); }); for (const perm of recentDomainPermissions) { // 格式化日期 const formattedDate = moment(perm.grantedTime).format('MM月DD日'); // 获取共享者信息(grantedBy可能是邮箱或用户ID,这里取邮箱) const sharedBy = perm.grantedBy?.emailAddress || '未知'; // 角色映射(可选,把API返回的role转成易读名称) const roleText = { owner: '所有者', organizer: '组织者', writer: '编辑者', commenter: '评论者', reader: '查看者' }[perm.role] || perm.role; console.log(`${file.name} | ${formattedDate} | ${perm.emailAddress} | ${sharedBy} | ${roleText}`); } } } catch (error) { console.error('获取文件列表失败:', error.message); if (error.response?.data) console.error('API错误详情:', error.response.data); } } listDomainSharedFiles();
注意事项
- 需安装
moment库处理日期:执行npm install moment - 替换
ADMIN_EMAIL为你的域管理员邮箱,@your-domain.com替换为公司域名 - 确保服务账号已在Google Workspace Admin Console中配置域范围授权,且添加了指定的scope
- 如果文件数量较多,需要处理分页(通过
nextPageToken循环查询)
内容的提问来源于stack exchange,提问作者Sagar1911
相关产品推荐
相关产品推荐

