【问题标题】:Active VS Effective User for Google SheetsGoogle 表格的活跃用户 VS 有效用户
【发布时间】:2016-10-13 11:26:44
【问题描述】:

我正在编写一个简单的谷歌应用脚​​本应用程序,它执行一些数据操作取决于请求页面的用户。

根据google documentation object Session 有 getActiveUser() 和 getEffectiveUser() 我目前使用它们来确定用户。 看看代码:

var email = Session.getActiveUser().getEmail();
  switch (email){
    case 'test@gmail.com':
      /*Some code here*/
      return true;
    case 'test2@gmail.com':
      /*Some code here*/
      return true;
    default:
      return false;
  }

它看起来应该可以工作,但不幸的是它没有按预期工作(至少对我来说)。

上面的代码在 onOpen 触发器触发时运行,并且在用户第一次尝试运行此代码时设置所有权限。

所以,我决定进行跟踪,发现Session.getActiveUser().getEmail(); 和Session.getEffectiveUser().getEmail(); 为用户返回了错误的电子邮件。

对于创建脚本Session.getActiveUser().getEmail(); 的第一个用户(我)返回正确的电子邮件,但对于所有其他用户,它也会返回我的电子邮件。 好的,我决定用 Session.getEffectiveUser().getEmail(); 和 BOOM 替换 Session.getActiveUser().getEmail(); - 它适用于其他人,但不适用于我......

怎么可能?有什么想法吗?

  • 我注意到,当我从 ScriptEditor 运行代码时,代码对所有用户来说都是一种魅力,但是当它在 onOpen 触发时运行时,它的工作方式无法预测。

此电子表格与多人共享。

感谢任何帮助。

【问题讨论】:

  • 检查触发器restrictions 我相信这可能与此有关。简单的触发器在授权和获取运行它们的用户方面效果不佳
  • @Vytautas 非常感谢您的回复,但这是我在编写脚本时查看的第二个资源(页面)。此外,在我看来,我很确定所有要求都得到了满足(并且在撰写此评论时再次进行了重新检查)。
  • 两个问题:1. 您的所有用户都来自同一个 Google Apps for Business 域吗?如果是这样Session.getActiveUser().getEmail() 应该可以工作。如果不是,规范说它将返回一个空白字符串。 2.您是否考虑过使用event object?
  • @JoshDawson,1) 我刚刚创建了一个 google 表格文档,与我的朋友共享,实现了所有请求的逻辑并为这个确切的项目添加了一个触发器。所以在我看来,我没有业务域,对吗? 2)该规范告诉“用户对象,代表文档的所有者”,但我可以使用 Session 对象来确定正在处理触发器的用户电子邮件地址吗?
  • 我已经用项目的一个触发器替换了所有用户的所有触发器,并发现 Session.getActiveUser().getEmail() 对于那些使用这个的用户不起作用(空白)文档已共享并且对我来说工作正常(我的电子邮件被退回)..

标签: google-apps-script google-sheets


【解决方案1】:

简答

代码运行了错误的语句,因为没有中断语句来避免它们的执行,另一方面,对于消费者帐户 (gmail.com),getActiveUser 只会在脚本由活动用户运行时返回一个值1.

1:https://developers.google.com/apps-script/reference/base/session#getActiveUser()

说明

您应该在每个 case 语句的末尾添加break;,否则下一个语句也会被执行。相反,请考虑以下内容进行测试。

替代测试代码

function onOpen(){
  myFunction('On open - simple trigger');
}

function onOpenInstallable(){
  myFunction('On open - installable trigger');
}

function runFromScriptEditor(){
  myFunction('Run - script editor');
}

function myFunction(context) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange(lastRow + 1,1,1,4);
  var output = [[
    new Date(),
    context,
    Session.getActiveUser().getEmail(),
    Session.getEffectiveUser().getEmail()
    ]];
  range.setValues(output); 
}

结果

所有者:testA@gmail.com
编辑:testB@gmail.com

  • 在 testA@gmail.com 打开电子表格时添加了第 1 行和第 2 行
  • 在 testB@gmail.com 打开电子表格时添加了第 3 行和第 4 行
  • 通过单击 testB@gmail.com 的脚本编辑器的“运行”按钮触发 stript 时添加第 6 行
+---+------------+-------------------------------+-----------------+-----------------+
|   |     A      |               B               |        C        |        D        |
+---+------------+-------------------------------+-----------------+-----------------+
| 1 | Timestamp  | Context                       | Active User     | Effective User  |
| 2 | 10/29/2016 | On open - simple trigger      | testA@gmail.com | testA@gmail.com |
| 3 | 10/29/2016 | On open - installable trigger | testA@gmail.com | testA@gmail.com |
| 4 | 10/29/2016 | On open - simple trigger      |                 |                 |
| 5 | 10/29/2016 | On open - installable trigger |                 | testA@gmail.com |
| 6 | 10/29/2016 | Run - script editor           | testB@gmail.com | testB@gmail.com |
+---+------------+-------------------------------+-----------------+-----------------+

【讨论】:

  • 如果在 switch case 中使用 return 语句,则工作流将从第一个匹配的case返回我>。查看您的链接Switch,“案例的多重包容性标准”部分
  • 对于消费者账户 (gmail.com),getActiveUser 只会在脚本由活动用户运行时返回一个值 看来这就是答案
  • 对于可安装触发器,它只会显示安装该触发器的用户
猜你喜欢
  • 1970-01-01
  • 2015-02-25
  • 2020-01-17
  • 1970-01-01
  • 2019-01-09
  • 2013-02-27
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
相关资源
最近更新 更多