У меня возникла проблема с функцией getLastRow(). Я думал, что эта функция должна возвращать последний ряд, в котором есть данные. Но поскольку рабочий лист, на котором я работаю, имеет гораздо больше свободных строк ниже строк, заполненных данными, функция, похоже, выбирает последнюю свободную строку при ее выполнении вместо того, чтобы выбрать последнюю строку, содержащую данные, что может быть не одно и то же. Может ли кто-нибудь подсказать мне, как исправить эту аномалию. Это ошибка скрипта google или я не совсем понимаю, что нужно делать? Пожалуйста, задавайте дополнительные вопросы, если я не совсем ясно выразился.
Есть ли в листе формулы "на весь столбец"? Или формулы массива, или формулы, которые копируются по всей длине листа? Даже если эти формулы предназначены для возврата пустых ячеек внизу, getLastRow()
все равно их перехватит.
Если это так, попробуйте:
function getLastPopulatedRow(sheet) {
var data = sheet.getDataRange().getValues();
for (var i = data.length-1; i > 0; i--) {
for (var j = 0; j < data[0].length; j++) {
if (data[i][j]) return i+1;
}
}
return 0; // or 1 depending on your needs
}
Вот еще одна версия выбранного в данный момент ответа. Это меняет внутренний цикл для объединения массива без пробелов между элементами. Это объединяет все символы в строке. Если в какой-либо позиции есть персонаж, он выбьет аналогично текущему ответу.
Я сделал несколько тестов скорости, и хотя я думал, что выбранный ответ может быть быстрее, по какой-то причине он, кажется, обрабатывается быстрее на основе моих тестов. Я полагаю, что нашел эту концепцию несколько лет назад здесь при переполнении стека, но не вижу этой ссылки сейчас.
function getLastPopulatedRow(sheetX) {
var arrVals = sheetX.getDataRange().getValues();
for (var i = arrVals.length-1; i > 0; i--) {
if (arrVals[i].join('')){
return i+1
}
}
return 0;
}
хотя решение Адамса будет работать при некоторой доработке, я наткнулся на другое решение этой проблемы при некотором поиске. Я увидел код, который должен был найти первую пустую строку, и я решил, что могу просто вернуть строку за первой пустой строкой, чтобы получить последнюю заполненную строку. Я прикрепляю код здесь:
function getLastPopulatedRow(sheet) {
var cell = sheet.getRange('a1');
var ct = 0;
while ( cell.offset(ct, 0).getValue() != "" ) {
ct++;
}
return (ct--);
}