Как эффективно переместить значения из столбца в другой столбец без перезаписи значений? - PullRequest
3 голосов
/ 26 июня 2019

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

Я пытался использовать метод фильтра, но я не думаю, что он работает для меня.

Вот изображение того, чего я пытаюсь достичь.

test spreadsheet
Я выбрал значения ячеек, которые должен переместить скрипт; остальные должны оставаться там, где они есть.
Вот мой код:

function moveOldEntryDates()
{
  // Get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName("Sheet1");

  var oneDayAgo = sheet1.getRange(2, 6, 1, 1);
  Logger.log("First Date: " + oneDayAgo.getValue());

  var sevenDaysAgo = subtractDaysFromDate(oneDayAgo.getValue(), 7);
  Logger.log("Seven days ago Date: " + sevenDaysAgo);

  // Dates start on second row
  var dateOffset = 2;

  // Not working properly
  var FColumn = sheet1.getRange("F6:F").getValues(); // Date Column
  var LastRowInFColumn = FColumn.filter(String).length;
  //var g = e.filter( function(elem, pos){ return (f.indexOf(elem[1]) == pos) })

  Logger.log("Last row in column F is "+ LastRowInFColumn);
  var dateColumn = sheet1.getRange(dateOffset, 6, LastRowInFColumn, 1);

  var dateValues = dateColumn.getValues();
  var currentRow = 0;

   // This while loop finds the start of the outdated dates
  while(dateValues[currentRow][0] != "")
  {
    var dateBuilt = new Date(dateValues[currentRow][0]);
    var less = dateBuilt < sevenDaysAgo;
    Logger.log(dateBuilt + " less than " + sevenDaysAgo + "?: " + less + " at row: " + currentRow + dateOffset);
    // Check if less than 7 days ago
    if(less)
    {
      startOfOutdatedCells = dateValues[currentRow][0]; // if date is less than oneWeekAgo, it's outdated
      // everything after is already outdated.
      break;
    }
    else if(!less)
    {
      currentRow++;
    }    
  }
  var outdatedDateRow = currentRow + dateOffset;
  Logger.log("First outdated date starts in row: " + outdatedDateRow);

  // Create a new range to move
  var outdatedCellRange = sheet1.getRange(outdatedDateRow,6, LastRowInFColumn, 1);
  var outdatedCellRangeValues = outdatedCellRange.getValues();
  var oudatedCellCopy = outdatedCellRange.moveTo(sheet1.getRange(outdatedDateRow, 7)); // currentRow = the current row is at startOfOutdatedCells

}

function subtractDaysFromDate(date, days)
{
  var result = new Date(date.getTime()-days*(24*3600*1000));
  return result
}

Я предполагаю, что var LastRowInFColumn = FColumn.filter(String).length; не фильтрует / работает неправильно. Вместо того, чтобы возвращать массив, который содержит только значения String, он по-прежнему возвращает весь столбец, включая пустые ячейки. В результате вот что происходит, когда я запускаю скрипт:
test spreadsheet script
Вы также можете заметить, что он перемещает пустые ячейки и размещает их, перезаписывая значения в другом столбце. Если я запускаю его в третий раз, он просто очищает столбец, потому что перемещает и пустые. test spreadsheet script
Простите за длинный пост! Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

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

Поскольку метод .filter работал не так, как я хотел, я написал свой собственный метод.Вот код для тех, кто может найти это полезным.

function getLastRowByColumn()
{
  // Get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName("Sheet1"); // <======= Change this
  var lastRow = ss.getLastRow();
  var lastColumn = ss.getLastColumn();

  var dates = sheet1.getRange(2,6,lastRow, 1); // <====== Change range values
  var values = dates.getValues();
  var currentRow = 0;
  var rowCounter = 0;
  while(values[currentRow][0] != "")
  {
    rowCounter++;
    currentRow++;
  }
  return rowCounter;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...