You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Google Workspace近7天域内共享的Drive文件及共享信息

问题解答

可以实现你的需求,不需要更换API,但需要调整服务账号的授权逻辑和API调用方式,核心是利用域范围授权模拟域管理员身份,并结合文件权限查询来获取所需信息。

关键调整点

  1. 模拟域管理员身份
    服务账号本身没有域内文件的访问权限,必须通过域范围授权模拟域内管理员的身份,才能查看整个域的文件。

  2. 正确配置API查询参数

    • 使用corpora: "domain"指定搜索整个域的文件
    • 构造q参数过滤近7天内有共享变更的文件
    • 调用permissions.list接口获取每个文件的共享详情,筛选域内用户的共享记录
  3. 权限范围确认
    确保服务账号的域范围授权已添加正确的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:03:10