Google apps script 编程触发器的电子表格源

Google apps script 编程触发器的电子表格源,google-apps-script,Google Apps Script,我正在尝试使用发布/订阅模式来帮助我在GAS环境中构建更复杂的应用程序 由于现在可以通过编程方式安装触发器,因此我希望在触发事件时能够在侦听器中检索安装了特定触发器的电子表格id: function setTrigger(){ var triggerBuilder = ScriptApp.newTrigger("listen"), onEditTrigger = triggerBuilder.forSpreadsheet('some-id').onEdit().create();

我正在尝试使用发布/订阅模式来帮助我在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个创建的电子表格,一个监听器,所有这些电子表格共有的一组操作,但是无法与特定的调用者交互,因为它无法识别)


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

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

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


嗯,也许这个问题是真正的“堆栈溢出”,有点超出了预期的范围

我成功检索了调用的电子表格:

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

B) 在创建事件的脚本中,编写一个函数,用于安装“this”中上一页中索引的每个函数

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

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


感谢两张海报的回答。

对于range参数返回不正确的父表的问题,存在一个解决方案。您可以启动该问题以获取更新。

这太棒了,但是,在我问题中描述的上下文中,不幸的是,没有e.source属性。好吧。。。你在那篇公开的文章中写了“这看起来像是在按计划工作”,但我想情况并非如此。。。我已经读过那期了。。。一点也不清楚。。。如果有帮助的话,我会把这件事列为主角。无法重现所描述的问题。如果滚动到底部,您将看到我稍后重新打开了它。我误解了原来的问题。谢谢。你是否找到了解决你提到的问题的方法。似乎SpreadsheetApp.getActiveRange().getSheet().getSheetId()和SpreadsheetApp.getActiveRange().getA1Notation()提供了准确的信息(表示范围实际所在的工作表ID和输入数据的范围)。如果您知道原始电子表格“发布”编辑事件,通过我在上面的回答中描述的技术,您将能够检索该值。我需要隔离代码来实现这一点,因为修复问题可能会以一种非常糟糕的方式破坏解决方案。
function onEdit(event)
{
  var ss = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  r.setComment("Last modified: " + (new Date()));
}