Script pour dupliquer feuille et supprimer lignes vides

Bonsoir,

J'ai une feuille qui me sert de modèle que je duplique à chaque fois que je remplis le tableau.

Jusque là par trop de problème, le script duplique le modèle en le renommant en fonction d'une date dans une cellule (même s'il a fallu tricher en utilisant la fonction texte dans une autre cellule pour récupérer la date).

Mon problème, c'est pour supprimer les lignes éventuellement vides du tableau, celui-ci commençant en A7.

Mon script supprime non seulement les lignes vides du tableau mais aussi celles entre le texte et le haut du tableau.

Et en plus il supprime les formules de la dernière ligne du tableau en figeant les résultats.

Quelqu'un a-t-il une solution pour ne supprimer que les lignes vides du tableau et conserver les formules de la dernières lignes ?

Merci d'avance.

Bonjour,

peux-tu donner une copie de ton script actuel afin qu'on puisse le modifier ?

Bonsoir,

C'est des morceaux de scripts que j'ai récupéré et modifié....parce qu'en fait, je n'ai aucune notion en programmation ni en javascript.

function simpleduplicatesheet(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var toto=ss.getSheetByName('modèle');  
var nb=ss.getNumSheets();
var nom=ss.getRange('B3').getValue();
var sheet = ss.getActiveSheet();
if (sheet.getName()==='modèle'){

  sheet2 = sheet.copyTo(ss).setName(nom);
}
 var data = sheet2.getDataRange().getValues();
  var targetData = new Array();
  for(n=1;n<data.length;++n){
    if(data[n].join().replace(/,/g,'')!=''){ targetData.push(data[n])};
    Logger.log(data[n].join().replace(/,/g,''))
  }
  sheet2.getDataRange().clear();
  sheet2.getRange(7,1,targetData.length,targetData[1].length).setValues(targetData);
}

Merci de votre aide.

Une proposition, change supp_si_vide qui est le nom de ma feuille de test

function supp_lignes_vides() {
  var document = SpreadsheetApp.getActive();
  var f = document.getSheetByName('supp_si_vide');
  var derL = f.getLastRow();
  var derC = columnToLetter(f.getLastColumn());
  for (var numL = derL; numL > 0; numL--){
    var der = f.getLastColumn();
    var vals = f.getRange("A" + numL + ":" + derC + numL).getValues()[0];
      for (var i = 0; i < vals.length; i++) {
      var thisCellContents = vals[i];
      Logger.log('thisCellContents: ' + thisCellContents);
      if (thisCellContents === "") {
        der = der - 1;
      }
    }
    if (der === 0) {
      f.deleteRow(numL);
    }
  }
}

avec

