2013-12-09 70 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();

相关问题