强制要求授权onOpen()(强制弹出)

时间:2017-07-03 19:46:27

标签: google-apps-script permissions google-sheets authorization

摘要:是否可以请求授权onOpen()?

详细版本: 我有一个带有按钮的电子表格,可以分发给很多人。 当按下任何按钮时,会调用一些需要权限的功能,因此Google Apps脚本会显示此弹出窗口:

enter image description here

在接受此项后,一切运行良好,因为它现在已获得授权。但是,我希望在打开工作簿时按下按钮之前运行需要权限的内容。但是,如果将需要授权的代码放入onEdit或onOpen函数,则默认情况下它运行时没有任何权限,并且会中途崩溃,而不是显示弹出窗口并要求权限。

以下是一些代码示例:崩溃而不是要求创建触发器的权限(也适用于CalendarApp等):

function onOpen(e) {
  Browser.msgBox("This is shown to the user");
  try {
    ScriptApp.newTrigger('someFunction').forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet()).onEdit().create();
  }
  catch (e) {
    Browser.msgBox(e);
  }
  Browser.msgBox("This message is never shown to the user if there is no try catch because it crashes");
}

2 个答案:

答案 0 :(得分:4)

注意:简单的触发器无法访问需要授权的服务。例如,简单的触发器无法发送电子邮件,因为Gmail服务需要授权

onOpen()是函数的保留函数名,是一个简单的触发器。

有一种方法可以检查授权状态,然后在需要授权代码时获取授权URL。但是,如果ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL)方法需要用户授权,那么从onOpen()

运行时它就无法工作

Code.gs

function onOpen() {
  // EDIT: (TODO: Here it may be nice to check ScriptApp.AuthMode or equivalent
  // to see if it already acquired permissions so the sidebar
  // does not popup every time the SpreadSheet is opened)
  showSidebar();
}

function showSidebar() {
  var html = HtmlService.createTemplateFromFile('HTML_Sidebar').evaluate()
      .setTitle('Log Tools')
      .setWidth(300);
  SpreadsheetApp.getUi() 
      .showSidebar(html);
}

HTML_Sidebar

<!DOCTYPE html>
<html>
  <head>
    <base target="_blank">
  </head>
  <body>

    <div><?!= getAuthUrl(); ?></div>
  </body>

</html>

GS_Sidebar

function getAuthUrl() {
  var authInfo,msg;

  authInfo = ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL);

  msg = 'This spreadsheet needs permission to use Apps Script Services.  Click ' +
    'this url to authorize: <br><br>' + 
      '<a href="' + authInfo.getAuthorizationUrl() +
      '">Link to Authorization Dialog</a>' +      
      '<br><br> This spreadsheet needs to either ' +
      'be authorized or re-authorized.';

  //return msg;//Use this for testing

  //ScriptApp.AuthMode.FULL is the auth mode to check for since no other authorization mode requires
  //that users grant authorization
  if (authInfo.getAuthorizationStatus() === ScriptApp.AuthorizationStatus.REQUIRED) {
    return msg;
  } else {
    return "No Authorization needed";
  }
}

答案 1 :(得分:1)

如今,由于Google进行了一些政策更改(现在阻止该脚本通过使用诸如onOpen的简单触发器来自动打开UI元素),因此并非总是可以强制在onOpen上强制要求授权。

电子表格的所有者可以这样做,但编辑者不能。

my answer(将近一岁,到目前为止已获得0票)到onOpen not executing?

  

简单的触发器打开功能无法打开侧边栏,因为它在   AuthMode.LIMITED。您应该使用运行在   Auth.Mode.FULL打开侧边栏,例如可安装的触发器。

     

我知道这与附加组件无关,但以下引用适用

     

来自   https://developers.google.com/apps-script/add-ons/lifecycle#authorization_modes

     
    

注意:在AuthMode.LIMITED中执行时,加载项无法打开边栏或对话框。您可以使用菜单项打开侧边栏和对话框     因为它们在AuthMode.FULL中运行。

  
     

规范参考