function columnToLetter(column) {
  var temp, letter = '';
  while (column > 0) {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}

La function supp_lignes_vides supprime toutes les lignes du tableau mais aussi toutes les lignes du dessus.

Par contre, je ne vois pas trop ce que fait la function columToLetter !!!

La function supp_lignes_vides supprime toutes les lignes du tableau mais aussi toutes les lignes du dessus.

Chez moi cela fonctionnait, curieux ! de toute façon je la trouvais lente, je vais reprendre et optimiser. J'ajouterais un commentaire (msgbox).

Il est vrai que j'avais oublié que les données commençaient ligne 7.

Par contre, je ne vois pas trop ce que fait la function columToLetter !!!

Elle n'était utile que pour le msgbox que j'avais supprimé ... et que je rajouterait peut-être pour le debogage

situation de départ

capture d ecran 179

après passage de la fonction ( j'ai juste indiqué 6 au lieu de 0)

capture d ecran 180
function supp_lignes_vides() {
  var document = SpreadsheetApp.getActive();
  var f = document.getSheetByName('supp_si_vide');
  var derL = f.getLastRow();
  var derC = columnToLetter(f.getLastColumn());
  for (var numL = derL; numL > 6; numL--){
    var der = f.getLastColumn();
    var vals = f.getRange("A" + numL + ":" + derC + numL).getValues()[0];
      for (var i = 0; i < vals.length; i++) {
      var thisCellContents = vals[i];
      Logger.log('thisCellContents: ' + thisCellContents);
      if (thisCellContents === "") {
        der = der - 1;
      }
    }
    if (der === 0) {
      f.deleteRow(numL);
    }
  }
}

j'ai bien supprimé les lignes 8, 12 et 14

un peu plus rapide

function supp_lignes_vides() {
  var document = SpreadsheetApp.getActive();
  var f = document.getSheetByName('supp_si_vide');
  var derL = f.getLastRow();
  var derC = columnToLetter(f.getLastColumn());
  for (var numL = derL; numL > 6; numL--){
    var ok = 1;
    var vals = f.getRange("A" + numL + ":" + derC + numL).getValues()[0];
    for (var i = 0; i < vals.length; i++) {
      var val = vals[i];
      if (val !== "") {
        ok = 0;
        break;
      }
    }
    if (ok === 1) {
      f.deleteRow(numL);
    }
  }
}

Je ne comprends pas, ça ne marche pas chez moi, même en reproduisant la même feuille que vous !!

supprimer lignes vides

Désolé, enlève cette ligne qui ne sert plus à rien (c'était dans le cas d'un débogage avec msgbox)

var derC = columnToLetter(f.getLastColumn());

Bonjour,

J'ai essayé avec votre 'tableau', ça fonctionne mais pas avec le mien !

En plus, je me suis planté, je ne veux surtout pas supprimer les lignes vides du modèles mais celles des feuilles dupliquées du modèle mais pas au moment de l'enregistrement.

Je veux supprimer les lignes vides de la feuille active. J'ai trouvé un script qui marche mais il supprime les lignes au ralenti !

J'ai aussi un problème au moment de la duplication, il renomme le fichier copié en fonction de la valeur en B5, une date, du coup, le nom de la feuille est super long.

J'ai triché en récupérant le nom de la feuille en D5 qui transforme la date en B5 en texte.

Le script fonctionne mais ce n'est pas vraiment optimisé !

test
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries =[];
menuEntries.push({name: "Suppr Lignes", functionName: "deleteRows"});
menuEntries.push(null);
ss.addMenu("✔️Suppr Lignes✔️", menuEntries);
}

function simpleduplicatesheet(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var toto=ss.getSheetByName('Modèle');  
var nb=ss.getNumSheets();
var nom=ss.getRange('D5').getValue();
var sheet = ss.getActiveSheet();

if (sheet.getName()==='Modèle'){

  sheet2 = sheet.copyTo(ss).setName(nom);

}
var images = sheet2.getImages();
var img = images[0];
img.remove(); // Here

 toto.getRange('B5').clearContent();
 toto.getRange('A10:D35').clearContent();
 toto.getRange('F10:S35').clearContent();
}

function deleteRows(){
var sheet = SpreadsheetApp.getActiveSheet();
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();

   var rowsDeleted = 0;
   for (var i = 9; i <= 35 - 1; i++) {
   var row = values[i];
   if (row[0] == '' && row[19] == '') {
  sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
  rowsDeleted++;
   }
  }
}

En plus, je me suis planté, je ne veux surtout pas supprimer les lignes vides du modèles mais celles des feuilles dupliquées du modèle mais pas au moment de l'enregistrement.

Je veux supprimer les lignes vides de la feuille active. J'ai trouvé un script qui marche mais il supprime les lignes au ralenti !

dans ce cas, c'est assez simple de changer la feuille concernée dans le programme que j'ai proposé

var f = document.getActiveSheet();

mais si tu as trouvé un programme de suppression de lignes (que j'avais posté), dans ce cas je n'ai plus rien à faire ...

Votre programme fonctionne bien avec votre exemple mais je n'ai pas réussi à le faire fonctionner avec mon tableau.

En tout cas, je vous remercie pour votre aide et votre temps.

Rechercher des sujets similaires à "script dupliquer feuille supprimer lignes vides"