web-dev-qa-db-fra.com

Comment copier une ligne d'une feuille de calcul Google dans une autre feuille de calcul Google à l'aide du script Google Apps?

Bonjour, je souhaitais copier une ligne particulière d'une feuille de calcul dans une autre feuille de calcul à l'aide du script Google Apps. Est-ce que tout le monde peut m'aider à obtenir la réponse à cette question?.

13
Ani

Découvrez la documentation ici:

http://code.google.com/googleapps/appsscript/service_spreadsheet.html

Supposons que vous travaillez dans la feuille de calcul d'où vous copiez.

Vous devez obtenir un descripteur de la feuille de calcul actuelle et de la feuille de calcul cible. Vous devrez obtenir l'ID de la feuille de calcul cible. Les détails sont dans le lien là-haut.

var ss = SpreadsheetApp.getActiveSpreadsheet();
var target = SpreadsheetApp.openById("abc1234567");

Ensuite, nous devons choisir les feuilles particulières dans ces feuilles de calcul. Supposons que votre ligne se trouve sur la feuille nommée "New Stuff" et que la feuille de calcul cible contient une feuille nommée "Archive".

var source_sheet = ss.getSheetByName("New Stuff");
var target_sheet = target.getSheetByName("Archive");

Désormais, le concept utilisé par les feuilles de calcul Google Apps est constitué de plages. Une plage est juste un bloc de cellules. Nous devons donc déterminer la plage de départ et la plage de départ. Disons que votre feuille a 7 colonnes et que vous voulez la 10ème ligne.

var source_range = source_sheet.getRange("A10:G10");
var target_range = target_sheet.getRange("A1:G1");

Nous allons donc prendre cette ligne et la placer sur la première ligne de la feuille cible. Maintenant pour la copie réelle:

source_range.copyTo(target_range);

Et tu as fini!

Désormais, cela encombrera toujours la première ligne de la feuille cible. Vous pouvez faire beaucoup pour arrêter cela. Au lieu d'utiliser toujours la première ligne, vous pouvez utiliser les méthodes de l'objet feuille pour rechercher la dernière ligne, en ajouter une après, puis l'utiliser comme plage.

var last_row = target_sheet.getLastRow();
target_sheet.insertRowAfter(last_row);
var target_range = target_sheet.getRange("A"+(last_row+1)+":G"+(last_row+1));

Ainsi, chaque fois que vous copiez une ligne, celle-ci est simplement ajoutée au bas de la feuille.

20
Keith Twombley

La méthode copyTo est mal documentée car elle ne vous permet pas de copier le contenu sur une feuille d'une autre feuille de calcul. 

Vous voudrez peut-être utiliser les getValues ans setValues comme ci-dessous:

function CopyDataToNewFile() {
  var sss = SpreadsheetApp.openById('0AjN7uZG....'); // sss = source spreadsheet
  var ss = sss.getSheetByName('Monthly'); // 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('8AjN7u....'); // tss = target spreadsheet
  var ts = tss.getSheetByName('RAWData'); // ts = target sheet
  //set the target range to the values of the source data
  ts.getRange(A1Range).setValues(SData);

}  
16
ubique

Je suis tombé dessus aussi. J'ai réussi à trouver une solution de contournement de Nice qui copie tout le contenu d'une feuille à une autre (à l'exception des images, des graphiques, des scripts et d'autres éléments). Il copie les formules, les valeurs et les formate à coup sûr.

Fondamentalement, la solution consiste à 

  • copier la feuille source dans la feuille de calcul cible en tant que feuille source temporaire
  • copier les données de la feuille source temporaire dans la feuille cible
  • enlever la feuille de source temporaire

Code:

