Exporter plages vers autre classeur

Bonjour à tous,

Je souhaiterai exporter des plages spécifiques de ma feuille actuelle (ex: 'A1:F5' et 'I8:L20') vers un classeur spécifique (déjà créé) sur une nouvelle feuille.

J'ai commencé avec ce code :

function xport() {

  var sourceSheet = SpreadsheetApp.openById(getFileId('1iZe994nlDRWxL13iXL0B03C3sTruE05h...')).getActiveSheet()[0];
  var targetSs = SpreadsheetApp.openById(getFileId('1se1Ux7YfOtxErL8U84875G_lTdLI...'));

  sourceSheet.copyTo(targetSs);

}

Mais cela ne marche pas et je suis loin d'arriver à mes fins.

Je vous remercie pour votre aide.

Bien à vous.

Bonjour,

faut-il encore définir la fonction getFileId, ce qui n'est toutefois pas nécessaire ici car l'argument que tu mets est déjà un id

première correction

var sourceSheet = SpreadsheetApp.openById('#####').getSheets()[0];

ceci te donnera la première feuille du fichier

à partir de là, fais

console.log(sourceSheet.getRange('A1:F5').getValues())

pour vérifier ce premier point

Bonjour Steelson,

Merci, une fois de plus pour votre aide.

Encore néophyte, je me rends compte de mes erreurs.

Merci pour la première correction.

Par contre, je n'arrive pas à exploiter votre deuxième point.

J'ai continué à essayer avec ce code :

