首页 > 解决方案 > 在 onOpen 中运行 showSidebar (Google Docs add on)

问题描述

我正在使用 Apps 脚本构建一个 Docs 插件,并从 onOpen() 中调用 showSidebar()。

当我查看日志时,它只是显示打印了很多次“错误”,并且没有打开侧边栏。是否可以从 onOpen() 函数中调用 showSidebar() ?

另外,我正在尝试使用 Session.getActiveUser().getEmail() 从 onOpen() 中记录用户的电子邮件,并看到它在那里没有任何价值。但它确实在 showSidebar() 中有一个值。

我猜我不了解 Apps Script 的许可,还有人知道吗?

标签: google-apps-scriptgoogle-docs

解决方案


基于Session.getActiveUser()

  • 如果安全策略不允许访问用户的身份,User.getEmail()返回一个空白字符串。

  • 用户的电子邮件地址在任何允许脚本在未经用户授权的情况下运行的上下文中均不可用,例如简单的 onOpen(e) 或 onEdit(e) 触发器、Google 表格中的自定义函数或部署为“执行为me”(即由开发者而非用户授权)

因此,您需要使用可以调用需要授权的服务的可安装触发器。


要手动创建可安装触发器:

在此处输入图像描述

示例配置:

在此处输入图像描述


示例代码:

代码.gs

function onOpen(e) {
  showSidebar();

  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  var email = e.user.getEmail();
  body.appendParagraph(email);
  body.appendParagraph(Session.getActiveUser().getEmail());

}

function showSidebar() {
  var html = HtmlService.createHtmlOutputFromFile('Page')
      .setTitle('My custom sidebar');
  DocumentApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
      .showSidebar(html);
}

function getActiveUser(){
  var email = Session.getActiveUser().getEmail(); 
  Logger.log(email);
  return email;
};
  • 我使用了 2 种不同的方法来获取活跃用户,1.) 使用onOpen() 事件对象 e.user.getEmail(),以及 2.) 使用Session.getActiveUser().getEmail().

  • 这两个选项都能够显示活动用户的电子邮件,如在电子邮件作为段落附加的文档中所见。

页面.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  </head>
  <body>
    
    <div id="rangeResult"></div>
    <script>
    function addRange(rangeStartEnd){ 
      $('#rangeResult').text(rangeStartEnd);
    };
    
    google.script.run.withSuccessHandler(addRange).getActiveUser();
    </script>    
  </body>
</html>

输出:

在此处输入图像描述


推荐阅读