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?.
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.
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);
}
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 à
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.
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.
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")
où "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:
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.
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);
}
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 )