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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:43:08