Récupérer un range avec variables

Bonjour bonjour,

Me revoilà (encore) avec un petit souci de syntaxe...

Je voudrais que mon script m'analyse des valeurs de cellules lignes après lignes dans une seule colonne et que si une ou plusieurs valeurs sont identiques, alors les cellules se fusionnent.

Voici mon script:

// Fusion des cellules identiques

function mergecells() {

var spreadsheet = SpreadsheetApp.getActive();
var sheetMeans = spreadsheet.getSheetByName("My_planning");

var lastRowMeans=sheetMeans.getLastRow();

for (var a=2;a<=lastRowMeans;a++){

  var b=a+1
  var Course = sheetMeans.getRange('B'+a).getValue();
  var CourseNext = sheetMeans.getRange('B'+b).getValue();

  if (Course == CourseNext) {
    sheetMeans.getRange('B'+a:'B'+b).merge();
  }
}
}

Mon souci se situe sur la ligne suivante:

sheetMeans.getRange('B'+a:'B'+b).merge();

Je n'arrive pas à trouver la bonne syntaxe pour donner mon range avec 2 variables (ligne actuelle et ligne suivante).

Pouvez-vous m'aider svp?

PS: Il est fort possible que je n'emploie pas la bonne méthode non plus pour effectuer cette action... :-)

Si ça peut aider à la compréhension, voici une capture d'écran de mon fichier :

image

J'ai mis en couleur les numéros de cours identiques où j'aimerai que les cellules soient fusionnées (afin d'avoir ce résultat-là - que j'ai fait à la main bien sûr) :

image

Bonjour,

j'ai horreur des cellules fusionnées, on ne peut plus rien en tirer (filtre, tri, tcd, erc.), il vaut mieux utiliser les MFC comme ici https://www.excel-pratique.com/fr/telechargements/doc-excel/fusionner-mfc-excel-no474 qu'il faudrait que je reprenne sous GSheets

néanmoins, juste pour savoir si mes neurones résistent encore à la canicule, j'ai fait ceci

function fusions() {
  var f = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  var avant = ''
  var depuis = 1
  f.getRange('B:B').getValues().flat().forEach((v, i) => {
    if (i == 0) { avant = v }
    if (v != avant && i > 0) {
      if (depuis != i) {
        f.getRange('B' + depuis + ':B' + i).merge()
      }
      avant = v
      depuis = i + 1
    }
  })
}

pour reprendre ton exemple, au moins sur la ligne que tu dis être en défaut, il faut inclure : juste avant B

sheetMeans.getRange('B'+a+':B'+b).merge();

je préfère quand même le faire avec des MFC

2 exemples de résultats ...

  • le premier n'est malheureusement possible qu'en passant d'abord par excel, car les bordures ne sont pas programmables avec Google Sheets, mais elles sont conservées si on importe d'excel la feuille !
  • le second que l'on peut encore améliorer en n'affichant la donnée qu'en milieu de plage (je vais chercher une formule pour le faire)
image image

avantages : la donnée reste dans les cellules invisibles, on peut donc trier, faire des recherches, appliquer des queries, effectuer des TCD etc. on ne dénature pas le tableau, on allège juste la présentation

Merci infiniment car c'est exactement ce dont j'avais besoin :-)

Moi aussi je n'aime pas trop les cellules fusionnées, mais dans mon cas ce fichier ne sert qu'à de la visualisation (ce sera un planning en fait).

En tous cas, encore merci....et à bientôt pour de nouvelles questions ;-)

Reeeeeeeee :-)

Je reviens car je suis une quiche et je n'arrive pas à comprendre comme il faut le fonctionnement du script que vous m'avez communiqué (qui marche au TOP!!!)

function fusions() {
  var f = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  var avant = ''
  var depuis = 1
  f.getRange('B:B').getValues().flat().forEach((v, i) => {
    if (i == 0) { avant = v }
    if (v != avant && i > 0) {
      if (depuis != i) {
        f.getRange('B' + depuis + ':B' + i).merge()
      }
      avant = v
      depuis = i + 1
    }
  })
}

mais ce que j'aimerai faire c'est que dès que le script me merge des cellules dans une colonne, il me fasse la même chose aux même lignes d'une (ou plusieurs) autres colonnes...l'image ci-dessous est peut-être plus claire que mes explications

image

On voit que pour une même numéro de cours (par exemple celui en jaune fluo), le "course type" est identique ainsi que les "comments".

Est-ce donc possible de répliquer le script donné aux colonnes C et H pour avoir le résultat comme l'image ci-dessous?

image

Encore sorry de quémander de l'aide... :-(

pas de soucis pour expliquer le bazar

function fusions() {
  var f = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  var avant = ''
  var depuis = 1
  f.getRange('B:B').getValues().flat().forEach((v, i) => {
    if (i == 0) { avant = v }
    if (v != avant && i > 0) {
      if (depuis != i) {
        f.getRange('B' + depuis + ':B' + i).merge()
      }
      avant = v
      depuis = i + 1
    }
  })
}

le but du script est de repérer les ruptures de valeurs, donc je mémorise une valeur avant avec son n° de ligne (*) dans depuis, et si la valeur courante v est différente et la ligne courante plus grande que depuis + 1 (en clair ce n'est pas la suivante), alors je fusionne

(*) attention, dans un array, les indices commencent à 0, donc la ligne courante est égale à indice + 1

si seul le critère en B est "maître", alors tu peux compléter comme suit

      if (depuis != i) {
        f.getRange('B' + depuis + ':B' + i).merge()
        f.getRange('C' + depuis + ':C' + i).merge()
        f.getRange('H' + depuis + ':H' + i).merge()
      }

Aaaaaaaaaah ok!!!!

Merci beaucoup! Là au moins je commence à comprendre :-)

Au top Steelson

on aurait même pu adapter cette version avec juste des MFC

image
Rechercher des sujets similaires à "recuperer range variables"