У меня есть небольшой образец кода, чтобы подчеркнуть разницу между созданным мной объектом и объектом триггерного события. В объекте триггерного события я могу использовать термин e.range
вместе со стандартными функциями класса диапазона, и он отлично работает. Однако я действительно не знаю, как создать объект псевдо-события, чтобы термин диапазона был чем-то большим, чем просто имя свойства.
function onEdit(e) {
console.log(JSON.stringify(e));
var sh=e.range.getSheet();//e.range is a real range object
if(sh.getName()=='Sheet2' && e.range.columnStart>1) {
sh.getRange(1,1).setValue(JSON.stringify(e)+ '\n' + e.range.getA1Notation());
var rg=sh.getRange(e.range.getA1Notation());//e.range is a real range object
var myObj={value:rg.getValue,range:{columnStart:e.range.columnStart,rowStart:e.range.rowStart,columnEnd:e.range.columnEnd,rowEnd:e.range.rowEnd}};
console.log(JSON.stringify(myObj));
try{
sh.getRange(2,1).setValue(JSON.stringify(myObj)+ '\n' + myObj.range.getA1Notation());//myObj.range is not a real range object
}
catch(m) {
console.log('Error: ' + m);
}
try{
sh.getRange(3,1).setValue(e.range.getValue());
}
catch(n) {
console.log('Error: ' + n);
}
}
}
Если вы отредактируете Sheet2 соответствующим образом, вы получите следующие журналы драйверов стека:
Stackdriver logs
May 29, 2020, 1:21:30 PM Debug {"source":{},"value":"55","user":{"email":"","nickname":""},"range":{"columnEnd":5,"columnStart":5,"rowEnd":3,"rowStart":3},"authMode":"LIMITED"}
May 29, 2020, 1:21:30 PM Debug {"range":{"columnStart":5,"rowStart":3,"columnEnd":5,"rowEnd":3}}
May 29, 2020, 1:21:30 PM Debug Error: TypeError: myObj.range.getA1Notation is not a function
Обратите внимание: я не могу использовать myObj.range с getA1Notation () метод. (примечание: на самом деле я не ожидал, что это сработает ... Я хотел бы знать, как правильно построить объект, чтобы он работал, и я еще не нашел правильного объяснения.
Я хотел бы узнать, как создать объект псевдо-события, чтобы я мог использовать myObj.range
так же, как e.range
.
Мне очень плохо после того, как Танаике ушел так много проблем. Но моя настоящая цель - создать объект события точно так, как он создается сервером. Чтобы я мог протестировать onEdit () с помощью тестовой функции, вызывающей onEdit (e), а не требовать фактического правки. И, что более важно, я бы просто хотел знать, как построить такой объект.
Думаю, это говорит о том, для чего я снимаю. Я хочу знать, как создать объект события в точности таким, какой он есть предоставленный нам из триггера onEdit, включая то, что e.range должен быть объектом, эквивалентным Class Range и, таким образом, способным использовать любой из методов, найденных здесь . Надеюсь, что это возможно. Я извиняюсь за эти поздние добавления, но они были вызваны некоторыми вопросами Танаике. Мне, вероятно, придется еще раз рассмотреть вопрос и сделать его более ясным.
Это код, над которым я работаю, и он далек от завершения, но это то, что можно сделать, зная ответ на мой вопрос.
function onXditTest(row) {
var row=row||2;
const ss=SpreadsheetApp.getActive();
const sh=ss.getSheetByName('OnEditTest');
const v=sh.getRange(row,1,1,sh.getLastColumn()).getValues()[0];
const xsh=ss.getSheetByName(v[5]);
const xrg=xsh.getRange(v[0],v[2],v[1]-v[0]+1,v[3]-v[2]+1);
const evobj={range:{rowStart:v[0],rowEnd:v[1],columnStart:v[2],columnEnd:v[3]},value:v[4],range:xrg,source:ss};
onXdit(evobj);
}
Реальный вопрос в том, как сделать evobj так, чтобы evobj.range был объектом Class Range и в то же время имел доступные evobj.range.columnStart, evobj.range. rowStart, evobj.range.columnEnd и evobj.range.rowEnd, чтобы тестируемый код в onEdit (e) вел себя так же, как в onXdit (e)
function onXdit(e) {//changed name so edits dont trigger the function
e.source.toast('Entry');
console.log(JSON.stringify(e));
const sh=e.range.getSheet();
if(sh.getName()=="Sheet2" && e.range.columnStart==4 && e.value=="TRUE" ) {
e.source.toast('Past Condition');
e.range.setValue("FALSE");
}
}