Home > Net >  Copy/paste a Google Sheets with a loop
Copy/paste a Google Sheets with a loop

Time:11-11

I have read all the previous posts and I have a similiar subjetc that I can't solve. I have to copy/paste a Google Sheets (two sheets, 'GENERAL', 'VALEUR') document.

I have won to write a code to copy/paste : 1 document (source) ==to==> 1 document (destination)

function expCalc(){
  copypaste_GENERAL();
  copypaste_VALEUR();
}


function copypaste_GENERAL() {
  var source_G = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1xTBgfI-yy30GHm-LpsUWWoLRACNk5rdc81DPKGyS9fw/edit#gid=0');
  var sourceSheet_G = source_G.getSheetByName('GENERAL');
  var sourceRange_G = sourceSheet_G.getDataRange();
  var sourceValues_G = sourceRange_G.getValues();
  var tempSheet_G = source_G.getSheetByName('TEMP_GENERAL');
  var tempRange_G = tempSheet_G.getRange('A1:DU11');
  var destination_G = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1kFKaNOc8JbRM63tb24QB3_fJms5vnQbZj2lOYsoh0CA/edit#gid=1580219321');
  var destSheet_G = destination_G.getSheetByName('GENERAL');
  
  sourceRange_G.copyTo(tempRange_G);  // paste all formats?, broken references
  tempRange_G.offset(0, 0, sourceValues_G.length, sourceValues_G[0].length)
  .setValues(sourceValues_G);  // paste all values (over broken refs)
  copydSheet = tempSheet_G.copyTo(destination_G);   // now copy temp sheet to another ss
  copydSheet.getDataRange().copyTo(destSheet_G.getDataRange());
  destination_G.deleteSheet(copydSheet); //delete copydSheet
}

function copypaste_VALEUR() {
  var source_V = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1xTBgfI-yy30GHm-LpsUWWoLRACNk5rdc81DPKGyS9fw/edit#gid=0');
  var sourceSheet_V = source_V.getSheetByName('VALEUR');
  var sourceRange_V = sourceSheet_V.getDataRange();
  var sourceValues_V = sourceRange_V.getValues();
  var tempSheet_V = source_V.getSheetByName('TEMP_VALEUR');
  var tempRange_V = tempSheet_V.getRange('A1:I255');
  var destination_V = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1kFKaNOc8JbRM63tb24QB3_fJms5vnQbZj2lOYsoh0CA/edit#gid=1580219321');
  var destSheet_V = destination_V.getSheetByName('VALEUR');
  
  sourceRange_V.copyTo(tempRange_V);  // paste all formats?, broken references
  tempRange_V.offset(0, 0, sourceValues_V.length, sourceValues_V[0].length)
  .setValues(sourceValues_V);  // paste all values (over broken refs)
  copydSheet = tempSheet_V.copyTo(destination_V);   // now copy temp sheet to another ss
  copydSheet.getDataRange().copyTo(destSheet_V.getDataRange());
  destination_V.deleteSheet(copydSheet); //delete copydSheet
}

but I can't write a code to copy/paste : 1 document (source) ==to==> MANY (more than 1) documents (destination) according to a list of URLs (here, example only on 2 URLs)

Here is my test code (using only t'GENERAL' sheet for this present test)

function copypaste_GENERAL() {
  var source = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1xTBgfI-yy30GHm-LpsUWWoLRACNk5rdc81DPKGyS9fw/edit#gid=0');
  var sourceSheet = source.getSheetByName('GENERAL');
  var sourceRange = sourceSheet.getDataRange();
  var sourceValues = sourceRange.getValues();
  var tempSheet = source.getSheetByName('TEMP_GENERAL');
  var tempRange = tempSheet.getRange('A1:DU11');
  var destSpreadUrl = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1kFKaNOc8JbRM63tb24QB3_fJms5vnQbZj2lOYsoh0CA/edit#gid=1580219321');
  var destSheetUrl = destSpreadUrl.getSheetByName('URLTST');
  var destSheet_G = destSpreadUrl.getSheetByName('GENERAL');
  var urlessai = destSheetUrl.getRange("D2:D3").getValues();
  for (var row = 1; row = 3; row  ) {
    if (urlessai[row] != '') {
      sourceRange.copyTo(tempRange);  // paste all formats?, broken references
      tempRange.offset(0, 0, sourceValues.length, sourceValues[0].length)
      .setValues(sourceValues);  // paste all values (over broken refs)
      copydSheet = tempSheet.copyTo(destSpreadUrl);   // now copy temp sheet to another ss
      copydSheet.getDataRange().copyTo(destSheet_G.getDataRange());
      destSpreadUrl.deleteSheet(copydSheet); //delete copydSheet
    };
  };
};

Please, can you help me to find a solution to write this copy/paste loop on a list of URLs (for x users) ?

Thanks in advance !

Philippe

CodePudding user response:

This is probably not exactly what you want but I think it's close and I'm willing to tweak it.

