0

我正在尝试使用发布/订阅模式来帮助我在 GAS 环境中构建更复杂的应用程序。

由于现在可以以编程方式安装触发器,因此我希望能够在触发事件时在侦听器中检索安装特定触发器的电子表格 ID:

function setTrigger(){
  var triggerBuilder = ScriptApp.newTrigger("listen"),
      onEditTrigger = triggerBuilder.forSpreadsheet('some-id').onEdit().create();
}

function listen(e){
  var ssId = e['range'].getSheet().getParent().getId(); //ssId = 'some-id'

}

ssId 实际上是 setTrigger() 所在的电子表格的 id:不是很有用。

也许我在深夜想像力不足,但我看不到实现这个非常有用的模式的方法(100 个创建的电子表格,一个侦听器,所有这些电子表格共有的一组操作,但无法与特定的调用者,因为它无法被识别)。

任何帮助或评论将不胜感激。

4

3 回答 3

2

好吧,也许这个问题是一个真正的“堆栈溢出”,有点超出预期。

我同样成功地检索了调用电子表格:

A)创建一个查找表,我在其中跟踪特定事件的回调函数;

B) 在创建事件的脚本中,编写一个函数,将前一张表中索引的每个函数都安装在“this”中。

现在,每当触发事件时,都会调用安装触发器的脚本,并将所有参数/属性放入侦听器中。

它解决了 GAS 的一个主要缺陷:如果我以编程方式在特定工作表上安装触发器,我如何检索该调用工作表?此外,我现在可以在删除该工作表或决定停止从该工作表接收事件时,以编程方式删除与特定工作表关联的触发器。

感谢两位海报的回答。

于 2012-06-17T17:13:01.640 回答
0

对于 range 参数返回不正确的父工作表的问题存在一个未解决的问题。您可以对该问题加注星标以获取更新。

于 2012-06-18T18:07:23.703 回答
0

有趣。未测试,因为我是脚本处理程序的新手,我无法让您的脚本记录 ssID。每个事件都有一个源属性,它只是触发器的电子表格源。我从文档中提取了这段代码:

触发器源:当触发器正在侦听的事件发生时执行触发器。每个触发器都与可以使用 Trigger.getEventType() 获取的 EventType 相关联。例如,EventType 可以是 CLOCK,表示它是基于时间的触发器,或 ON_OPEN,表示它是在打开电子表格时执行的触发器。但是,每个事件也有一个来源。例如,电子表格中的 OnEdit 事件必须有源。可以使用 Trigger.getTriggerSource() 获取此源,其值由 ScriptApp.TriggerSource 中的枚举表示。

https://developers.google.com/apps-script/guide_events

function onEdit(event)
{
  var ss = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  r.setComment("Last modified: " + (new Date()));
}
于 2012-06-17T02:45:48.360 回答