var sss = SpreadsheetApp.openById(spreadsheet); // sss = source spreadsheet
var ss = sss.getSheetByName(sheet); // ss = source sheet
var ss_temp = ss.copyTo(targetsheet);
var tss = SpreadsheetApp.openById(spreadsheet); // tss = target spreadsheet
var ts = tss.getSheetByName(sheet); // ts = target sheet
var range2Copy = ss_temp.getRange(range);
range2Copy.copyTo(ts.getRange(range));
bss.setActiveSheet(ss_temp);
bss.deleteActiveSheet()

Sur la base de ce qui précède, j'ai créé une feuille de calcul qui me permet de mettre à jour de nombreuses copies à partir d'une feuille de calcul principale. Avec environ 15 copies, il enregistre de nombreuses actions de copier-coller.

7

Peut-être que ce post vous aide http://l.rw.rw/gscripts3 . Il décrit les fonctionnalités de la fonction de copie avec différentes conditions (limiter les données par plage, filtres personnalisés, placer les données sur la cible avec des méthodes d'insertion ou de remplacement). Et a exemple de travail où vous pouvez l'essayer.

1
Oleg Shaydenko

Une autre méthode consiste à importer la ligne (ou toute plage) de la source dans la feuille de calcul cible.

En supposant que vous souhaitiez importer la ligne 3 de la feuille de la feuille de calcul source appelée "nom de feuille de feuille de calcul source", insérez la formule suivante dans la première colonne de l'emplacement cible: 

=IMPORTRANGE("source-spreadsheet-key","source-spreadsheet-sheet-name!3:3")

"source-spreadsheet-key" est l'ID unique de la feuille de calcul source que vous extrayez de son URL.

Si vous le faites pour la première fois, le message de sécurité apparaîtra:

enter image description here

Il suffit de confirmer et toute la ligne sera remplie automatiquement.

N'oubliez pas que la mise à jour des cellules importées prend parfois quelques minutes après que des modifications ont été apportées dans la zone source. Cependant, vous pouvez l'accélérer en appuyant sur ctrl-E ou ctrl-shift-E , tout en étant dans la feuille de calcul cible, selon le cas.

1
ellockie

Utilisez range.setValues, est le meilleur choix. Fonctionne pour n’importe quelle plage d’une feuille, dans la mesure où les plages d’origine et de destination sont similaires.

Voici un exemple de code:

function openCSV() {

  //Buscamos el archivo
  var files = DriveApp.getFilesByName("ts.csv");

  //Cada nombre de archivo es unico, por eso next() lo devuelve.
  var file = files.next();

  fileID = file.getId();

  //Abrimos la spreadsheet, seleccionamos la hoja
  var spreadsheet = SpreadsheetApp.openById(fileID);
  var sheet = spreadsheet.getSheets()[0];

  //Seleccionamos el rango  
  var range = sheet.getRange("A1:F1");
  values = range.getValues();

  //Guardamos un log del rango
  //Logger.log(values);

  //Seleccionamos la hoja de destino, que es la activeSheet 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var SSsheet = ss.getSheets()[0];

  //Seleccionamos el mismo rango y le asignamos los valores
  var ssRange = SSsheet.getRange("A1:F1");
  ssRange.setValues(values);

}
0
Pulpo

Cela ne fonctionne pas - renvoie une erreur "La plage cible et la plage source doivent figurer sur la même feuille de calcul." On dirait que nous devons faire quelque chose de similaire à ceci:

function copyRow_ (origSheetName, destSheetName, origRowNumber, destRowNumber)
{
  var origSheetObject = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(origSheetName);
  var destSheetObject = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(destSheetName);
  var origLastCol = origSheetObject.getLastColumn();
  var arrOrigData = origSheetObject.getRange(origRowNumber, 1, 1, origLastCol).getValues();
  var destlastRow = destSheetObject.getLastRow() + 1;
  if (destRowNumber)
    destlastRow = destRowNumber;
  var cont;
  for (cont = 0; cont < origLastCol; cont++)
       destSheetObject.getRange(destlastRow, 1+cont).setValue(arrOrigData[0][cont]);
}

(volé de manière flagrante de ici )

0
Sean