2011-02-01 68 views
1

例子:在编辑触发器上安装...哪个表被编辑?

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)]]); 

} 

如何,我可以得到表编辑?这是我的错误还是这是一个错误?或者他们在做事件处理方面的缺陷?

回答

0

我crossposted就此问题向谷歌企业应用套件脚本帮助论坛:

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

恩里克阿布雷乌说一个答案;这是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; 
} 
1

我发现很多论坛上这种解决方法,但是当我试图用它我一直得到e.gridId = undefined。在敲我的头并拔出头发后,我尝试了一些替代方法并找到了解决方案。所以我想我会分享我的一点发现:

e.range.getGridId()现在返回相同的值。因此,在上述变化的脚本第二行:

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

使,如果你得到同样的不确定问题,我做到了工作。

0

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