G Suite Admin SDK删除用户后转移数据的Google脚本开发问题
需求说明
开发Google Apps Script脚本,通过G Suite Admin SDK实现:删除指定用户账户前,将被删用户的数据转移至指定邮箱(例:md@org.com)。目前公开可参考的删除谷歌邮箱账户时同步转移用户数据的脚本资料较少,对应管理后台操作界面如下:
现有已完成代码仅实现了基础用户删除逻辑,缺失数据转移相关实现,原有代码如下:
function onFormSubmit(e) { deleteUsers(e); } function deleteUsers() { var ss = SpreadsheetApp.openById('1Z0cNwh2BJLrq1bMQS3eU1tWLrjz2DLUne8CY3rMM7OE'); var sheet = ss.getSheetByName('Delete Users'); var data = sheet.getDataRange().getValues(); var len = data.length; for(var i=1; i<len; i++){ var user = data[i][0]; var transferToEmail = data["Transfer to Email"][1]; Logger.log(user); //use try catch in case a user is already removed try{ AdminDirectory.Users.remove(user); } catch(err){} } }
实现方案
核心注意点
数据转移操作必须在执行用户删除操作前触发:用户一旦被删除,数据会进入20天软删除期,无法直接触发自动数据转移流程。数据转移请求提交后为后台异步执行,不需要等待转移完成再删除用户。
前置准备
- 打开Apps Script编辑器,在左侧「服务」菜单中添加Admin SDK服务,确保已开通
Admin Directory API和Data Transfer API的访问权限 - 运行脚本的账号需要拥有G Suite超级管理员权限,或持有用户删除、数据转移的对应管理权限
- 修复原有代码的取值错误:
sheet.getDataRange().getValues()返回的是二维数组,不支持data["Transfer to Email"][1]的对象式取值,需要先匹配表头索引取对应值,或直接配置固定的转移目标邮箱。
完整可用代码
// 配置固定的转移目标邮箱,可根据实际需求修改 const DEFAULT_TRANSFER_TARGET = 'md@org.com'; // 配置需要转移的应用列表,常用应用ID:gmail(邮件)、drive(云端硬盘)、calendar(日历)、contacts(联系人) const TRANSFER_APPS = ['gmail', 'drive', 'calendar', 'contacts']; function onFormSubmit(e) { deleteUsers(e); } /** * 创建用户数据转移请求 * @param {string} sourceUser 原用户邮箱 * @param {string} targetUser 数据接收目标邮箱 * @returns {object} 转移请求创建结果 */ function createDataTransfer(sourceUser, targetUser) { // 组装转移应用参数 const applicationDataTransfers = TRANSFER_APPS.map(appId => { return { applicationId: appId, applicationTransferParams: [{ key: 'PRIVACY_LEVEL', value: ['PRIVATE', 'SHARED'] // 转移私有和共享的所有数据 }] } }); const transferRequest = { oldOwnerUserId: sourceUser, newOwnerUserId: targetUser, applicationDataTransfers: applicationDataTransfers }; return AdminDataTransfers.Transfers.insert(transferRequest); } function deleteUsers() { const ss = SpreadsheetApp.openById('1Z0cNwh2BJLrq1bMQS3eU1tWLrjz2DLUne8CY3rMM7OE'); const sheet = ss.getSheetByName('Delete Users'); const data = sheet.getDataRange().getValues(); const dataLen = data.length; // 如需从表格读取目标邮箱,可打开下方代码匹配表头列 // const header = data[0]; // const targetColIndex = header.indexOf('Transfer to Email'); for (let i = 1; i < dataLen; i++) { const userEmail = data[i][0]; // 从表格取目标邮箱写法:const transferToEmail = data[i][targetColIndex]; const transferToEmail = DEFAULT_TRANSFER_TARGET; if (!userEmail) continue; Logger.log(`处理用户:${userEmail},数据将转移至:${transferToEmail}`); try { // 先提交数据转移请求 const transferRes = createDataTransfer(userEmail, transferToEmail); Logger.log(`用户${userEmail}数据转移请求已提交,转移ID:${transferRes.id}`); // 转移请求提交成功后再删除用户 AdminDirectory.Users.remove(userEmail); Logger.log(`用户${userEmail}已删除`); } catch (err) { Logger.log(`处理用户${userEmail}出错:${err.message}`); } } }
补充说明
- 数据转移为后台异步执行,提交请求后可在G Suite管理控制台的「数据转移」页面查看实时进度,单用户数据量较大时转移可能需要数小时
- 提交转移请求前请确认目标邮箱有足够的存储空间承接转移数据
- Drive文件所有权转移完成后,目标用户将自动成为原用户所有私有、共享云端文件的新所有者
内容的提问来源于stack exchange,提问作者Naveen
相关产品推荐
相关产品推荐

