Google-sheets – Skip empty rows while copying

google sheetsgoogle-apps-script

I have this script in Google Sheets which is able to archive range Sheet1!A5:H to Sheet2

function tc() {
    var reference = 'sheet1!A2'; 
    var rng = SpreadsheetApp.getActiveSpreadsheet().getRange(reference);
    rng.setValue(rng.getValue()+1);
    var ss = SpreadsheetApp.getActiveSpreadsheet ();
    var ss = SpreadsheetApp.getActiveSpreadsheet ();
    var source = ss.getRange ("Sheet1!A5:H");
    var destSheet = ss.getSheetByName("Sheet2");
    var lastRow = destSheet.getLastRow();
    destSheet.insertRowAfter(lastRow);
    source.copyTo(destSheet.getRange(lastRow + 1,1), {contentsOnly: true});
}

The issue is that this will also archive all empty rows from that range.

Is there a way how to skip archiving empty rows from a given range?

I tried to add something like var filtered_input = source.filter(String); but this didn't do the trick. Can someone help me out?

Sheet1 looks like:

Sheet2 looks like this after running the script 2 times:

Best Answer

How about this modification? I think that you can use getValues() and setValues() in your situation, because contentsOnly: true is used to copyTo(). So please modify as follows.

From:

var lastRow = destSheet.getLastRow();
destSheet.insertRowAfter(lastRow);
source.copyTo(destSheet.getRange(lastRow + 1,1), {contentsOnly: true});

To:

var values = source.getValues().filter(function(e) {return e.some(function(f) {return f})});
destSheet.getRange(destSheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);

References:

If I misunderstood your question, please tell me. I would like to modify it.