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()
}