【问题标题】:Google Spreadsheet - Show sheets depending on type of userGoogle 电子表格 - 根据用户类型显示表格
【发布时间】:2014-03-13 04:16:24
【问题描述】:

有没有办法让 Google 电子表格中的某个工作表可供某种类型的用户编辑和访问,而另一种类型的用户无法访问?

我目前有一个 Google App Script 项目,它允许某个用户使用 HTML 表单输入某些参数,并且会自动为他创建一个 Google 电子表格(因此,电子表格中的所有内容都是以编程方式创建的)。 这个新的电子表格应该可以被不同“类型”的用户访问。

用户的“类型”仅表示对电子表格具有特定权限的特定人员。

例如: 有些用户可以编辑电子表格中的任何内容。还有其他用户只能阅读(但不能编辑)。有些用户可以访问自定义菜单(允许他们执行与电子表格相关的特定操作),而其他用户则不能。

目前,我通过两种类型的用户解决了上述问题:

1) 由创建者授予对电子表格的“可以编辑”访问权限的用户。该用户可以编辑电子表格中的任何工作表,并访问每个自定义菜单(因为这些菜单是在“onOpen()”触发器中创建的,该触发器仅在用户具有“可以编辑”权限时执行)

2) 刚刚获得电子表格的“可以查看”公共链接的用户。该用户只能阅读电子表格的每张表格,但不能编辑任何表格。他也无法访问任何自定义菜单。

这工作了一段时间,但现在我有了新的要求,应该允许第一种类型的用户可以访问特定的工作表,而第二种类型的用户甚至不应该拥有对它们的读取权限。


有没有办法使用 Google 应用脚本或 Google 电子表格中的其他功能来实现这一点?

我知道工作表可以设置为可见或不可见,但这不会影响每个用户,即使是我希望能够查看和编辑它们的用户? 如果可能的话,我还想知道是否可以使用 Google App Script 以编程方式完成。

还有没有办法让更多功能仅限于不同类型的用户?如果我希望特定用户能够编辑某个工作表,但不能访问特定的自定义菜单怎么办?


如果不可能这样做,我能想到的唯一解决方案是为这些“受限功能”中的每一个创建单独的电子表格,并将该电子表格中的“可以编辑”访问权限授予我想要的每种类型的用户访问这些功能。 然而,理想情况下,一切都应该在一个电子表格中完成,因为我希望所有信息都包含在一个访问点中,而不是分散在不同的电子表格中,彼此之间(可能)关系不大。

谢谢

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    现在我有了新的要求,应该允许第一种类型的用户访问特定的工作表

    编辑者已经可以访问所有工作表。

    第二种类型的用户甚至不应该拥有对它们的读取权限。

    嗯,这将触发使用第二个电子表格来导入您只希望“可以查看”用户看到的数据/工作表的需求,或者您可以创建一个仅在以下情况下显示该数据的网络应用程序只想坚持使用 1 个电子表格(但仍然是 2 个网址)。

    我知道工作表可以设置为可见或不可见,但这不会影响每个用户,即使是我希望能够查看和编辑它们的用户?

    这很容易手动测试。让编辑器隐藏工作表,而查看器在另一个窗口中打开工作表。工作表将隐藏在两者上。

    我还想知道是否可以使用 Google App Script 以编程方式完成。

    是的 - SpreadsheetApp.getActiveSpreadsheet().getSheetByName(name).hideSheet()

    还有没有办法让更多功能仅限于不同类型的用户? 如果您将用户及其权限存储在某个位置,那么您可以根据他们的电子邮件控制运行哪些功能。

    function myfunction() {
      var validUsers = ['ex1@ex.com', 'ex2@ex.com'];
      if (validUsers.indexof(Session.getEffectiveUser().getEmail()) >= 0) {
        // continue
      }
    }
    

    如果我希望特定用户能够编辑某个工作表,但不能访问特定的自定义菜单怎么办?

    使用与上述相同的技术过滤掉应该能够在 onOpen() 中看到菜单的人。

    【讨论】:

    • 因此,如果不创建新的电子表格或创建网络应用程序,就无法阻止非编辑人员查看编辑人员可见的工作表吗?
    • “getEffectiveUser().getEmail()”技巧看起来很巧妙。什么时候可以使用有限制吗?我想我已经读过某些功能在知道执行它们的用户的情况下运行,而其他功能则不知道。例如,您可以在“onEdit()”触发器上使用它吗?
    • 即使有,观众也可以随时制作 ss 的副本,然后在他们自己的副本中取消隐藏任何隐藏的工作表以查看它们。使用 onEdit() 抛出 Logger.log() 以查看电子邮件是否通过
    • 一个疯狂的解决方法是在编辑需要时以编程方式将工作表移动到 ss 中,然后在您知道观众将要查看时将其删除。当编辑器工作表被移入时,一个函数可以移除查看器。
    • 在这种情况下,信息保存在哪里?如果有一个单元格放置我的薪水,当我必须“移动”工作表时,我如何以编程方式知道它具有哪个值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多