Moving Rows to Different Sheet Script - google-apps-script

I'm trying to move rows from a specific tab of Doc 1, to row 2 of Doc 2. Right now the data is importing into row 1 of Doc 2, causing the column headers to be removed. I'm newer to scripts, so I'm thinking this should be a simple update, but haven't been able to figure it out.
function CopyDataToTopicPool() {
var sss = SpreadsheetApp.openById('12ioAv8zkSieB0_1KjWW4G9EioyPhfyEtDcppMq2Xlwg'); // sss = source spreadsheet
var ss = sss.getSheetByName('Need New Topic Ideas'); // ss = source sheet
//Get full range of data
var SRange = ss.getDataRange();
//get A1 notation identifying the range
var A1Range = SRange.getA1Notation();
//get the data values in range
var SData = SRange.getValues();
var tss = SpreadsheetApp.openById('1Gaan3bV6Rkih7cJrXGOlHeCqufwvb8oYUfl9xw2QTcQ'); // tss = target spreadsheet
var ts = tss.getSheetByName('Sheet1'); // ts = target sheet
//set the target range to the values of the source data
ts.getRange(A1Range).setValues(SData);
}

When you set the values in your target sheet ts.getRange(A1Range).setValues(SData); , you used the original range A1Range of your source sheet. It will basically copy the data in the source sheet and paste it to your destination sheet on the exact same range/location.
What you need to do is to specify the ranges where you want to set the values in your target sheet using getRange(row, column, numRows, numColumns)
It should be like this:
ts.getRange(2,1,SRange.getLastRow(),SRange.getLastColumn()).setValues(SData);
The range that is selected will start at row index 2 and column 1.
It will set the last row and column index based on the size of your range using getLastRow() and getLastColumn()
Example Source Sheet:
Example Destination Sheet:

Related

apps script - copying manually selected, non-adjacent rows and pasting them below each other

I want to copy manually selected/highlighted non-adjacent rows and paste them directly below each other on another sheet ("fight list raw"). With the script below it works fine, as long as the rows are adjacent. If the rows are non-adjacent, only one row is pasted (the row which was selected lastly / where the cursor is in).
Has someone an idea how to manage it?
function copynonadjacent rows() {
SpreadsheetApp.flush();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var target = SpreadsheetApp.getActiveSpreadsheet();
var source_sheet = ss.getActiveSheet();
var source_range = source_sheet.getActiveRange();
var target_sheet = target.getSheetByName("fight list raw");
var last_row = target_sheet.getLastRow();
target_sheet.insertRowsAfter(last_row,1);
source_range.copyTo(target_sheet.getRange("A"+(last_row+1+":AA"+(last_row+1))),{contentsOnly:true});
}
Thanks a lot!
From your following reply,
I want to copy row number 2 and row number 4. When I select the two rows by clicking on the row numbers and run the script, only row number 4 is copied.
But if I select rows 2 and 3 (so no rows between them), the script copies both rows. In the destination sheet the rows are pasted below each other without a row between them. I want this the same way, when I copy row 2 and 4.
In your script, you use var source_range = source_sheet.getActiveRange();. I thought that this might be the reason for your issue. In this case, how about the following modification?
Modified script:
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Source sheet.
var source_sheet = ss.getActiveSheet();
var source_ranges = source_sheet.getActiveRangeList().getRanges();
var values = source_ranges.flatMap(r => r.getValues());
var len = values.length;
// Target sheet.
var target_sheet = ss.getSheetByName("fight list raw");
var last_row = target_sheet.getLastRow();
target_sheet.insertRowsAfter(last_row, len);
target_sheet.getRange(last_row + 1, 1, len, values[0].length).setValues(values);
}
When this script is run, the selected rows are retrieved, and copy the values to the target sheet.
I thought that you use {contentsOnly:true}. So, I thought that getValues and setValues might be able to be used.
Reference:
getActiveRangeList()

Transfer data by script on GoogleSheet

