这个基于onEdit
的函数可以工作:
function onEdit(e) {
const row = e.range.getRow();
const col = e.range.getColumn();
const as = e.source.getActiveSheet();
const sheet_name = 'Sheet1'
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName(sheet_name);
const values = sh.getRange('A2:A'+sh.getLastRow()).getValues().flat([1]);
if(as.getName() == sheet_name && col == 1 && row > 1){
var toCopy;
values.forEach((el,index)=>{
if (el!=''){
toCopy = sh.getRange(index+2,1).getValue();
}
if(el==''){
sh.getRange(index+2,1).setValue(toCopy)
}
})
}
}
但是,如果我想使用基于时间的触发器执行此函数,并将函数名称从function onEdit(e)
更改为function myFunc(e)
,则触发的执行将失败,错误如下:
TypeError: Cannot read property 'getRow' of undefined at myFunc(Code:3:23)
-显示在失败的执行,
和
TypeError: Cannot read property 'range' of undefined (line 3, file "Code")
-显示在脚本编辑器中。
这两个错误都涉及第二行const row = e.range.getRow();
。
如何使用基于时间的触发器无错误地执行此函数?
通过sandman的编辑,工作函数如下所示:
function fillMyRow() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1');
const values = sh.getRange('A2:A'+sh.getLastRow()).getValues().flat([1]);
var toCopy;
values.forEach((el,index)=>{
if (el != ''){
toCopy = sh.getRange(index+2,1).getValue();
} else {
sh.getRange(index+2,1).setValue(toCopy)
}
})
}
它是手动工作的,通过时间驱动的触发器执行,可以达到预期的结果。