Conversion contenu google sheet en BD

après plusieurs heures

correction ci-après

merci, je vais pouvoir travailler sur ma BD et faire quelques traitements

J'ai apporté une petite correction, mais je n'ai pas réussi pour le moment à réduire le temps d'exécution.

function miseAPlat() {
  var bd = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BD')
  bd.clearContents()

  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Original')
  var data = sh.getRange(2, 1, sh.getLastRow() - 1, sh.getLastColumn()).getDisplayValues()
  var info = sh.getRange(1, 8, 1, sh.getLastColumn() - 7).getValues()
  var nbInfo = info[0].length
  var nbData = 5

  var levelMax = 0
  var headers = []
  var result = []
  data.forEach(r => levelMax = Math.max(levelMax, r[1]))

  for (var 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 (var i = 1; i <= levelMax; i++) {
    info.forEach(x => x.forEach(y => headers.push(y + ' level ' + i)))
  }
  bd.appendRow(headers)

  var nb = (nbData + nbInfo) * levelMax
  var prov=[]

  data.forEach(function (r, i) {

    for (var x = 0; x < nbData; x++) {
      prov[nbData * (r[1] - 1) + x] = r[x + 2]
    }

    if (r[1] < levelMax) {
      for (var y = (r[1] * 1 + 1); y <= levelMax; y++) {
        for (var x = 0; x < nbData; x++) {
          prov[nbData * (y - 1) + x] = ''
        }
      }
    }

    for (var x = 0; x < nbInfo; x++) {
      prov[nbInfo * (r[1] - 1) + x + (nbData * levelMax)] = r[x + 7]
    }

    if (r[1] < levelMax) {
      for (var y = (r[1] * 1 + 1); y <= levelMax; y++) {
        for (var 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]) {
        bd.appendRow(prov)
      }
    }
    else {
      bd.appendRow(prov)
    }

  })

}

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)

}

Ah ouais, nettement plus rapide

Par curiosité, comment vous avez fait pour optimiser le script

Vous avez utiliser des fonctions différentes ?

La seule chose qui diffère, et que je cherchais à mettre au point, c'est remplacer les appendRow qui écrivaient ligne par ligne les résultats. Cette fois-ci tous les résultats sont stockés dans une matrice unique et répercutés dans la feuille en bloc en fin de calcul.

Ceci à chaque pas

bd.appendRow(prov)

est donc remplacé en fin de script par

bd.getRange(1,1,result.length,result[0].length).setValues(result)

j'ai trouvé la réponse qui me bloquait auprès d'un expert japonais en javascript en écrivant

result.push([...prov])

Parfait

Merci

Rechercher des sujets similaires à "conversion contenu google sheet"