Google AppScript调用Gmail API查询域内用户自动回复提示授权被拒怎么办
问题原因
Delegation denied报错本质是权限不足问题:默认情况下Google Workspace普通用户仅拥有自身Gmail配置的访问权限,只能通过'me'参数查询自己的自动回复设置,没有权限访问同域其他用户的Gmail隐私配置,跨用户查询会被Google的权限拦截机制直接拒绝。
解决步骤
需要由Google Workspace域管理员完成全域权限委托配置后才可实现同域其他用户的Gmail配置查询,操作流程如下:
- 确认你拥有Google Workspace域管理员权限,或可以协调域管理员完成相关配置
- 找到当前AppScript脚本关联的GCP项目:在AppScript编辑器的「项目设置」页点击「Google Cloud 平台项目」链接即可进入对应项目
- 在GCP项目中启用Gmail API:进入「API和服务」-「启用API和服务」,搜索Gmail API并完成启用
- 配置服务账号与全域授权:
- 在GCP项目「API和服务」-「凭据」页面创建服务账号,生成并下载JSON格式的密钥文件,记录服务账号邮箱、私钥、客户端ID信息
- 进入Google Workspace管理后台,依次打开「安全」-「访问和数据控制」-「API控制」-「全域委派」
- 点击添加新的委托,填入上述服务账号的客户端ID,在OAuth权限范围栏填入
https://www.googleapis.com/auth/gmail.settings.basic后保存
- 修改AppScript代码,使用服务账号模拟目标用户身份调用Gmail API,参考代码如下:
// 引入OAuth2库(需先在AppScript库中添加脚本ID:1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF) function getOAuthToken(targetUserEmail) { const service = OAuth2.createService('gmail_delegation') .setTokenUrl('https://oauth2.googleapis.com/token') .setPrivateKey('替换为你服务账号的私钥') .setIssuer('替换为你服务账号的邮箱地址') .setSubject(targetUserEmail) .setScope('https://www.googleapis.com/auth/gmail.settings.basic') return service.getAccessToken() } function checkOtherUserVacation(targetUserEmail) { const accessToken = getOAuthToken(targetUserEmail) const apiUrl = `https://gmail.googleapis.com/gmail/v1/users/${targetUserEmail}/settings/vacation` const requestParams = { headers: { Authorization: `Bearer ${accessToken}` }, method: 'get', muteHttpExceptions: true } const response = UrlFetchApp.fetch(apiUrl, requestParams) Logger.log(JSON.parse(response.getContentText())) }
- 注意:该方案仅支持查询同Google Workspace域内用户的配置,无法查询域外普通Gmail账号的信息
内容的提问来源于stack exchange,提问作者Kastel
相关产品推荐
相关产品推荐

