首页 > 解决方案 > 弹出只为文档所有者显示

问题描述

我有以下脚本,用于在打开文档时简单弹出。有没有办法让这个弹出窗口只显示给工作表所有者,而不是显示给与文档共享的所有其他人?

function onOpen() {
var ss=SpreadsheetApp.getActiveSpreadsheet();
var ui = SpreadsheetApp.getUi();
var Alert = ui.alert("TEXT HERE");
}

我的用例是只有我作为文档所有者才能看到的消息,我不希望其他任何具有共享权限的人(即客户)看到。

标签: google-apps-scriptgoogle-sheetspopup

解决方案


  • 您只想在所有者打开电子表格时打开对话框。
  • 当非所有者的共享用户打开电子表格时,您不想打开对话框。

如果我的理解是正确的,那么这个修改呢?

修改点:

在此修改中,它通过检索活动用户的电子邮件来知道所有者是否打开了电子表格。

  • 当所有者打开电子表格时,值为Session.getActiveUser().getEmail()所有者的电子邮件。
  • 当非所有者的用户打开电子表格时,没有Session.getActiveUser().getEmail()检索到值。

这是使用的。

修改后的脚本:

function onOpen() {
  var email = Session.getActiveUser().getEmail();
  if (email) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var ui = SpreadsheetApp.getUi();
    var Alert = ui.alert("TEXT HERE");
  }
}

笔记:

  • 在您的脚本的情况下,不需要将函数安装为 OnOpen 的可安装触发器。
  • 即使安装了 OnOpen 的可安装触发器,当用户打开电子表格时,也不会Session.getActiveUser().getEmail()检索到值。所以我觉得这个可以用。当时,Session.getActiveUser().getEmail()有所有者的电子邮件。

参考:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

编辑1:

如果所有用户都安装了触发器,Session.getEffectiveUser().getEmail()则返回该值。因此需要与注册用户的值进行比较。在这个示例脚本中,它假设如下。

  • "email1" 和 "email2" 的用户安装每个用户的 OnOpen 可安装触发器。

示例脚本:

var users = ["email1", "email2",,,]; // Please set emails of users who can open the dialog.
var email = Session.getEffectiveUser().getEmail();
if (users.indexOf(email) > -1) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ui = SpreadsheetApp.getUi();
  var Alert = ui.alert("TEXT HERE");
}

编辑2:

当我刚才由 3 个用户测试这种情况时,我注意到了新问题。

首先,假设如下。

  • 电子表格由所有者、用户 1 和用户 2 的 3 个用户共享和使用。
  • onOpen_sample(){}打开电子表格时运行函数。
  • 当所有者和用户 1 可以运行脚本并打开一个对话框时ui.alert("TEXT HERE")

在这种情况下,得到以下结果。

  1. 所有者安装onOpen_sample()为 OnOpen 的触发器。
    • Session.getActiveUser().getEmail()返回所有者的电子邮件。
    • Session.getEffectiveUser().getEmail()返回所有者的电子邮件。
  2. User1onOpen_sample()作为 OnOpen 的触发器安装。
    • Session.getActiveUser().getEmail()不返回任何值。
    • Session.getEffectiveUser().getEmail()返回 user1 的电子邮件。

这里,

  1. User2 不会onOpen_sample()作为 OnOpen 的触发器安装。
    • Session.getActiveUser().getEmail()不返回任何值。
    • Session.getEffectiveUser().getEmail()返回 user1 的电子邮件。
      • 这不是所有者的电子邮件。

此外,

  1. User2onOpen_sample()作为 OnOpen 的触发器安装。
    • Session.getActiveUser().getEmail()不返回任何值。
    • Session.getEffectiveUser().getEmail()返回所有者的电子邮件。
      • 这不是 user2 的电子邮件。

而且,当我多次安装 OnOpen 的触发器时,即使 user1 和 user2 安装了触发器,Session.getEffectiveUser().getEmail()也只能返回所有者的电子邮件。

通过这些,所有用户都可以运行脚本并打开对话框。我以为你的问题可能是这样的。我认为这可能是一个错误。所以我想将此报告给问题跟踪器。

从这种情况来看,在现阶段,发现了以下结果。

  1. 只有所有者可以运行脚本并打开对话框。
  2. 特定用户无法运行脚本并打开对话框。

很抱歉您的问题没有得到解决。如果我找到了解决方法,我想在这里报告。


推荐阅读