Более быстрый способ найти первую пустую строку - PullRequest
31 голосов
/ 30 июля 2011

Я создал скрипт, который каждые несколько часов добавляет новую строку в электронную таблицу Служб Google.

Это функция, которую я сделал, чтобы найти первую пустую строку:

function getFirstEmptyRow() {
  var spr = SpreadsheetApp.getActiveSpreadsheet();
  var cell = spr.getRange('a1');
  var ct = 0;
  while ( cell.offset(ct, 0).getValue() != "" ) {
    ct++;
  }
  return (ct);
}

Он отлично работает, но при достижении примерно 100 строк он становится очень медленным, даже десять секунд. Я беспокоюсь, что при достижении тысяч строк это будет слишком медленно, возможно, из-за превышения времени ожидания или еще хуже. Есть ли лучший способ?

Ответы [ 13 ]

0 голосов
/ 27 января 2016

Я настроил код, предоставленный ghoti, чтобы он искал пустую ячейку.Сравнение значений не работает для столбца с текстом (или я не могу понять, как), вместо этого я использовал isBlank ().Обратите внимание, что значение отрицается с!(перед переменной r) при просмотре вперед, так как вы хотите увеличить i, пока не найдете пробел.Работая на листе на десять, вы хотите прекратить уменьшать значение i, когда обнаружите непустую ячейку (! Удалена).Затем вернитесь на лист вниз к первому бланку.

function findRow_() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.setActiveSheet(ss.getSheetByName("DAT Tracking"));
  var r = ss.getRange('C:C');
  // Step forwards by hundreds
  for (var i = 2; !r.getCell(i,1).isBlank(); i += 100) { }
  // Step backwards by tens
  for ( ; r.getCell(i,1).isBlank(); i -= 10) { }
  // Step forwards by ones
  for ( ; !r.getCell(i,1).isBlank(); i++) { }
  return i;
0 голосов
/ 13 сентября 2013

Наконец-то у меня есть решение для одной линии.

var sheet = SpreadsheetApp.getActiveSpreadsheet();
var lastEmptyOnColumnB = sheet.getRange("B1:B"+sheet.getLastRow()).getValues().join(",").replace(/,,/g, '').split(",").length;

У меня все отлично работает.

0 голосов
/ 28 сентября 2012

Я храню дополнительный лист «обслуживания» в своих электронных таблицах, где храню такие данные.

Чтобы получить следующий свободный ряд диапазона, я просто проверяю соответствующую ячейку.Я могу получить значение мгновенно, потому что работа по поиску значения происходит при изменении данных.

Формула в ячейке обычно выглядит примерно так:

=QUERY(someSheet!A10:H5010, 
    "select min(A) where A > " & A9 & " and B is null and D is null and H < 1")

Значение в A9может периодически устанавливаться на какую-то строку, которая близка к «достаточной» до конца.

Предостережение : я никогда не проверял, подходит ли это для огромных наборов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...