2013-12-09 76 views
1

我正在嘗試寫一段代碼來同步兩張表單(其背後的動機是here)。我從SOF得到這個代碼以前的回答:當onEdit()被執行時,什麼能阻止這段代碼運行?

var sourceSpreadsheetID = SPREADSHEET.getId(); 
var sourceWorksheetName = "myData"; 
var destinationSpreadsheetID = "0AmEr9uNtZwnNdDFKMTVlbmZYZ3ZyOWM0aXpZS2twM1Z"; 
var destinationWorksheetName = "myData2"; 

function importData() { 
    var thisSpreadsheet = SpreadsheetApp.openById(sourceSpreadsheetID); 
    var thisWorksheet = thisSpreadsheet.getSheetByName(sourceWorksheetName); 
    var thisData = thisWorksheet.getDataRange(); 
    var toSpreadsheet = SpreadsheetApp.openById(destinationSpreadsheetID); 
    var toWorksheet = toSpreadsheet.getSheetByName(destinationWorksheetName); 
    var toRange = toWorksheet.getRange(1, 1, thisData.getNumRows(),thisData.getNumColumns()); 
    toRange.setValues(thisData.getValues()); 
} 

function onEdit(){ 
    importData(); 
} 

但是當我打開表單並編輯它時,什麼也沒有發生。爲什麼?

PS - 正如我前面,我已經問過類似的問題。但是我認爲這是另一個問題,因爲我沒有從上一個問題尋找相同的答案(如何使兩張表同步?),而是一個更具體的問題:什麼阻止了此代碼 - 此解決方案 - 工作?

+0

全球'SPREADSHEET'從哪裏來? –

+0

你有一個名爲'onChange()'的函數,但是你沒有提及你是否已經將它安裝爲Spreadsheet Change Trigger。你需要這樣做,否則它不會運行。 – Mogsdad

+0

嗨,@BryanP,全球'SPREADSHEET'在我的代碼中定義。 是的,onChange()假設爲電子表格觸發器。 我也嘗試了onEdit()觸發器,它不起作用。 – craftApprentice

回答

3

爲補充其他的答案,這裏有一些解釋:

documentation about spreadsheet triggers你會發現所有關於什麼simple triggers可以做(和不能做什麼)的細節,以及如何建立所謂的「 installable triggers「。

簡單的觸發器沒有要求任何東西給用戶修改電子表格自動運行並運行,因爲這「活躍用戶」。出於這個原因,他們不能做任何需要授權的事情。

的安裝觸發腳本的作者的授權下執行,換句話說,誰創造了扳機的人,他們需要通過腳本作者明確授權。這也意味着這些函數將訪問腳本作者數據和而不是的用戶數據。

一個簡單的例子:如果一個可安裝觸發器觸發功能發送一封電子郵件,該電子郵件將通過腳本作者被髮送,而不是由電子表格用戶...這是完全不同。

什麼可能帶來一些混亂,你在你展示的例子是,onEdit功能並沒有別的比調用另一個函數...但如果你看它更徹底,將importData功能調用電子表格功能,因此需要授權進行電子表格訪問。

這絕對爲什麼你onEdit什麼也不做。(請注意,它失敗默默 ......另一個令人困惑的細節:-)

希望這解釋將使其更清晰。

+0

一如既往,最明確的答案,謝謝。是的,我懷疑是這樣的:「在你展示的例子中,可能會給你帶來一些困惑的是,onEdit函數除了調用另一個函數之外沒有其他任何事情......但是如果你仔細看看它,那麼importData函數是調用電子表格功能,因此需要授權進行電子表格訪問。「 Google發生這種情況時應顯示錯誤消息。 – craftApprentice

+0

我按照說明來安裝觸發器,現在它像魔術一樣工作。 – craftApprentice

0

看看onEdit的幫助。在那裏它說它不能做很多事情。而是安裝自己的觸發條件onMyEdit

0

你函數名的onChange()認爲您可能使用了錯誤的觸發類型。

onEdit()和的onChange()是由不同的情況,你描述你想要onEdit()方法的局面觸發

同樣如上評論者指出,您將需要在第一線更改爲以下至避免返回 '未定義':

變種sourceSpreadsheetID = SpreadsheetApp.getActiveSpreadsheet()的getId();

相關問題