如何通过SheetID批量撤销第三方应用与服务的访问权限?
解决方法:通过Sheet ID批量撤销第三方应用访问权限
你当前的代码核心问题是用错了API:ScriptApp.invalidateAuth()是撤销当前脚本自身的所有授权,和你要撤销第三方应用对特定Sheet的权限完全无关,而且代码里根本没把sheetId关联到实际的权限操作上。
要实现批量撤销第三方应用对指定Sheet的访问权限,需要通过Drive API操作文件的权限列表,筛选并删除第三方应用的权限条目,具体代码如下:
function revokeThirdPartyAccessForSheets() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const revokeSheet = ss.getSheetByName('REVOKE'); // 提取Sheet ID列表并过滤空值 const sheetIds = revokeSheet.getRange('B2:B' + revokeSheet.getLastRow()) .getValues() .flat() .filter(id => id); sheetIds.forEach(sheetId => { try { // 获取目标Sheet对应的Drive文件 const targetFile = DriveApp.getFileById(sheetId); // 获取文件的所有权限条目 const allPermissions = targetFile.getPermissions(); // 筛选第三方应用权限(OAuth客户端或服务账号类型) const thirdPartyPerms = allPermissions.filter(perm => { const permType = perm.getPermissionType(); return permType === DriveApp.PermissionType.OAUTH_CLIENT || permType === DriveApp.PermissionType.SERVICE_ACCOUNT; }); if (thirdPartyPerms.length === 0) { Logger.log(`Sheet ID ${sheetId} 无第三方应用权限记录`); return; } // 批量删除第三方应用权限 thirdPartyPerms.forEach(perm => { targetFile.removePermission(perm.getId()); const permName = perm.getEmail() || perm.getName(); Logger.log(`已撤销Sheet ID ${sheetId} 的第三方应用权限:${permName}`); }); } catch (error) { Logger.log(`处理Sheet ID ${sheetId} 失败:${error.message}`); } }); }
关键说明:
- 先通过
DriveApp.getFileById(sheetId)获取目标Sheet对应的Drive文件(Spreadsheet本质是Drive中的文件)。 - 用
getPermissions()拉取文件的所有权限条目,筛选出OAUTH_CLIENT或SERVICE_ACCOUNT类型的权限——这些就是第三方应用的授权记录。 - 调用
removePermission(perm.getId())删除对应的权限条目。 - 如果需要针对特定第三方应用撤销,可以在筛选时增加
perm.getEmail()或perm.getName()的判断条件。
内容的提问来源于stack exchange,提问作者Bruno Carvalho
相关产品推荐
相关产品推荐