I already have a script that kind of making what I want, but I have a small issue with it, it's that it copy all the sheet with everything instead for me, I want it to be just the values of the cells and past them to the 2nd sheet.
Here is my code
function copyValueFromSheetToSheet() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var copySheet = ss.getSheetByName("Sheet1");
var pasteSheet = ss.getSheetByName("Sheet2");
// get source range
var source = copySheet.getRange(2,1,12,4);
// get destination range
var destination = pasteSheet.getRange(pasteSheet.getLastRow()+1,1,12,1);
// copy values to destination range
source.copyTo(destination);
// clear source values
source.clearContent();
Browser.msgBox('Commande Confirmer');
}
thank you
Description
Modify your code as shown below
Script
// get source range
var source = copySheet.getRange(2,1,12,4).getValues();
var destination = pasteSheet.getRange(pasteSheet.getLastRow()+1,1,12,4).setValues(source);
// copy values to destination range
// source.copyTo(destination); <- not needed

Copying data script is not working anymore

I have been using a script in my google sheet that I found here:
copy data from one sheet to another in google app script and append a row, one small issue
var ss = SpreadsheetApp.getActiveSpreadsheet();
var copySheet = ss.getSheetByName("Copy");
var pasteSheet = ss.getSheetByName("Paste");
// get source range
var source = copySheet.getRange(2,2,12,2);
// get destination range
var destination = pasteSheet.getRange(pasteSheet.getLastRow()+1,2,12,2);
// copy values to destination range
source.copyTo(destination);
// clear source values
source.clearContent();
}
When I am running it now it gives me an error:
The coordinates of the target range are outside the dimensions of
the sheet.
which wasn't coming up before. Does anyone have an idea why it is doing this?
Issue:
The error is in this line:
var destination = pasteSheet.getRange(pasteSheet.getLastRow()+1,2,12,2);
pasteSheet.getLastRow() returns a row number which is at the very bottom of your sheet. Then you consider 12 rows range but the pasteSheet does not have 12 rows after the last row with content.
Solutions:
Add more rows in the pasteSheet:
or you can use insertRowsAfter:
pasteSheet.insertRowsAfter(pasteSheet.getLastRow(), 12)
Code snippet:
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var copySheet = ss.getSheetByName("Copy");
var pasteSheet = ss.getSheetByName("Paste");
// get source range
var source = copySheet.getRange(2,2,12,2);
// insert rows to make sure you have enough space
pasteSheet.insertRowsAfter(pasteSheet.getLastRow(), 12)
// get destination range
var destination = pasteSheet.getRange(pasteSheet.getLastRow()+1,2,12,2);
// copy values to destination range
source.copyTo(destination);
// clear source values
source.clearContent();
}

Google sheets group script error when only 1 line

