Reputation: 1
I have an Apps Script function that manipulates rows of data in a sheet by first repositioning them and then transposing column data into rows. Everything works well except that I end up with an extra blank row between each block of 48 rows of data.see sheet 2 "Raw Data"
Here is the portion of the function code where something is going wrong.
// find the initial last row in the 'Raw Data' sheet
var sheet2LastRow = sheet2.getLastRow();
Logger.log(sheet2LastRow); // 47
var numRows = (sheet2LastRow - 1);
Logger.log(numRows); // 46
// find the Current Row to process and move to the destination row
for (var CR = 1 ; CR < sheet2LastRow; CR++) {
Logger.log(CR); // 1 > 46
sheet2.getRange((CR + 1), 1, 1, 59).moveTo(sheet2.getRange((CR * 49), 1));
// transpose data from rows to columns for Data Studio
sheet2.getRange(1, 12, 1, 48).copyTo(sheet2.getRange((CR * 49), 10), SpreadsheetApp.CopyPasteType.PASTE_VALUES, true); // Dimension
sheet2.getRange((CR * 49), 12, 1, 48).copyTo(sheet2.getRange((CR * 49), 11), SpreadsheetApp.CopyPasteType.PASTE_VALUES, true); // Opportunity
sheet2.getRange((CR * 49), 1, 1, 9).copyTo(sheet2.getRange((CR * 49), 1, 48, 9), SpreadsheetApp.CopyPasteType.PASTE_VALUES); // Respondent Info
Upvotes: 0
Views: 109
Reputation: 201358
I think that the reason of your issue is this line sheet2.getRange(row, 1, 1, 9).copyTo(sheet2.getRange(row, 1, 48, 9), SpreadsheetApp.CopyPasteType.PASTE_VALUES)
. In this line, the value is copied to 48 rows. But at the next loop, the value is copied to the row of (48 + 1).
In order to remove this issue, how about the following modification?
In this modification pattern, the for loop is modified by adjusting the row number.
for (var CR = 1 ; CR < sheet2LastRow; CR++) {
Logger.log(CR); // 1 > 46
sheet2.getRange((CR + 1), 1, 1, 59).moveTo(sheet2.getRange((CR * 49), 1));
// transpose data from rows to columns for Data Studio
sheet2.getRange(1, 12, 1, 48).copyTo(sheet2.getRange((CR * 49), 10), SpreadsheetApp.CopyPasteType.PASTE_VALUES, true); // Dimension
sheet2.getRange((CR * 49), 12, 1, 48).copyTo(sheet2.getRange((CR * 49), 11), SpreadsheetApp.CopyPasteType.PASTE_VALUES, true); // Opportunity
sheet2.getRange((CR * 49), 1, 1, 9).copyTo(sheet2.getRange((CR * 49), 1, 48, 9), SpreadsheetApp.CopyPasteType.PASTE_VALUES); // Respondent Info
}
for (var CR = 1 ; CR < sheet2LastRow; CR++) {
var row = (CR * 49) - (CR - 1);
sheet2.getRange((CR + 1), 1, 1, 59).moveTo(sheet2.getRange(row, 1));
sheet2.getRange(1, 12, 1, 48).copyTo(sheet2.getRange(row, 10), SpreadsheetApp.CopyPasteType.PASTE_VALUES, true);
sheet2.getRange(row, 12, 1, 48).copyTo(sheet2.getRange(row, 11), SpreadsheetApp.CopyPasteType.PASTE_VALUES, true);
sheet2.getRange(row, 1, 1, 9).copyTo(sheet2.getRange(row, 1, 48, 9), SpreadsheetApp.CopyPasteType.PASTE_VALUES);
}
In this modification pattern, the for loop is not modified. After all values were copied, the empty rows are deleted.
sheet2.deleteRows(2, 47);
var sheet2NewLastRow = sheet2.getLastRow();
sheet2.deleteRows(2, 47);
var values = sheet2.getRange("A2:DL").getValues();
for (var i = values.length - 1; i >= 0; i--) {
if (values[i].every(e => !e.toString())) sheet2.deleteRow(i + 2);
}
var sheet2NewLastRow = sheet2.getLastRow();
Upvotes: 2