如何编写通用脚本将Team Drive文件复制到用户My Drive?
解决方案:动态获取多用户My Drive并复制文件
嘿,这个问题我刚好有经验,来给你梳理下可行的方案!你要实现的是把Team Drive里的文件动态复制到多用户的My Drive,核心难点就是怎么获取每个用户的My Drive根目录(不用静态URL),下面分两种场景给你具体代码和说明:
场景1:仅复制到当前用户的My Drive
如果只是给运行脚本的用户自己复制,那超级简单,直接用DriveApp.getRootFolder()就能获取当前用户的My Drive根目录,替换你代码里的???就行:
function saveAsSpreadsheet(){ var sheet = SpreadsheetApp.getActiveSpreadsheet(); var sourceFile = DriveApp.getFileById(sheet.getId()); // 用getUi().prompt替代旧的Browser.inputBox,兼容性更好 var prompt = SpreadsheetApp.getUi().prompt( 'Save File', 'Enter the name of the file', SpreadsheetApp.getUi().ButtonSet.OK_CANCEL ); if (prompt.getSelectedButton() === SpreadsheetApp.getUi().Button.CANCEL) return; var newName = prompt.getResponseText(); // 获取当前用户的My Drive根目录 var userMyDrive = DriveApp.getRootFolder(); sourceFile.makeCopy(newName, userMyDrive); }
场景2:批量复制到多用户的My Drive(Workspace管理员专属)
如果是要批量复制到域内多个用户的My Drive,你需要用到域范围授权(Domain-Wide Delegation),这是Google Workspace管理员才能用的功能,允许你模拟域内用户访问他们的Drive。步骤如下:
前置准备
- 在脚本编辑器中启用Drive API高级服务:点击「资源」→「高级Google服务」,找到Drive API并启用。
- 在Google Cloud控制台为你的脚本项目配置域范围授权,授予
https://www.googleapis.com/auth/drive权限(具体配置步骤可以参考Google官方文档)。
实现代码
function saveToMultipleUsersMyDrive() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var sourceFile = DriveApp.getFileById(sheet.getId()); // 这里可以手动定义目标用户邮箱,或者从表格中读取(比如sheet.getRange("A2:A10").getValues().flat()) var targetUserEmails = ['user1@yourdomain.com', 'user2@yourdomain.com']; var prompt = SpreadsheetApp.getUi().prompt( 'Save File', 'Enter the name of the file', SpreadsheetApp.getUi().ButtonSet.OK_CANCEL ); if (prompt.getSelectedButton() === SpreadsheetApp.getUi().Button.CANCEL) return; var newName = prompt.getResponseText(); // 遍历每个用户,复制文件到他们的My Drive targetUserEmails.forEach(function(userEmail) { try { // 模拟目标用户,获取他们的My Drive根文件夹ID var rootFolderInfo = Drive.Files.get('root', { supportsAllDrives: true, fields: 'id' }, { userEmail: userEmail // 关键:模拟域内用户访问 }); // 获取目标用户的My Drive根文件夹对象 var userMyDrive = DriveApp.getFolderById(rootFolderInfo.id); // 复制文件到该用户的My Drive var copyFile = sourceFile.makeCopy(newName, userMyDrive); Logger.log(`✅ 文件已复制到${userEmail}的My Drive,副本ID:${copyFile.getId()}`); } catch (error) { Logger.log(`❌ 复制到${userEmail}失败:${error.message}`); } }); }
关键注意事项
- 权限问题:源文件(Team Drive中的文件)需要设置允许域内用户访问,或者你作为管理员有足够权限复制该文件。
- 弃用提醒:旧的
Browser.inputBox已经被Google标记为弃用,建议用SpreadsheetApp.getUi().prompt()替代,避免后续脚本报错。 - 非管理员限制:如果你不是Workspace管理员,无法批量访问其他用户的My Drive,只能让每个用户自己运行脚本(对应场景1),或者通过OAuth授权让用户主动授予你访问他们Drive的权限(这种流程更复杂,适合Web应用场景)。
内容的提问来源于stack exchange,提问作者Adam Kowalski
相关产品推荐
相关产品推荐

