While遇到问题

时间:2019-05-29 21:44:59

标签: javascript google-apps-script

虽然代码冻结了调试。无限循环?但是我不确定如何满足定义的最终条件。

我正在使用的工作表是库存表。我有另一个脚本,可以在货物离开仓库时在单独的选项卡上自动对货物进行分类,然后将数据留空。我想将数据移到第一个空行。该脚本将在多次运行时执行此操作,但是,如果在运行脚本时压缩了所有数据,它将把最后一个数据行移到第一个空行,此时它实际上位于最后一个数据行之下。

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移位数据,直到最后一个数据行号小于第一个空行号,因此,只要空行下有数据,Whise(lastDataRow> firstEmptyRow)就应该运行。 >

2 个答案:

答案 0 :(得分:0)

您需要在循环中每次减小lastDataRow

  while (lastDataRow > firstEmptyRow) {
    thissheet.getRange(lastDataRow, 1, 1, 15).copyTo(emptyrange);
    thissheet.getRange(lastDataRow, 1, 1, 15).clearContent();
    lastDataRow--;
  }

答案 1 :(得分:0)

不幸的是,先前的答案没有帮助。但是我确实知道了。

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

我使用了手动休息时间。睡眠可能不是必需的,但我想稍微延迟一下以帮助其更有效地运行。同样,我是菜鸟,可能根本没有必要。无论如何,只是想分享我的成功。再次感谢您对Barmar的所有帮助!