Попробуйте это:
function TestNextNonBlank() {
var spreadsheet = SpreadsheetApp.getActive();
var mysheet=spreadsheet.getSheetByName('MainSheet');
var myrange=mysheet.getRange('Q1');
myrange=nextNonBlank(myrange); //First Non Blank
Logger.log(myrange.getA1Notation()); //Give Q15
myrange=nextNonBlank(myrange); //Second Non Blank
Logger.log(myrange.getA1Notation()); //Give Q16
myrange=nextNonBlank(myrange); //Third Non Blank
Logger.log(myrange.getA1Notation()); //Give Q994
};
function nextNonBlank(theRange)
{
if (theRange.offset(1, 0).isBlank()==false) return theRange.offset(1, 0);
theRange=theRange.offset(1, 0);
if (theRange.offset(1, 0).isBlank()==false) return theRange.offset(1, 0);
theRange=theRange.getNextDataCell(SpreadsheetApp.Direction.DOWN);
return theRange;
}
Чтобы избежать ошибки недопустимого аргумента, ниже я изменил скрипт функции, после того как эта функция достигнет максимальной строки, она возвращает диапазон в позиции максимальной строки. Чтобы скрипт работал хорошо, мы должны обеспечить действительный лист и правильную позицию непустой ячейки:
function nextNonBlank(theRange)
{
if (theRange.getSheet().getMaxRows()==theRange.getRowIndex()){
return theRange;
}
//save the range as last range
var storedRange=theRange;
if (theRange.offset(1, 0).isBlank()==false) return theRange.offset(1, 0);
theRange=theRange.offset(1, 0);
if (theRange.offset(1, 0).isBlank()==false) return theRange.offset(1, 0);
theRange=theRange.getNextDataCell(SpreadsheetApp.Direction.DOWN);
//if the reach range is blank, back to use the stored range
if (theRange.isBlank()) theRange=storedRange;
return theRange;
}