function xport() {

  var sourceSs = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheet = sourceSs.getActiveSheet();

  var sourceRange = sourceSheet.getDataRange();
  var A1Range = sourceRange.getA1Notation();

  var sourceData = sourceRange.getValues();

  var targetSs = SpreadsheetApp.openById('1se1Ux7YfOtxErL8U84875G_lTdLIgFukXe0foTqs...');
  var targetSheet = targetSs.getSheetByName('Feuille 1');

  targetSheet.getRange(A1Range).setValues(sourceData);

Mais il ne copie que la première feuille de mon classeur actif et surtout, je ne souhaite pas copier toute la feuille active mais seulement des ranges de cette feuille et ce, en créant une nouvelle feuille.

Dans mon projet, cela me permettrait de formater ma feuille différemment afin de la destiner à d'autres utilisateurs.

Merci encore.

1- Mais il ne copie que la première feuille de mon classeur actif

2- et surtout, je ne souhaite pas copier toute la feuille active mais seulement des ranges de cette feuille et ce,

3- en créant une nouvelle feuille.

Il y a 3 points dans ta question

pour le 1

var sourceSheet = SpreadsheetApp.openById(getFileId('1iZe994nlDRWxL13iXL0B03C3sTruE05h...')).getSheetByName('le nom de la feuille')

ou bien, puisque tu sembles avoir changé le début

  var sourceSs = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheet = sourceSs.getSheetByName('le nom de la feuille')

pour le point 2

var sourceRange = sourceSheet.getRange('A1:F5');

pour le point 3

  var targetSs = SpreadsheetApp.openById('1se1Ux7YfOtxErL8U84875G_lTdLIgFukXe0foTqs...');
  var targetSheet = targetSs.insertSheet('ma nouvelle feuille');

Bonjour Steelson,

Je vous remercie une fois de plus.

Le code donné fonctionne bien.

Cependant, ce qui m'intéresserait, c'est de :

1. exporter les données de ma feuille actuelle sans devoir la nommer car son nom n'est pas forcément connu à l'avance : une side barre avec un item 'Export' me permet d'accéder à ma fonction xport().

2. le nom de la feuille de destination doit prendre le nom de la feuille source.

J'ai essayé ce code (puisque ça ne marchait pas avec getActiveSheet seul) afin de fixer ma feuille actuelle comme source, mais cela ne copie toujours que la première feuille de mon classeur.

function xport() {

  var sourceSs = SpreadsheetApp.getActiveSpreadsheet();
  var actualSheet = sourceSs.getActiveSheet();
  var actualSheetName = actualSheet.getName();
  var sourceSheet = sourceSs.getSheetByName(actualSheetName);

  var sourceRange = sourceSheet.getRange('A1:F5');
  var A1Range = sourceRange.getA1Notation();

  var sourceData = sourceRange.getValues();

  var targetSs = SpreadsheetApp.openById('1se1Ux7YfOtxErL8U84875G_lTdLIgFukXe0foTqs...');
  var targetSheet = targetSs.insertSheet(actualSheetName);

  targetSheet.getRange(A1Range).setValues(sourceData);

}

Une solution ?

J'ai essayé ce code (puisque ça ne marchait pas avec getActiveSheet seul) afin de fixer ma feuille actuelle comme source, mais cela ne copie toujours que la première feuille de mon classeur.

c'est parce que tu es positionné sur la première feuille du classeur, choisi en une autre avant de lancer le script

essaie ceci (sans fichier c'est difficile de tester)

function xport() {
  var sourceSs = SpreadsheetApp.getActiveSpreadsheet();
  var actualSheet = sourceSs.getActiveSheet();
  var rng = 'A1:F5'
  var sourceData = actualSheet.getRange(rng).getValues();
  var targetSs = SpreadsheetApp.openById('1se1Ux7YfOtxErL8U84875G_lTdLIgFukXe0foTqs...');
  var targetSheet = targetSs.insertSheet(actualSheet.getName());
  targetSheet.getRange(rng).setValues(sourceData);
}

Bonjour Steelson,

Décidément, vous portez pratiquement à vous seul cette partie du forum ! C'est admirable !

Je vous remercie encore.

J'ai pris du temps à répondre car j'ai été un peu découragé par le fait que le script continuait à n'exporter que la première feuille de mon classeur source.

J'ai donc pris un autre ordinateur et j'ai constaté que le code fonctionnait.

J'ai alors, rebooté, vidé le cache et les cookies : rien à faire...

Et puis ce soir, surprise ! cela fonctionne sur mon ordi : allez comprendre...

J'ai tout de même encore des petits problèmes : la fonction .copyTo(destination {formatOnly:true}) ne fonctionne pas sur un autre classeur et pourtant j'ai besoin que le format soit aussi exporté.

J'ai donc épluché les différentes fonctions du guide google apps script et ai sortie ce code :

function xport() {

  var sourceSs = SpreadsheetApp.getActiveSpreadsheet();
  var actualSheet = sourceSs.getActiveSheet();

  var range = 'A1:F5'
  var getR = actualSheet.getRange(range);

  var sourceData = getR.getValues();
  var sourceBackgrounds = getR.getBackgrounds();
  var sourceFontSizes = getR.getFontSizes();
  var sourceFontLines = getR.getFontLines();
  var sourceFontColors = getR.getFontColors();
  var sourceFontFamilies = getR.getFontFamilies();
  var sourceFontStyles = getR.getFontStyles();
  var sourceFontWeights = getR.getFontWeights();
  var sourceHorizontalAlignments = getR.getHorizontalAlignments();
  var sourceVerticalAlignments = getR.getVerticalAlignments();
  var sourceNumberFormats = getR.getNumberFormats();
  var sourceTextRotations = getR.getTextRotations();

  var targetSs = SpreadsheetApp.openById('1se1Ux7YfOtxErL8U84875G_lTdLIgFukXe0foTqsmkQ');
  var targetSheet = targetSs.insertSheet(actualSheet.getName());

  targetSheet.getRange(range).setValues(sourceData).copyFormatToRange(targetSheet, 1, 6, 1, 5);

  targetSheet.getRange(range).setBackgrounds(sourceBackgrounds).setFontSizes(sourceFontSizes).setFontLines(sourceFontLines).setFontColors(sourceFontColors).setFontFamilies(sourceFontFamilies).setFontStyles(sourceFontStyles).setFontWeights(sourceFontWeights).setHorizontalAlignments(sourceHorizontalAlignments).setVerticalAlignments(sourceVerticalAlignments).setNumberFormats(sourceNumberFormats).setTextRotations(sourceTextRotations);

}

J'ai essayé la fonction copyFormatToRange() mais cela n'a pas l'effet escompté.

Avec ma méthode "système d", je me retrouve avec 2 sujets à régler :

1. J'ai des cellules fusionnées dans mon range que je voudrais retrouver sur la feuille de destination (j'ai trouvé getMergedRanges sans trop de succès).

2. Je voudrais également récupérer et appliquer les dimensions des différents colonnes et lignes.

Je vous remercie de nouveau

Vaste programme, et cela devient très très compliqué.

Du coup, je me demande s'il ne faut pas suivre une autre voie qui serait de dupliquer toute la feuille (cela devrait dupliquer les formats, cellules fusionnées et tailles de cellules), puis tout effacer et ne conserver que les valeurs souhaitées (ou tout effacer et recopier seulement les valeurs).

J'essaierai d efaire un essai dans la journée.

plus simple

function xport() {
  var sourceSs = SpreadsheetApp.getActiveSpreadsheet();
  var actualSheet = sourceSs.getActiveSheet();

  var targetSs = SpreadsheetApp.openById('1ZPU1JyozSe87Vbd86p_wVmg6P94t9pFGrf5tN29VGJM');
  var targetSheet = actualSheet.copyTo(targetSs);

  var old = targetSs.getSheetByName(actualSheet.getName());
  if (old) targetSs.deleteSheet(old);

  targetSheet.setName(actualSheet.getName())

  var rng = 'B4:C5'
  var sourceData = actualSheet.getRange(rng).getValues();
  targetSheet.getDataRange().clearContent()
  targetSheet.getRange(rng).setValues(sourceData);
}

Super !

Ca marche !

Merci !!!

Rechercher des sujets similaires à "exporter plages classeur"