voici LA solution plus rapide
function miseAPlat() {
const bd = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BD')
bd.clearContents()
const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Original')
const data = sh.getRange(2, 1, sh.getLastRow() - 1, sh.getLastColumn()).getDisplayValues()
const info = sh.getRange(1, 8, 1, sh.getLastColumn() - 7).getValues()
const nbInfo = info[0].length
const nbData = 5
let levelMax = 0
let headers = []
let result = []
data.forEach(r => levelMax = Math.max(levelMax, r[1]))
for (let i = 1; i <= levelMax; i++) {
headers.push(['NAME level ' + i, 'REFERENCE level ' + i, 'DESCRIPTION level ' + i, 'TYPE level ' + i, 'AERA level ' + i,])
}
headers = headers.flat()
for (let i = 1; i <= levelMax; i++) {
info.forEach(x => x.forEach(y => headers.push(y + ' level ' + i)))
}
result.push(headers)
let prov=[]
data.forEach(function (r, i) {
for (let x = 0; x < nbData; x++) {
prov[nbData * (r[1] - 1) + x] = r[x + 2]
}
if (r[1] < levelMax) {
for (let y = (r[1] * 1 + 1); y <= levelMax; y++) {
for (let x = 0; x < nbData; x++) {
prov[nbData * (y - 1) + x] = ''
}
}
}
for (let x = 0; x < nbInfo; x++) {
prov[nbInfo * (r[1] - 1) + x + (nbData * levelMax)] = r[x + 7]
}
if (r[1] < levelMax) {
for (let y = (r[1] * 1 + 1); y <= levelMax; y++) {
for (let x = 0; x < nbInfo; x++) {
prov[nbInfo * (y - 1) + x + (nbData * levelMax)] = ''
}
}
}
if (i < data.length - 1) {
if (data[i + 1][1] <= data[i][1]) {
result.push([...prov])
}
}
else {
result.push([...prov])
}
})
bd.getRange(1,1,result.length,result[0].length).setValues(result)
}