Script "Archiver" / "Transposer"

Bonsoir,

Je cherche à archiver certaines des données (A2 : A et V2 : V) d'une feuille vers une autre feuille du même classeur.
La nom de la feuille d'archivage est défini par la cellule contenue en FEUILLE1!A1.

J'essaie d'adapter ce script, mais sans succès malheureusement.
Il y a donc qqch que je fais mal, mais je n'arrive pas à comprendre quoi à ce stade.
En lançant le script, il semble que 2 erreurs surviennent :
- "SpreadsheetApp" n'est pas une fonction
- ."clear"n'est pas une fonction

function Archiver(){
  var ss = SpreadsheetApp.openById('ID DU FICHIER'); 
  var sh = ss.getSheetByName('FEUILLE1')
  var values1 = sh.getRange('A2:A'+sh.getLastRow()).getValues()
  var values2 = sh.getRange('V2:V'+sh.getLastRow()).getValues()

  var data = transpose([...transpose(values1), ...transpose(values2)]);
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('FEUILLE1').getRange('A1').getValue();
SpreadsheetApp().getActiveSpreadsheet().getSheetByName('FEUILLE1').getRange('A1').getValue().clear()
  sh.getRange(1,1,data.length,data[0].length).setValues(data)
}
function transpose(a){
  return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}

Merci pour vos solutions, si vous en avez !
Bonne soirée.

FG

Bonjour,

À tester

function myFunction() {
  const fichierSource = SpreadsheetApp.openById("ID DU FICHIER SOURCE"); // tu peux aussi faire openByURL
  const fichierArchive = SpreadsheetApp.getActiveSpreadsheet();
  const sheetSource = fichierSource.getSheetByName("FEUILLE1"); // attention à la casse, nom feuille source
  const sheetArchive = fichierArchive.getSheetByName("FEUILLE1"); // attention à la casse, nom feuille archive

  var valColA = sheetSource.getRange('A1:A' + sheetSource.getLastRow()).getValues();
  var valColB = sheetSource.getRange('B1:B' + sheetSource.getLastRow()).getValues();
  var data = valColA.map(function(row, index) { // + simple que de passer par une fonciton supplémentaire transpose
    return row.concat(valColB[index]);
  });

  sheetArchive.getRange(1,1,data.length,data[0].length).setValues(data)
}

PS : je n'ai pas corrigé le clear car je ne comprends pas à quoi il sert.

Bonjour Pierre,

Merci pour ta réponse.
Le nom de ma feuille "Archive" est évolutif. Il est situé en FEUILLE1!A1. Il ne peut donc être cité en tant que "FEUILLE2" par exemple.

Le "clear", quant à lui, a vocation à effacer le contenu de la feuille de destination.

Ok, si suffit d'ajouter : sheetArchive.getDataRange().clear();

Merci Pierre concernant la fonction "clear".
Pour ce qui est de ma feuille "Archive", tu ne vois donc pas de solution permettant de faire appel à un nom de feuille contenu dans une cellule du classeur ?
Le nom de cette feuille n'est pas figé, je ne peux donc l'appeler "Archive" dans le script.

Oui il est possible de ne pas mettre la feuille dans le script mais une cellule, idem pour l'url ou l'id du fichier, si on se focalise sur la feuille d'archivage :

  const sheetArchive = fichierArchive.getSheetByName("FEUILLE1"); // attention à la casse, nom feuille archive
On peut la remplacer par, dans cette exemple la cellule A1 de la feuille "FEUILLE1" du fichier d'archivage :
  const sheetArchive = fichierArchive.getSheetByName(fichierArchive.getSheetbyName("FEUILLE1").getRange("A1").getValue());

Je viens de le tester, et l'exécution du script me renvoie une erreur "TypeError: fichierArchive.getSheetbyName is not a function".

normal, j'ai pas mis de majuscule à "By", voici la correction :

  const sheetArchive = fichierArchive.getSheetByName(fichierArchive.getSheetByName("FEUILLE1").getRange("A1").getValue());

Mais ouiii ! Et je suis moi aussi passé à côté ! Merci !
Tout fonctionne parfaitement.
Merci beaucoup pour ton aide !

Rechercher des sujets similaires à "script archiver transposer"