简体   繁体   中英

Copy paste to another sheet and find last row without empty rows

I want to copy just the values of a specific row to a second sheet to get a summary/archive.

For this reason I need find the last empty row.

I am currently using the following:

function CopyPaste() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var copySheet = ss.getSheetByName("Data");
  var pasteSheet = ss.getSheetByName("Summary");

  // get source range
  var source = copySheet.getRange(20, 1, 20, 5);
  // get destination range
  var destination = pasteSheet.getRange(pasteSheet.getLastRow() +1, 1, 1, 5);

  // copy values to destination range
  source.copyTo(destination, {contentsOnly: true});

My problem is that everytime when I run the code, it will insert 7 "empty" rows below the copied row.

I know that they are not really empty and found serveral solutions (below) to solve this issue, but unfortunately i dont get it combined and running.

function getLastDataRow(sheet,col) {
// col in letter
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange(col + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }              
}
function onOpen(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetname = ss.getSheets()[0].getName();
  // Logger.log("DEBUG: sheetname = "+sheetname)
  const sheet = ss.getSheetByName(sheetname);
  const values = sheet.getRange('A7:A').getValues();
  // const lastRow = values.length - (values.reverse().findIndex(row => !!row[0]));
    const firstEmptyRow = values.findIndex(row => !row[0]) + 1;
  // const range = sheet.getRange(lastRow,1);
    const range = sheet.getRange(firstEmptyRow,1);
  sheet.setActiveRange(range);
}
function getLastRow_(sheet, columnNumber) {
  // version 1.5, written by --Hyde, 4 April 2021
  const values = (
    columnNumber
      ? sheet.getRange(1, columnNumber, sheet.getLastRow() || 1, 1)
      : sheet.getDataRange()
  ).getDisplayValues();
  let row = values.length - 1;
  while (row && !values[row].join('')) row--;
  return row + 1;
}

Try something like this:

function CopyPaste() {
  var ss = SpreadsheetApp.getActive();
  var sh1 = ss.getSheetByName("Sheet0");
  var sh2 = ss.getSheetByName("Sheet1");
  var vs1 = sh1.getRange(20, 1, 20, 5).getValues().filter(r => r.some(c => c != ''));
  sh2.getRange(sh2.getLastRow() +1, 1, vs1.length, 5).setValues(vs1);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM