1

例子:

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

当您安装 on-edit 触发器时,您的函数会传递开始和结束行和列。但不是编辑了哪个工作表。

自然,我的第一个想法是抓住 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)]]);

}

如何编辑工作表?这是我的错误还是这是一个错误?还是他们在事件处理方式上的不足?

4

3 回答 3

1

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

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

var s = findSheetById_(e.range.getGridId());

如果您遇到与我相同的未定义问题,请使其正常工作。

于 2012-12-14T23:54:04.123 回答
0

我将这个问题交叉发布到谷歌应用脚​​本帮助论坛:

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

Henrique Abreu 给出了答案;这是 Google Apps 脚本如何安装 onedit 触发器的缺陷。但他也给出了一个未记录的解决方法:

我用两个未记录的东西来找出哪个工作表被编辑了。首先,通过检查传递给可安装编辑函数的参数,我发现了一个“gridId”参数,它是工作表的 ID(与我们在 url 上看到的相同的数字 ...#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;
}
于 2011-02-22T15:12:36.987 回答
0

该代码不起作用,因为 e.range 和 e.value 对象没有在可安装触发器上提供任何对象(未定义)!这已引起 Google 的注意,但在Google-script-issues中出现此消息后没有任何操作!

于 2015-02-14T13:17:23.663 回答