安装在编辑触发器上...哪个工作表已编辑?

时间:2011-02-01 02:39:57

标签: google-apps-script

示例:

https://spreadsheets.google.com/ccc?key=0Am8IA9FchrLbdHlkbWFMOWtZa1Y0RWpMNUV5Q3RMaVE&hl=en&authkey=CPXlr5UL

当您安装编辑时触发器时,您的函数会传递开始和结束行和列。但是没有编辑哪张纸。

当然,我的第一个想法是抓住SpreadsheetApp()。getActiveSheet()但这不起作用。

编辑示例电子表格中的任何单元格。安装的编辑后触发器将填充Sheet1的值,告诉您编辑的内容。现在切换到表2或表3并编辑内容。它总是报告Sheet1已被编辑。

触发器的代码:

function my_on_edit(e) {

  //the object passed in, e, doesn't know what sheet was edited. Really!

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetname = ss.getName();

  var thesheet = ss.getActiveSheet();

  var sheetname = thesheet.getName();

  //Tell us what was edited, please.
  ss.getSheetByName("Sheet1").getRange("A2:E2").setValues([[ spreadsheetname, sheetname, e.range.rowStart, e.range.columnStart, Utilities.jsonStringify(e)]]);

}

如何编辑工作表?这是我的错误还是这个错误?或者他们如何处理事件处理有缺陷?

3 个答案:

答案 0 :(得分:1)

我在许多论坛上发现了这种解决方法,但当我尝试使用它时,我不断获得e.gridId = undefined。在敲打我的头发并拉出我的头发后,我最终尝试了一些替代品并找到了解决方案。所以我想我会分享我的小发现:

e.range.getGridId()现在返回相同的值。因此,在上面的脚本中,将第二行更改为:

var s = findSheetById_(e.range.getGridId());
如果你遇到了我所做的同样的未定义问题,那么

就可以了。

答案 1 :(得分:0)

我将此问题转发给谷歌应用脚​​本帮助论坛:

http://www.google.com/support/forum/p/apps-script/thread?tid=535e1d8ff33a731f&hl=en

Henrique Abreu回答说得对;这与Google Apps脚本如何安装onedit触发器有关。但他也给出了一个无证的解决方法:

  

我用两个未记录的东西来找出哪个工作表被编辑过。   首先,通过检查传递给可安装编辑函数的参数,我找到了一个“gridId”参数,它是工作表的ID(我们在网址上看到的数字相同...#gid =)。   还有sheet.getSheetId(),它出现在代码编辑器中但不在文档中。   这是一个例子:

function my_on_edit(e) {
  var s = findSheetById_(e.gridId);
  var r = e.range;
  s.getRange(r.rowStart, r.columnEnd+1).setValue( s.getName() );
}

function findSheetById_(id) {
  var sheets = SpreadsheetApp.getActive().getSheets();
  for( var i in sheets )
    if( sheets[i].getSheetId() == id )
      return sheets[i];
  throw 'Unable to find sheet with id: '+id;
}

答案 2 :(得分:0)

代码不起作用,因为e.range和e.value对象不会在可安装的触发器上给出任何对象(未定义)!这已经引起了谷歌的注意,但在Google-script-issues的消息之后没有采取任何行动!