在AuthorizationAction完成后,GMail Add-On不会重新加载

Con*_*ann 5 google-apps-script gmail-addons

我有一个GMail AddOn,它使用OAuth2来授权外部服务.启动AddOn时,我通过调用检查用户是否已经拥有访问令牌oauthService.hasAccess().如果用户没有令牌,那么我将显示一张卡片,上面写着"您需要授权该服务".

该卡包含如下构建的链接:

section.addWidget(CardService.newTextButton()
      .setText("Authorize MyService")
      .setAuthorizationAction(
        CardService.newAuthorizationAction()
          .setAuthorizationUrl(authorizationUrl)
      ));
Run Code Online (Sandbox Code Playgroud)

当用户单击"授权MyService"按钮时,会出现一个弹出窗口,并且旧卡片中会出现一个微调器.然后用户登录MyService,授权访问,并AuthorizeCallback使用令牌调用我的.我存储令牌,并返回一个只关闭自己的HtmlPage.

原卡中的微调器停止旋转.但是,AddOn不会重新加载.这表明在授权完成时存在阻止AuthorizationAction卡重新加载的内容.有什么建议吗?

我希望AddOn重新加载,因为入口点函数将发现现在oauthService.hasAccess()返回true,然后将显示正常的"您被授权"卡(并开始处理电子邮件到MyService).

谢谢你的帮助!

AKT*_*AKT 1

可能有更好的方法来做到这一点,但这就是我解决它的方法。

首先,不要使用setAuthorizationActionuse setOnClickAction并设置函数名称。

section.addWidget(CardService.newTextButton()
.setText("Authorize MyService")
.setOnClickAction(CardService.newAction().setFunctionName('loginAction'));
Run Code Online (Sandbox Code Playgroud)

loginFunction将返回一个ActionResponse. 它将有一个NavigationOpenLink与之关联。

function loginAction(){
    var nav = CardService.newNavigation().pushCard(getLoginStepsCard());
    return CardService.newActionResponseBuilder()
        .setStateChanged(true)
        .setNavigation(nav)
        .setOpenLink(
            CardService.newOpenLink().setUrl(getLoginUrl()  
        )
        .setOnClose(CardService.OnClose.RELOAD_ADD_ON)
        .setOpenAs(CardService.OpenAs.OVERLAY)).build();
}
Run Code Online (Sandbox Code Playgroud)

这将打开登录弹出窗口。getLoginUrl将返回 OAuth 登录 URL。getLoginStepsCard将返回一张包含一些信息的卡片。就我而言,我显示了登录所需的步骤,显示您想要的任何内容。

在授权回调函数中,保存您的令牌并且不要立即关闭弹出窗口。在我测试(使用HEAD)时关闭弹出窗口有效,但它不适用于版本化部署。问题是PropertiesService保存令牌需要几秒钟的时间。只需等待几秒钟(我使用setTimeout5 秒)并关闭弹出窗口或要求用户关闭它。附加组件将重新加载,PropertiesService 将拥有您的令牌。

我希望这有帮助。它对我有用,我已经发布了我的插件;)