我正在尝试编写一段同步两张表的代码(背后的动机是here)。我从SOF之前的回答中得到了这段代码:
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 - 正如我之前指出的那样,我已经提出了类似的问题。但我认为这是另一个问题,因为我不是在寻找上一个问题中的相同答案(如何使2张表同步?)而是一个更具体的问题:什么阻止了这个代码 - 这个解决方案 - 的工作?答案 0 :(得分:3)
作为其他答案的补充,以下是一些解释:
在documentation about spreadsheet triggers中,您会找到有关simple triggers可以执行(和不能执行)的所有详细信息以及如何设置所谓的“installable triggers”。
简单触发器自动运行,无需向用户提出修改电子表格的任何内容,并以此“活动用户”身份运行。因此,他们不能做任何需要授权的事情。
可安装触发器在脚本作者的权限下执行,即创建触发器的人员,并且需要由脚本作者明确授权。这也意味着这些功能将访问脚本作者数据和不用户数据。
一个简单的例子:如果由可安装触发器触发的功能发送电子邮件,则此电子邮件将由脚本作者发送,而不是由电子表格用户发送......这是非常不同的。
在您展示的示例中,可能会给您带来一些混淆的是onEdit
函数除了调用另一个函数之外什么也没做...但如果您更彻底地查看它,{{1}函数调用电子表格函数,因此需要对电子表格访问权限进行授权。
这肯定是你的onEdit什么都不做的原因。(请注意,它失败了默默地 ......另一个令人困惑的细节: - )
希望这种解释能让它更清晰。
答案 1 :(得分:0)
查看onEdit的帮助。在那里,它说它不能做很多事情。而是安装自己的触发器,如onMyEdit
答案 2 :(得分:0)
您的函数名称onChange()表明您可能使用了错误的触发器类型。
onEdit()和onChange()由不同的情况触发,你描述的情况意味着你想要onEdit()
同样如上述评论者所述,您需要将第一行更改为以下内容以避免返回“未定义”:
var sourceSpreadsheetID = SpreadsheetApp.getActiveSpreadsheet()。getId();