Беда в то время как - PullRequest
       1

Беда в то время как

0 голосов
/ 30 мая 2019

Пока код зависает, отладка. Петли бесконечно? Но я не уверен, как, поскольку у меня есть определенное конечное условие, которое должно быть выполнено.

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

function shift() {
  //this sheet
  var spr = SpreadsheetApp.getActiveSpreadsheet();
  var thissheet = spr.getSheetByName('CURRENT MONTH');

  //define last row with data
  var lastRow = thissheet.getLastRow();
  var range = thissheet.getRange("A" + lastRow);
  if (range.getValue() !== "") {
    var lastDataRow = lastRow;
  } else {
    var lastDataRow = range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }

  //define first empty row
  var column = thissheet.getRange('A11:A');
  var values = column.getValues();
  var ct = 0;
  while (values[ct] && values[ct][0] != "") {
    ct++;
  }
  console.log(ct + 1);
  var firstEmptyRow = (ct + 1) + 10 //+10 accounts for header

  //the range to copy to (first empty row)
  var emptyrange = thissheet.getRange(firstEmptyRow, 1, 1, 15);

  //the copy and clear code
  while (lastDataRow > firstEmptyRow) {
    thissheet.getRange(lastDataRow, 1, 1, 15).copyTo(emptyrange);
    thissheet.getRange(lastDataRow, 1, 1, 15).clearContent();
  }
}

Мое решение состояло в том, чтобы использовать while для смещения данных до тех пор, пока номер последней строки данных не станет меньше номера первой пустой строки, поэтому, хотя (lastDataRow> firstEmptyRow) должен работать, пока есть данные ниже пустой строки.

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

К сожалению, предыдущий ответ не помог.Но я понял это.

while (true) {
thissheet.getRange(lastDataRow, 1, 1, 15).copyTo(emptyrange);
  thissheet.getRange(lastDataRow, 1, 1, 15).clearContent();
  Utilities.sleep(500);
  if (lastDataRow > firstEmptyRow) {
  break;}
  } 

Я использовал ручной разрыв.Сон может и не понадобиться, но я хотел немного отложить его, чтобы он работал более эффективно.Опять же, я нуб, наверное, совсем не нужен.Во всяком случае, просто хотел поделиться своим успехом.Еще раз спасибо за вашу помощь, Бармар!

0 голосов
/ 30 мая 2019

Вам нужно уменьшать lastDataRow каждый раз через цикл

  while (lastDataRow > firstEmptyRow) {
    thissheet.getRange(lastDataRow, 1, 1, 15).copyTo(emptyrange);
    thissheet.getRange(lastDataRow, 1, 1, 15).clearContent();
    lastDataRow--;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...