【问题标题】:How to get triggers to work in a copied spreadsheet + script?如何让触发器在复制的电子表格 + 脚本中工作?
【发布时间】:2016-11-29 10:06:38
【问题描述】:

我目前正在创建一个电子表格,用户可以在其中输入商品编号,该表格将在接下来的两列中返回描述和价格。

电子表格从另一个工作表(不是另一个页面,而是一个完全不同的 URL)中提取项目信息,并且每次输入项目编号时工作表都会自行更新(没有 vlookup,因为信息在另一个 URL 上)。

很可能会有多人同时需要此表格,而且他们还需要一份副本以作为参考记录。他们都可以访问我拥有的“主文件”,我希望他们可以简单地复制一份然后填写表格。

但是,虽然我脚本中的代码在主文件上运行良好,但当他们复制时,程序将无法运行。我知道这与未复制触发器有关,并且我已经阅读了在脚本中编写触发器的内容,但这就是问题所在。

用户看不到脚本——也就是说,我们不希望他们看到任何代码。所以他们不能进去,通过“资源”打开触发器或者在脚本编辑器中点击运行/调试。

所以基本上我需要一个用户能够打开一个共享的、仅查看的文件、制作电子表格的副本(它从另一个工作表获取信息并具有触发器),并使用该电子表格购买输入项目编号。这些人中的大多数应该是看不到内部运作的,而且无论如何也不会明白其中的任何一个。

我在想一个可能的解决方案就像他们在 25:56 或 37:355 左右在this video 所做的那样,他们可以按下按钮并写入触发器。不过,他们并没有讨论如何去做。

【问题讨论】:

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


    【解决方案1】:

    如果您的用户都在私有域中,您最好的解决方案是publish a private add-on(即仅对域用户可用)。如果您使用的是消费者帐户,则不能这样做。

    或者,您可以使用菜单驱动的功能以编程方式创建您需要的触发器。这对您的情况有效,因为:

    • “原始”电子表格以只读方式共享,用户需要制作个人副本以输入自己的数据。
    • 用户将是其副本的所有者,因此包含的脚本将作为他们运行并为他们运行。

    例如,您可以尝试this shared spreadsheet。它是公开共享的,只读的,但如果您保存副本,您将看到一个自定义菜单,该菜单设置触发功能,并更新电子表格中的第一个单元格。晚了十秒,触发函数再次更新。

    演示脚本包含在电子表格中,因此您可以在那里亲自查看。全部内容如下:

    // Create a menu that will initialize the trigger
    function onOpen() {
      var ui = SpreadsheetApp.getUi();
      ui.createMenu('Custom Menu')
          .addItem('Initialize spreadsheet', 'setTrigger')
          .addToUi();
    }
    
    function setTrigger() {
      // clear any existing triggers
      var triggers = ScriptApp.getUserTriggers(SpreadsheetApp.getActive())
      for (var i=0; i<triggers.length; i++) {
        ScriptApp.deleteTrigger(triggers[i]);
      }
    
      // set new trigger
      ScriptApp.newTrigger("runTrigger")
               .timeBased()
               .after(10*1000)    // 10s delay
               .create();
      announce("Trigger set. Wait for it...");
    }
    
    function runTrigger() {
      announce("Trigger fired! This completes our demo.");
    }
    
    // Update first cell in spreadsheet
    function announce(message) {
      var range = SpreadsheetApp.getActive().getSheets()[0].getRange("A1");
      range.setValue(message);
    }
    

    您可以包含“按钮”图像,而不是菜单,并将脚本链接到该图像。我没有看视频,但他们可能就是这样做的。你可以在How do you add UI inside cells in a google spreadsheet using app script?中看到更多关于这个(愚蠢的,恕我直言)选项的信息

    【讨论】:

    • 当您说私有域时,您是指公司的 g-mail 帐户,这样您就可以选择“公司内部”的帐户只能查看、访问、编辑等。另外,我制作了文件的副本,直到我进入选项卡并运行每个函数,脚本才运行。老实说,按钮的想法实际上似乎最吸引人。与我一起工作的人的编码知识几乎为零,有时在做简单的表格公式时会绊倒。我认为这实际上会给他们留下深刻印象。
    • 是的,我使用“私有域”来表示任何 Google Apps 域(商业、教育、非营利)。在复制的电子表格中,菜单会在打开工作表几秒钟后显示。选择菜单的一个选项将启动一个授权对话框,之后触发器将运行。
    • 感谢您的澄清!不幸的是,您链接的示例表不起作用。我做了一个副本,脚本不会触发。我可以看到它在顶部显示“正在工作...”,但工作表中没有变化。
    • 没关系!我明白你现在的意思 Mogsdad,非常感谢!
    【解决方案2】:

    据我了解,您在这里不需要脚本,电子表格公式就可以解决问题。
    要将数据从一个电子表格导入另一个电子表格,您可以使用公式“importData”并将这些数据放入隐藏表中。 然后您可以在此导入上使用“vlookup”公式,甚至可以使用更好的“过滤器”公式(尝试使用您会喜欢的过滤器公式)。

    【讨论】:

    • 嘿哈罗德,首先我感谢您的回复!其次,我希望我能将其限制在表格公式中,但由于商品价格的计算方式和安全问题,由于几个原因,这是不可能的。首先,为解决商品价格问题采取了许多步骤 - 有州税、商品特定税、商品条款等。其次,用户需要能够编辑工作表,我主要担心有人会注意到一个隐藏的工作表,取消隐藏它,然后就可以知道信息了。
    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多