function copySrcDes() {
  const ss = SpreadsheetApp.getActive();
  const locs = [{srcid:"1xTBgfI-yy30GHm-LpsUWWoLRACNk5rdc81DPKGyS9fw",desid:"1kFKaNOc8JbRM63tb24QB3_fJms5vnQbZj2lOYsoh0CA",shts:["GENERAL"]},{srcid:"1xTBgfI-yy30GHm-LpsUWWoLRACNk5rdc81DPKGyS9fw",desid:"1kFKaNOc8JbRM63tb24QB3_fJms5vnQbZj2lOYsoh0CA",shts:["VALEUR"]}];
  locs.forEach(obj => {
    let sss = SpreadsheetApp.openById(obj.srcid);
    let dss = SpreadsheetApp.openById(obj.desid);
    obj.shts.forEach(n => {
      let ssh = sss.getSheetByName(n);
      let dsh = dss.getSheetByName(n);
      let vs = ssh.getDataRange().getValues();
      dsh.getRange(1,1,vs.length,vs[0].length).setValues(vs);
    });
  });
}

CodePudding user response:

Thank you Cooper for your detailed answer. I learned a lot in syntax but my end goal is to copy/paste with a loop (example : loop "for")

enter image description here

over a column that contains ~ 40 URLs from 40 employees. In order to test the copy/paste in a loop more quickly, I tried a test code with the sheet 'GENERAL' only and over 2 URLs

function copypaste_GENERAL() {
  var source = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1xTBgfI-yy30GHm-LpsUWWoLRACNk5rdc81DPKGyS9fw/edit#gid=0');
  var sourceSheet = source.getSheetByName('GENERAL');
  var sourceRange = sourceSheet.getDataRange();
  var sourceValues = sourceRange.getValues();
  var tempSheet = source.getSheetByName('TEMP_GENERAL');
  var tempRange = tempSheet.getRange('A1:DU11');
  var destSpreadUrl = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1kFKaNOc8JbRM63tb24QB3_fJms5vnQbZj2lOYsoh0CA/edit#gid=1580219321');
  var destSheetUrl = destSpreadUrl.getSheetByName('URLTST');
  var destSheet_G = destSpreadUrl.getSheetByName('GENERAL');
  var urlessai = destSheetUrl.getRange("D2:D3").getValues();
  for (var row = 1; row = 3; row  ) {
    if (urlessai[row] != '') {
      sourceRange.copyTo(tempRange);  // paste all formats?, broken references
      tempRange.offset(0, 0, sourceValues.length, sourceValues[0].length)
      .setValues(sourceValues);  // paste all values (over broken refs)
      copydSheet = tempSheet.copyTo(destSpreadUrl);   // now copy temp sheet to another ss
      copydSheet.getDataRange().copyTo(destSheet_G.getDataRange());
      destSpreadUrl.deleteSheet(copydSheet); //delete copydSheet
    };
  };
};

but the code (including) the code/loop run starts without ever stopping. For info, my very first code of my first comment (without the loop and over 1 URL) works well.

function expCalc(){
  copypaste_GENERAL();
  copypaste_VALEUR();
}


function copypaste_GENERAL() {
  var source_G = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1xTBgfI-yy30GHm-LpsUWWoLRACNk5rdc81DPKGyS9fw/edit#gid=0');
  var sourceSheet_G = source_G.getSheetByName('GENERAL');
  var sourceRange_G = sourceSheet_G.getDataRange();
  var sourceValues_G = sourceRange_G.getValues();
  var tempSheet_G = source_G.getSheetByName('TEMP_GENERAL');
  var tempRange_G = tempSheet_G.getRange('A1:DU11');
  var destination_G = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1kFKaNOc8JbRM63tb24QB3_fJms5vnQbZj2lOYsoh0CA/edit#gid=1580219321');
  var destSheet_G = destination_G.getSheetByName('GENERAL');
  
  sourceRange_G.copyTo(tempRange_G);  // paste all formats?, broken references
  tempRange_G.offset(0, 0, sourceValues_G.length, sourceValues_G[0].length)
  .setValues(sourceValues_G);  // paste all values (over broken refs)
  copydSheet = tempSheet_G.copyTo(destination_G);   // now copy temp sheet to another ss
  copydSheet.getDataRange().copyTo(destSheet_G.getDataRange());
  destination_G.deleteSheet(copydSheet); //delete copydSheet
}

function copypaste_VALEUR() {
  var source_V = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1xTBgfI-yy30GHm-LpsUWWoLRACNk5rdc81DPKGyS9fw/edit#gid=0');
  var sourceSheet_V = source_V.getSheetByName('VALEUR');
  var sourceRange_V = sourceSheet_V.getDataRange();
  var sourceValues_V = sourceRange_V.getValues();
  var tempSheet_V = source_V.getSheetByName('TEMP_VALEUR');
  var tempRange_V = tempSheet_V.getRange('A1:I255');
  var destination_V = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1kFKaNOc8JbRM63tb24QB3_fJms5vnQbZj2lOYsoh0CA/edit#gid=1580219321');
  var destSheet_V = destination_V.getSheetByName('VALEUR');
  
  sourceRange_V.copyTo(tempRange_V);  // paste all formats?, broken references
  tempRange_V.offset(0, 0, sourceValues_V.length, sourceValues_V[0].length)
  .setValues(sourceValues_V);  // paste all values (over broken refs)
  copydSheet = tempSheet_V.copyTo(destination_V);   // now copy temp sheet to another ss
  copydSheet.getDataRange().copyTo(destSheet_V.getDataRange());
  destination_V.deleteSheet(copydSheet); //delete copydSheet
}

Can you help me to loop this copy/paste code on x URLs (URLs from x employees) ?

Thanks in advance !

Philippe

  • Related