如何让触发器在复制的电子表格+脚本中工作

How to get triggers to work in a copied spreadsheet + script?

本文关键字:电子表格 脚本 工作 复制 触发器      更新时间:2023-09-26

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

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

最有可能的是,多个人同时需要这份表格,他们还需要一份副本作为参考记录。他们都可以访问我拥有的"主文件",我希望他们可以简单地复制一份,然后填写表格。

然而,虽然我的脚本中的代码在主文件上运行得很好,但当它们复制时,程序将不会运行。我知道这与触发器没有被复制有关,我已经阅读了在脚本中编写触发器的内容,但问题是这样的。

用户看不到脚本,也就是说,我们不希望他们看到任何代码。因此,他们无法进入,无法通过"资源"打开触发器,也无法在脚本编辑器中单击运行/调试。

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

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

如果您的用户都在一个私有域中,那么最好的解决方案是发布一个私有插件(即仅对域用户可用)。如果您使用的是消费者帐户,则不能使用此选项。

或者,您可以使用菜单驱动的函数以编程方式创建所需的触发器。这在您的情况下是有效的,因为:

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

例如,您可以尝试使用此共享电子表格。它是共享的公共、只读的,但如果保存副本,您将看到一个自定义菜单,它设置了一个触发函数,并更新了电子表格中的第一个单元格。10秒后,触发器功能再次更新。

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

// 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);
}

您可以包含一个"按钮"图像,并将脚本链接到该图像,而不是菜单。我没有看视频,但他们可能就是这么做的。你可以在"如何使用应用程序脚本在谷歌电子表格的单元格内添加UI"中看到更多关于这个(愚蠢的,imho)选项的信息?

据我所知,这里不需要脚本,电子表格公式就可以了
要将数据从一个电子表格导入到另一个,可以使用公式"importData"并将这些数据放入隐藏表中。然后你可以在这个导入中使用"vlookup"公式,或者更好的"filter"公式(试试你会喜欢的filter公式)。