【问题标题】:Can I somehow force onOpen trigger?我可以以某种方式强制 onOpen 触发器吗?
【发布时间】:2026-01-07 23:35:01
【问题描述】:

两天来,我一直在努力让我的组织中的用户仅使用我制作的脚本来编辑电子表格的受保护部分。

我经历过地狱,最终我是如何让它工作的,我制作了一个假的隐藏表来存储数据,然后在打开时,我将该数据复制粘贴到用户看到的表中(他们无法编辑)。如果可能的话,我想让用户体验更好一点,我希望有一种方法可以强制脚本中的 onOpen 触发器。我知道我可能没有做对,但我不能花更多时间研究,所以我现在需要暴力破解。 (我试过 onChange 触发器,我试过在我的 web 应用中设置权限,使用 doPost,我的大脑很痛,这是我第一次编写脚本)。

TL;DR 有没有办法从脚本编辑器刷新整个选项卡?我需要触发 onOpen 事件,而无需用户重新加载页面。

【问题讨论】:

  • 听起来您对隐藏工作表进行了一些更改,现在想要确保所有用户在他们正在查看的可见工作表中看到相同的内容。您掌握 Google 表格的实时性了吗?您不需要“在每个用户的计算机上”更改电子表格。这都是共享的。如果您为一位用户更改电子表格,则每个人的电子表格都会更改。
  • 我不确定我是否理解正确,所以我会进一步解释我的情况,希望这能让我更接近理解 :) 我建立的表格是一个用户数据库:一些个人数据,以及一些计算字段。我是工作表所有者,其他人都是编辑。我创建了一些按钮来帮助他们添加和删除用户,但我希望这些按钮成为他们编辑数据库的唯一方式。我已经保护了他们看到的工作表,这导致了两天的权限争夺战。如果用户不能编辑范围,他们运行的脚本也不能。这有意义吗?
  • 你的问题是关于如何触发onOpen(e)运行。 @Rubén 已经回答了这个问题。目前尚不清楚问题是否真的与您需要解决的问题有关,还是与您一直在研究的解决方案有关,假设它会有所帮助。在我看来,问题实际上是关于管理范围保护。见What is the XY problem?
  • 你对我最初的问题完全正确,我应该更准确。我需要一个直接的解决方案来稍微改进当前的解决方案并准备好发布。我决定采用愚蠢的解决方案,因为我的时间不多,但我完全清楚我是如何做到这一点的,而不是应该这样做。这就是为什么我试图在这两个主题上获得尽可能多的意见。所以是的,@Rubén 已经回答了我的主要问题(急需帮助的呼声),至于主要问题 (X),我认为我必须了解更多信息,然后从头开始构建整个事情。

标签: google-apps-script google-sheets triggers


【解决方案1】:

要“强制” onOpen 简单触发器,您有以下选项

  • 调用打开
    function respondToChange(e){
      onOpen();
    }
    
    如果您的 onOpen 函数需要事件对象,则必须模拟它。
    function respondToChange(e){
      const event = {};
      // add the required properties to event
      onOpen(event);
    }
    
  • 使用setSpreadsheetLocale 更改电子表格区域设置

相关

【讨论】:

    【解决方案2】:

    当通过单击按钮或选择自定义菜单项或通过simple trigger(例如onOpen(e)onEdit(e))运行函数时,它在键盘上用户的帐户下运行。

    要触发函数在另一个有权访问受保护范围的帐户下运行,您需要一个installable trigger

    【讨论】:

    • 您好!感谢你的回复。我尝试这样做并且触发器正在工作(我什至设法正确过滤事件,并在它们发生时立即删除不必要的触发器),但是,当我尝试运行将触发 onChange 事件的脚本时不是我的帐户,它不会运行脚本。此时,我正在向 appsscript.json 添加各种权限,经过数小时的尝试,我无法再继续尝试了。我确定我缺少一些小东西,但似乎无法弄清楚它是什么。
    最近更新 更多