2011-02-01 63 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的消息後沒有任何操作!