I have a script that copies the data from one sheet into another which acts as an archive. I have it so when it pastes the data into the archive sheet, it will group and collapse the data. However, when it is only 1 row I don't want it to group the data. This is causing an error:
"Exception. Invalid argument"
which is in reference to this line:
ts.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
I think a solution to this might be to incorporate an if array where if the range of data copied has 1 row do nothing, 2 rows will offset by 1 row then group then collapse, and 3 or more rows will run the same code I have below.
Here is the code that selects the data, groups, and then collapse it:
ts.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.UP).activate();
ts.getCurrentCell().offset(1, 0).activate(); //offset by 1 row for the header
var currentCell = ts.getCurrentCell();
ts.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
currentCell.activateAsCurrentCell();
ts.getActiveRange().shiftRowGroupDepth(1).collapseGroups();
Full script:
function CopyRangeSoldTest() {
var sss = SpreadsheetApp.openById('1vT4R-_xPx3Z7bOYWgpOp2JCypL2yODxcJ'); //replace with source ID
var ss = sss.getSheetByName('Sold'); //replace with source Sheet tab name
var range = ss.getDataRange(); //assign the range you want to copy
var data = range.getValues();
var tss = SpreadsheetApp.openById('1srDDle9R81Qlh'); //replace with destination ID
var ts = tss.getSheetByName('Sold History'); //replace with destination Sheet tab name
ts.getRange(ts.getLastRow()+2,1,ss.getLastRow(),5).setValues(data)
ts.getRange(ts.getLastRow(),1,ts.getLastRow(),5).activate();
ts.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.UP).activate();
ts.getCurrentCell().offset(1, 0).activate();
var currentCell = ts.getCurrentCell();
ts.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
currentCell.activateAsCurrentCell();
ts.getActiveRange().shiftRowGroupDepth(1).collapseGroups();//.shiftRowGroupDepth(1).collapseGroups();//you will need to define the size of the copied data see getRange()
var sss = SpreadsheetApp.openById('1vT4R-_xPx3Z7bOYWgpOp2JCypL2yODx'); //replace with source ID
var ss = sss.getSheetByName('Received'); //replace with source Sheet tab name
var range = ss.getDataRange(); //assign the range you want to copy
var data = range.getValues();
var tss = SpreadsheetApp.openById('1srDDle9R81Qlh'); //replace with destination ID
var ts = tss.getSheetByName('Received History'); //replace with destination Sheet tab name
ts.getRange(ts.getLastRow()+2,1,ss.getLastRow(),5).setValues(data)
ts.getRange(ts.getLastRow(),1,ts.getLastRow(),5).activate();
ts.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.UP).activate();
ts.getCurrentCell().offset(1, 0).activate();
var currentCell = ts.getCurrentCell();
ts.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
currentCell.activateAsCurrentCell();
ts.getActiveRange().shiftRowGroupDepth(1).collapseGroups();//.shiftRowGroupDepth(1).collapseGroups();//you will need to define the size of the copied data see getRange()
}
Explanation:
I understand you recorded a Macro to generate this code. However, if you do some research on the official documentation you will be able to write your own code and achieve the same result in way less lines but also generalize it so it could work for multiple projects.
However, a direct solution to your problem might be the following:
You can get the values of the selection and check if the length of this array is larger than 1 or in other words, the selected data contains more than 1 rows:
var nrows = ts.getSelection().getActiveRange().getValues().length;
and then use an if condition to check whether the data contains more than 1 row: if(nrows>1).
Solution:
Try this:
ts.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.UP).activate();
ts.getCurrentCell().offset(1, 0).activate(); //offset by 1 row for the header
var currentCell = ts.getCurrentCell();
var nrows = ts.getSelection().getActiveRange().getValues().length;
if (nrows>1){
ts.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
currentCell.activateAsCurrentCell();
ts.getActiveRange().shiftRowGroupDepth(1).collapseGroups();
}

Copy a range from last row to new sheet

I want to take the last response from a Google Form and copy it to the same range on another sheet.
The second sheet has some data in columns A & B (a login and password) that I want to assign as somebody completes the registration form.
I want the data from column B to H from the form response sheet to be copied to column C to I on the sheet that contains the login/password columns when a response is received.
I know I am missing the code to take the range from the last row, but I know NO coding at all and my current script is compiled from things I've found around the web and the reference material.
Any advice would be greatly appreciated.
function onEdit(e) {
var spreadsheet = SpreadsheetApp.openById("sheetid");
var sheet = spreadsheet.getSheets()[0];
var lastrow = sheet.getLastRow();
var range = sheet.getRange(2,2,1,7);
values = range.getValues();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var SSsheet = ss.getSheets()[1];
var ssRange = SSsheet.getRange(2,3,1,7);
ssRange.setValues(values);
}
Try using copyTo(destination). It copies the data from a range of cells to another range of cells. Both the values and formatting are copied.
// The code below will copy the first 5 columns over to the 6th column.
var sheet = SpreadsheetApp.getActiveSheet();
var rangeToCopy = sheet.getRange(1, 1, sheet.getMaxRows(), 5);
rangeToCopy.copyTo(sheet.getRange(1, 6));
}
You can also try using copyValuesToRangecopyValuesToRange.
For additional code samples, you may also refer to this forum.
function onEdit(e) {
var spreadsheet = SpreadsheetApp.openById("ID");
var sheet = spreadsheet.getSheets()[0];
var lastRow = sheet.getLastRow();
var range = sheet.getRange("A"+(lastRow)+":G"+(lastRow));
var values = range.getValues();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var SSsheet = ss.getSheets()[1];
var getRow = SSsheet.getLastRow() + 1;
var ssRange = SSsheet.getRange(getRow, 1, values.length, values[0].length);
ssRange.setValues(values);
Try with this,
this code copies the last value you want from a certain range and pastes it in the last available row of the other sheet.
The code it's the same only in the place where you are going to copy it, specify it to be the size of what I want to copy. I hope it helps you :D