Диапазоны Как это: sourcedata.getRange('Q:Q');
часто приводит к множеству пустых предметов, потому что они собирают все ячейки вплоть до Макс. Строк.
Было бы лучше использовать sourcedata.getRange(1,17,sourcedata.getLastRow(),1);
Это: if ( testvalue[i] != '123' && testvalue2[i] == 'abc')
должно быть примерно таким: if ( testvalue[i][0] != '123' && testvalue2[i][0] == 'abc')
Даже для массивов из одного столбца требуется два индекса.
Я бы написал так:
data.push.apply(data,sourcedata.getRange(i+1,1,1,20).getValues());
вот так:
data.push.(sourcedata.getRange(i+1,1,1,20).getValues()[0]);
На самом деле, я бы вообще так не поступил. Я бы сделал что-то вроде этого:
var vA=sourcedata.getRange(1,1,sourcedata.getLastRow(),20).getValues();
, а затем data.push(vA[i]);//and that gets the whole row of 20 columns as a flattened array
Вот пример чего-то похожего на то, что вы делаете, я думаю.
Мой исходный лист выглядит следующим образом:
Мой конечный лист выглядит следующим образом:
А это мой код:
function copyDataIfAB() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet187');
var rg=sh.getDataRange();
var vA=rg.getValues();
var hA=vA[0];
var hObj={};
var sA=[];
hA.forEach(function(e,i){if(e){hObj[e]=i}});
vA.forEach(function(r,i){
if(vA[i][hObj['HDR2']]=='A' && vA[i][hObj['HDR10']]=='B') {
sA.push(vA[i]);
}
})
var tss=SpreadsheetApp.openById('Id');
var tsh=tss.getSheetByName('Sheet9');
tsh.getRange(tsh.getLastRow()+1,1,sA.length,sA[0].length).setValues(sA);//appending it to the next empty row on the sheet
}