Google Sheets script pour fusionner les valeurs identique d'une colonne

Bonjour à tous

Je gère un tableau de gestion et j'ai un onglet qui est l'equivalent d'un relevé de compte.

J'utilise un script que me permet de fusionner toutes les cellule de valeur identique dans une colonne que j'execute manuellement.

Dans un tableau B28:N, rangé par date(B), dont la plage B28:M se rempli via plusieurs imports avec QUERY, la colonne B contient des dates d'operation et la colonne N reprend le mois et l'année de la date de la colonne B grace a une formule en ARRAYFORMULA en N27. La voici:

={"Période / Mois";ARRAYFORMULA(SI($B$26:$B<>"";TEXTE($B26:$B;"mmm")&CAR(10)&TEXTE($B$26:$B;"yyy");""))}

Mon problème est que quand les cellules de la colonne M sont fusionnées correctement et qu'une ligne s'ajoute et que j'execute le script, la fusion se fait de façon bizarre.

Je voudrais que automatiquement quand une nouvelle ligne s'ajoute, le script annule la fusion, reformatté les lignes de separation verticales et refusionné.

Voici mon sheet (problème onglet "BANQUE"):

Voici mon script:

function myFunction() {
  var start = 28; // Start row number for values.
  var c = {};
  var k = "";
  var offset = 0;
  var ss = SpreadsheetApp.getActiveSheet();

  // Retrieve values of column B.
  var data = ss.getRange(start, 14, ss.getLastRow(), 1).getValues().filter(String);

  // Retrieve the number of duplication values.
  data.forEach(function(e){c[e[0]] = c[e[0]] ? c[e[0]] + 1 : 1;});

  // Merge cells.
  data.forEach(function(e){
    if (k != e[0]) {
      ss.getRange(start + offset, 14, c[e[0]], 1).merge();
      offset += c[e[0]];
    }
    k = e[0];
  });
}

Merci d'avance.

à tester

function mergeCells() {
  const column = [14]; // These column number is the column "N"
  const sheetName = "BANQUE";  // Please set the sheetname.
  const firstRow = 28
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const rng = sheet.getRange(firstRow, column, sheet.getLastRow() - firstRow, 1)
  rng.getMergedRanges().forEach(m => m.breakApart())
  const data = rng.getValues().flat()
  let toThere = data.length - 1
  let fromHere = 0
  for (var i = data.length - 1; i > 0; i--) {
    if (data[i] != data[i - 1]) {
      sheet.getRange(firstRow + i, column, toThere - i + 1, 1).activate().merge()
      toThere = i - 1
    }
  }
  i = 0
  sheet.getRange(firstRow + i, column, toThere - i + 1, 1).activate().merge()
}

mais comme dit par ailleurs, je préfère jouer avec les MFC

Salut Mike, merci pour ta réponse.

Ce script fonctionne bien mais seulement pour fusionner. Ce que je voudrais, c'est qu'automatiquement, lorsqu'une nouvelle ligne est ajoutée, que le script annule la fusion, fusionne à nouveau et reformate les lignes de séparation verticales.

Je pense qu'il faudrait ajouter juste avant cette fonction mergeCells une fonction qui réinitialiserait la plage au format par défaut et ensuite exécuter mergeCells.

Je pense qu'il faudrait ajouter juste avant cette fonction mergeCells une fonction qui réinitialiserait la plage au format par défaut et ensuite exécuter mergeCells.

j'y ai inclus

.breakApart()

qui permet de tout défusionner, donc qui ré-initialise la plage

voir ici

rng.getMergedRanges().forEach(m => m.breakApart())

J'ai ajouter .breakApart() et aussi une fonction pour remettre au format.

function myFunction() {
  var start = 26; // Start row number for values.
  var c = {};
  var k = "";
  var offset = 0;
  var ss = SpreadsheetApp.getActiveSheet()

  // unmerge column B.
  var data = ss.getRange(start, 14, ss.getLastRow(), 1).breakApart();
  // add horizontal SOLID borders column B.
  var data = ss.getRange(start, 14, ss.getLastRow(), 1).setBorder(null, null, null, null, null, true, 'black', SpreadsheetApp.BorderStyle.SOLID);
  // Retrieve values of column B.
  var data = ss.getRange(start, 14, ss.getLastRow(), 1).getValues().filter(String);

  // Retrieve the number of duplication values.
  data.forEach(function(e){c[e[0]] = c[e[0]] ? c[e[0]] + 1 : 1;});

  // Merge cells.
  data.forEach(function(e){
    if (k != e[0]) {
      ss.getRange(start + offset, 14, c[e[0]], 1).merge();
      offset += c[e[0]];
    }
    k = e[0];
  });
}

Tout fonctionne sauf l'automatisation...

Pour l'automatisation

function onEdit(e) {

  let sh = e.source.getActiveSheet()
  let onglets = ['PAIEMENTS', 'ENCAUSSEMENTS', 'IMPORTS']
  if (onglets.indexOf(sh.getName()!=-1)){
    mergeCells
  }

.. ensuite le reste de ton code onEdit(e)

C'est bon c'est parfait! Merci Mike

Il fallait simplement ajouter "()" après mergeCells comme ça : mergeCells()

Rechercher des sujets similaires à "google sheets script fusionner valeurs identique colonne"