使用Google Apps OAuth2库报错找不到authCallback回调函数如何解决?
修复方案
这个报错的核心原因是服务初始化逻辑放在全局作用域执行,回调触发时服务实例未被正确初始化、或全局逻辑执行异常导致回调函数无法被正常识别,按以下步骤修改即可:
步骤1:封装OAuth服务初始化逻辑为独立函数
把原本全局的服务配置逻辑挪到单独的函数中,避免全局执行异常:
function getOAuthService() { var clientId = "clientId"; var clientSecret = "clientSecret"; return OAuth2.createService("My") .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth') .setTokenUrl('https://accounts.google.com/o/oauth2/token') .setScope('https://www.googleapis.com/auth/androidpublisher') .setClientId(clientId) .setClientSecret(clientSecret) .setPropertyStore(PropertiesService.getUserProperties()) .setCallbackFunction('authCallback') .setParam('access_type', 'offline') .setParam('login_hint', Session.getActiveUser().getEmail()); }
步骤2:修改authCallback函数,内部主动获取服务实例
不要依赖全局的service变量,回调触发时主动初始化服务:
function authCallback(request) { var service = getOAuthService(); var isAuthorized = service.handleCallback(request); if(isAuthorized){ return HtmlService.createHtmlOutput('Success! You can close this tab.'); } else { return HtmlService.createHtmlOutput('Denied. You can close this tab'); } }
步骤3:把全局的权限判断逻辑封装到入口函数
删除全局作用域里直接执行的权限判断代码,放到你触发逻辑的入口函数中:
// 你自己的业务入口函数,手动执行或者从菜单触发 function runMyBusiness() { var service = getOAuthService(); if(!service.hasAccess()) { showSidebar(); }else{ console.log( "AccessToken: "+service.getAccessToken() ); // 这里放你的后续业务逻辑 } }
步骤4:调整showSidebar函数
function showSidebar(){ var service = getOAuthService(); var template = HtmlService.createTemplate( '<a href="<?= authorizationUrl ?>" target="_blank">Authorize</a>. ' + 'Reopen the sidebar when the authorization is complete.'); template.authorizationUrl = service.getAuthorizationUrl(); var page = template.evaluate(); SpreadsheetApp.getUi().showSidebar(page); }
额外排查点
- 确保
authCallback是顶层定义的函数,没有嵌套在其他函数内部,Apps Script只能调用顶层作用域的函数作为回调 - 代码修改保存后,先手动执行一次
runMyBusiness触发脚本本身的基础权限授权,避免脚本运行权限受限 - 确认Google Cloud控制台中配置的 OAuth 回调地址和脚本生成的一致,格式为
https://script.google.com/macros/d/你的脚本ID/usercallback
内容的提问来源于stack exchange,提问作者Style-7
相关产品推荐
相关产品推荐

