正在运行showModalDialog(),即使它的if()门未被评估为true

时间:2016-08-03 03:24:09

标签: google-apps-script authorization

我有一个必须完全在App Script中运行的程序(使用它的用户在他们的计算机上没有安装权限用于插件)。该程序根据引号中的信息制作商业报价和其他一些东西。

我需要复制引号以保存它们,然后授权代码在这些副本上运行,这样如果需要进行更改,它们就可以。

function onOpen(e) {
  var authInfo = ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL);
  var authStatus = authInfo.getAuthorizationStatus();
  var authRequired = (authStatus == ScriptApp.AuthorizationStatus.REQUIRED);

  Logger.log(authStatus);
  Logger.log(authRequired);

  if ( authRequired ) {
    Logger.log('Authorization required');
    var authScript = '<script type="text/javascript">'+
                       'function openAuthWindow() {'+
                         'window.open("'+authInfo.getAuthorizationUrl()+'");'+
                       '}'+
                     '</script>';
    var alert = HtmlService.createHtmlOutputFromFile('sidebarHeadOpen')
        .append(HtmlService.createHtmlOutput(authScript).getContent())
        .append(HtmlService.createHtmlOutputFromFile('authorizeAlert').getContent());
    SpreadsheetApp.getUi().showModalDialog(alert, 'Authorization Required');
  } else {
    var frontend = e.source;
    initialize(frontend);
  }
}

我的问题是&#34; if(authRequired){...}&#34;仍然在运行,即使它不应该运行。 (即当authStatus为NOT_REQUIRED并且authRequired为false时)更重要的是,虽然日志应显示&#34;需要授权&#34;当该代码运行时,它不会。从该语句中运行的唯一行是&#34; var authScript = ...;&#34; line,&#34; var alert = ...;&#34; line,&#34; SpreadsheetApp.getUi()。showModalDialog();&#34;线。这是我试图让发生的事情。有没有办法做到这一点?

供参考,这就是alert.html的样子:

<html>
  <head>
    <base target="_top">
    <script type="text/javascript">
      function openAuthWindow() {
      window.open("'+authInfo.getAuthorizationUrl()+'");
      }
    </script>
  </head>
  <body>
    Please authorize this copy of the form to run.<br>
    <br>
    Without authorization, it will not do anything automatically.<br>
    <br>
    <input type="button" value="Review Permissions" onclick="google.script.host.close(); openAuthWindow(); google.script.run.runInstall();" />
  </body>
</html>

(另外,是否有一种更简单的方式来提示授权?甚至可以通过编程方式获取授权而不提示用户?我一直在寻找一周,而且还没找到一个。 )

1 个答案:

答案 0 :(得分:0)

我发现此相关的issue 677 - Allow end users to provide OAuth credentials发布在google-apps-script-issues中,并且基于该主题有一些解决方法,您也可以尝试,其中一个发布在GitHub中 - OAuthService for Google Apps Script其中开发人员包装oAuth在库中流动,您也可以将其添加到自己的脚本中。

此SO帖子中提供的解决方案 - Google API Authorization when 'Executing the app as me.'有关谷歌应用脚​​本内授权的解决方案也可能有所帮助。