Meg
Meg

Reputation: 65

Copy a row from one Google Sheet Spreadsheet to Another on Form Submit

I have been reading a bunch of other posts and trying out a few things, but I haven't found a solution yet.

I have a Google Form that enters into a spreadsheet. When someone submits, I want to determine where the new row will get copied to based off of the data in column N (14). If it is A then copy the entire row to spreadsheet A and if it is B then copy the entire row to spreadsheet B.

The URLs are copies of the original in case anyone needs to play around with them. The form is here: Copy of New Signage Form

function movingRows() {

var spreadsheetUrlToWatch = 'https://docs.google.com/spreadsheets/d/1q7HyUL3bhd_gLEAfVJrH4strnkF9_UP6uhY4Qy5A6Vc/edit#gid=291411519';

var columnNumberToWatch = 14; // column A = 1, B = 2, etc.
var valueToWatchA = "Fusion";
var valueToWatchB = "LightSource";
var spreadsheetUrlToMoveTheRowToA = "https://docs.google.com/spreadsheets/d/1sWSSHOgdum0LtCggtM6Gz-ytmFJJjMXH9pZ0NYGMV7g/edit#gid=0";
var spreadsheetUrlToMoveTheRowToB = "https://docs.google.com/spreadsheets/d/1BM7x-5STx5DsEtzRiZEq8qxVXgjPjtIZoTxxWuAk46c/edit#gid=0";

var ss = SpreadsheetApp.openByUrl(spreadsheetUrlToWatch);
var sheet = ss.getSheets()[0];
var range = sheet.getActiveCell();
var sheetNameToWatch = ss.getSheets()[0].getSheetName();
console.log(sheetNameToWatch);

if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatchA) {

  var targetSheet = SpreadsheetApp.openByUrl(spreadsheetUrlToMoveTheRowToA).getSheets()[0];
  var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
  sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).copyTo(targetRange);
}
else if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatchB) {
  var targetSheet = SpreadsheetApp.openByUrl(spreadsheetUrlToMoveTheRowToB).getSheets()[0];
  var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
  sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).copyTo(targetRange);
}

}

Code is attached to the form through the google script editor. Code being used after the solution provided by Cooper:

function copyToSpreadsheet()
 {
   var ss0=SpreadsheetApp.openById('1q7HyUL3bhd_gLEAfVJrH4strnkF9_UP6uhY4Qy5A6Vc');
   var sht0=ss0.getSheetByName('Form Responses 1');
   var rng0=sht0.getDataRange();
   var rng0A=rng0.getValues();
   //Fusion Spreadsheet
   var ssA=SpreadsheetApp.openById('1sWSSHOgdum0LtCggtM6Gz-ytmFJJjMXH9pZ0NYGMV7g');
   var shtA=ssA.getSheetByName('Sheet1');
   //LightSource Spreadsheet
   var ssB=SpreadsheetApp.openById('1BM7x-5STx5DsEtzRiZEq8qxVXgjPjtIZoTxxWuAk46c');
   var shtB=ssB.getSheetByName('Sheet1');
   var row= rng0A[rng0A.length-1];
   if(row[13]== "Fusion")
   {
     shtA.appendRow(row);
   }
   if(row[13]== "LightSource")
   {
    shtB.appendRow(row);
   }
  }

Upvotes: 1

Views: 601

Answers (1)

Cooper
Cooper

Reputation: 64042

I didn't test this code but I think it's close. It's fairly simple. Just tie it to onFormSubmit and it will get the last entry. I assumed that all spreadsheets were already created and that they have a Sheet1.

function copyToSpreadsheet()
{
  var ss0=SpreadsheetApp.openById('1q7HyUL3bhd_gLEAfVJrH4strnkF9_UP6uhY4Qy5A6Vc');
  var sht0=ss0.getSheetByName('Sheet1');
  var rng0=sht0.getDataRange();
  var rng0A=rng0.getValues();
  var ssA=SpreadsheetApp.openById('1sWSSHOgdum0LtCggtM6Gz-ytmFJJjMXH9pZ0NYGMV7g');
  var shtA=ssA.getSheetByName('Sheet1');
  var ssB=SpreadsheetApp.openById('1sWSSHOgdum0LtCggtM6Gz-ytmFJJjMXH9pZ0NYGMV7g');
  var shtB=ssB.getSheetByName('Sheet1');
  var row= rng0A[rng0A.length-1];
  if(row[13]==1)
  {
    shtA.appendRow(row);
  }
  if(row[13]==2)
  {
    shtB.appendRow(row);
  }
}

I do think that if the onFormSubmits come in to fast this approach might not be able to keep up and might get the wrong data. I would consider adding another column call it Copied and the run through all of the rows and copy the ones that don't have a TimeStamp in Copied Column. And the loop version is the code below.

function copyToSpreadsheetWithLoop()
{
  var CopiedColumn=20;//Don't really know
  var ss0=SpreadsheetApp.openById('1q7HyUL3bhd_gLEAfVJrH4strnkF9_UP6uhY4Qy5A6Vc');
  var sht0=ss0.getSheetByName('Sheet1');
  var rng0=sht0.getDataRange();
  var rng0A=rng0.getValues();
  var ssA=SpreadsheetApp.openById('1sWSSHOgdum0LtCggtM6Gz-ytmFJJjMXH9pZ0NYGMV7g');
  var shtA=ssA.getSheetByName('Sheet1');
  var ssB=SpreadsheetApp.openById('1sWSSHOgdum0LtCggtM6Gz-ytmFJJjMXH9pZ0NYGMV7g');
  var shtB=ssB.getSheetByName('Sheet1');
  for(var i=1;i<rng0A.length;i++)
  {
    var row= rng0A[i];
    if(row[CopiedColumn-1])
    {
      if(row[13]==1)
      {
        shtA.appendRow(row);
        sht0.getRange(i+1,CopiedColumn).setValue(Utilities.formatDate(new Date(), "GMT-6", "dd/MM/yyyy HH:mm:ss"));
      }
      if(row[13]==2)
      {
        shtB.appendRow(row);
        sht0.getRange(i+1,CopiedColumn).setValue(Utilities.formatDate(new Date(), "GMT-6", "dd/MM/yyyy HH:mm:ss"));
      }
    }
  }
}

Upvotes: 2

Related Questions