Sauvegarder donnees tableau dans un autre onglet

Bonjour la communauté,

J'ai un tableau EXCEL qui fonctionne parfaitement et je souhaite le reproduire sur SHEETS.

Forcément je me retrouve avec quelques difficultés, notamment pour traduire la macro qui consiste à recopier le contenu de mon tableau "tableau de pret" dans l'onglet "sauvegarde" en indiquant la date du jour de la sauvegarde et en dessous des précédents enregistrements (ligne 16). Une fois la sauvegarde effectuée, le contenu du "tableau de prêt" est effacé.

Merci pour votre aide.

Voici le lien

https://docs.google.com/spreadsheets/d/1olKgHQZiNLJjY1MW-TFC9aD1O9xP2CLG1F0eOY8jI4o/edit?usp=sharing

Merci à la personne qui a détruit mon travail en cours ...

bon je recommence sur une copie.

Bonjour,

function sauvegarde(){
  const classeur = SpreadsheetApp.getActiveSpreadsheet();
  const donnees = classeur.getSheetByName("Tableau des prets");
  const resultat = classeur.getSheetByName("sauvegardes");
  const date = donnees.getRange("D2").getValue();
  var plage = donnees.getRange("A5:D100").getValues();
  var stock = [];
  var n = resultat.getRange("F1").getValue();
  for(i=0;i<plage.length;i++){
    if((plage[i][0] != "" && plage[i][1] != "") && (plage[i][2] != "" && plage[i][3] != "")){
      stock.push([date,plage[i][0],plage[i][1],plage[i][2],plage[i][3]])
    }
  }
  for(i=0;i<stock.length;i++){
    resultat.getRange(n+i,1).setValue(stock[i][0])
    resultat.getRange(n+i,2).setValue(stock[i][1])
    resultat.getRange(n+i,3).setValue(stock[i][2])
    resultat.getRange(n+i,4).setValue(stock[i][3])
    resultat.getRange(n+i,5).setValue(stock[i][4])
  }
}

Avec en F1

=NBVAL(A4:A)+4

Bonne Journée

Mince mikhail,

Je sais pas si c'est moi qui à détruit ton travail, mais j'ai crée un projet App Script Sauvegarde.

Si c'est moi dis-le.

Bonjour,

pas grave, j'ai recommencé, mais c'est le lot des fichiers partagés sans doute ...

je l'ai fait plutôt en ajoutant un menu en haut à droite

function onOpen(e) {
  SpreadsheetApp.getUi()
    .createMenu('↓ ARCHIVER ↓')
    .addItem('→ Lancer le script ', 'archiver')
    .addToUi();
}

function archiver(){
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f1 = doc.getSheetByName('Tableau des prets');
  var f2 = doc.getSheetByName('sauvegardes');
  var derLigne = getLastDataRow(f1);
  if( derLigne > 4){
    var d=[]
    var data=f1.getRange(5,1,derLigne-4,f1.getLastColumn()).getValues()
    var ligne = getLastDataRow(f2)+1 
    f2.getRange(ligne,2,derLigne-4,f1.getLastColumn()).setValues(data)
    for (var i=5;i<=derLigne;i++){d.push([new Date()])}
    f2.getRange(ligne,1,derLigne-4,1).setValues(d)
    f1.getRange(5,1,derLigne-4,f1.getLastColumn()).clearContent()
  }
}

function getLastDataRow(f) {
  var lastRow = f.getLastRow();
  var range = f.getRange("A" + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }              
}

https://docs.google.com/spreadsheets/d/1v7hGN4YfEU-IgIPJY1oyI9Z9Hx9g3B9QG0HXC_NyEyg/edit?usp=sharing

@Imoke,

ton code est intéressant, tu peux ne pas figer la fin de la plage en cherchant la dernière ligne renseignée

var plage = donnees.getRange("A5:D"+getLastDataRow(donnees)).getValues();

en testant quand même que la dernière ligne est >4 !

et globalement restituer le résultat comme suit

resultat.getRange(getLastDataRow(resultat)+1, 1, stock.length, stock[0].length).setValues(stock);

... enfin à tester !

J'ai retravaillé le code.

Merci mikhail pour les idées, et un controle si la plage n'est pas vide

function sauvegarde(){
  const classeur = SpreadsheetApp.getActiveSpreadsheet();
  const donnees = classeur.getSheetByName("Tableau des prets");
  const resultat = classeur.getSheetByName("sauvegardes");
  const date = donnees.getRange("D2").getValue();
  var plage = donnees.getRange("A5:D100").getValues();
  var stock = [];
  var ligne = resultat.getRange("A4:A1000").getValues();
  var n = 0;
  var c = 0;
  for(i=0;i<ligne.length;i++){
    if(ligne[i] != ""){
      n++
    }
  }
  for(i=0;i<plage.length;i++){
    if((plage[i][0] != "" && plage[i][1] != "") && (plage[i][2] != "" && plage[i][3] != "")){
      stock.push([date,plage[i][0],plage[i][1],plage[i][2],plage[i][3]]);
    }else{
      c = c+1;
    }
  }
  if(c==i){
    Browser.msgBox("Veuillez remplir les cellules");
    donnees.getRange("A5").activate();
  }else{
    resultat.getRange(n+4,1,stock.length,5).setValues(stock);
    donnees.getRange(5,1,stock.length,4).clearContent();
  }
}

Bonne Journée

Bonjour et merci pour votre aide... cette communauté est géniale !

Du coup je regarde ça après mangé et et je reviens vers vous pour le code, il y a 2 ou 3 points que je comprends pas. Notamment pourquoi le bouton "SAUVEGARDE" n'est plus là pour lancer la MACRO. Faut il préféré faire F1 ?

Bon app

J'ai juste supprimé pour ma part le bouton car je préfère travailler avec un menu. Mais tu peux le conserver, appuyer sur les 3 points verticaux de l'image et affecter le script.

Encore merci à tous,

Le code fonctionne parfaitement.

Je vais essayer de l'adapter à mon tableau original...

Bonne journée à vous

Rechercher des sujets similaires à "sauvegarder donnees tableau onglet"