我正在尝试使用发布/订阅模式来帮助我在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实际上是电子表格的id,其中setTrigger()是:不是很有用。
也许我在这个深夜的想象力不足,但我认为没有办法实现这个非常有用的模式(100个创建的电子表格,一个监听器,所有这些电子表格共有的一组操作,但没办法由于无法识别,因此与特定呼叫者进行交互。
任何帮助或评论都将不胜感激。
答案 0 :(得分:2)
好吧,也许这个问题是真正的“堆栈溢出”,有点超出预期的限制。
我同样成功检索了调用电子表格:
A)创建一个查找表,我跟踪特定事件的回调函数;
B)在创建事件的脚本中,编写一个函数,用于在“this”中安装上一个工作表中索引的每个函数。
现在,无论何时触发事件,都会调用安装触发器的脚本,并在侦听器中放入任何和所有参数/属性。
它解决了GAS的一个主要缺陷:如果我在特定工作表上以编程方式安装触发器,我该如何检索该呼叫表?此外,我现在可以以编程方式删除与特定工作表关联的触发器,当该工作表被删除或我决定停止从该工作表接收事件时。
感谢两张海报的答案。
答案 1 :(得分:0)
有趣。没有经过测试,因为我是脚本处理程序的新手,我无法让你的脚本记录ssID。 每个事件都有一个source属性,它只是触发器的电子表格源。 我从文档中提取了这段代码:
触发源:当触发器正在侦听事件时执行触发器。每个触发器都与可以使用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()));
}
答案 2 :(得分:0)
问题有open issue,其中range参数返回不正确的父表。您可以为该问题加注星标以获取更新。