Plusieurs function onEdit dans un même sheet

Bonjour,

J'ai des problèmes avec la fonction onEdit, je pense que je n'ai pas tout compris.

Je l'utilise dans 5 cas dans mon sheet.

Pour les trois premiers, j'ai trois colonnes avec des cases à cocher. Si je coche une case, ça m'envoie dans une autre feuille en copiant mon ID. Ca fonctionne très bien, merci Steelson.

Pour les deux suivantes, elles me permettent de conserver dans une feuille différente des informations et de les récupérer à chaque mise à jour du document.

Tant que je n'en avais qu'une, c'était parfait (encore merci Steelson) mais maintenant que j'en ai deux, il n'y en a qu'une des deux qui fonctionne.

Si je laisse tout dans le même script, il ne gère que le premier, si je les mets dans des scripts différents en remplaçant le onEdit(e) par onEdit(f), il ne gère que le second tout en continuant de gérer ceux avec les cases à cocher. Si je mets une des deux formules en commentaire provisoirement, l'autre fonctionne très bien. Donc chaque script pris à part fonctionne, c'est le fait d'en avoir deux qui bloquent.

function onEdit(e) {
  var feuille = e.source.getActiveSheet();
  var cellule = e.source.getActiveRange();
  var sh = e.source.getActiveSheet()

  // Case à cocher dans la colonne X. Si cochée, ouvre la feuille ACCEPTATION et met l'ID dans la cellule A1.
  if (feuille.getName() == 'SUIVI DES DOSSIERS' && cellule.getValue() == true) {
    var ss = SpreadsheetApp.getActiveSpreadsheet()
    if (cellule.getColumn() == 24) {
      var sh = ss.getSheetByName('ACCEPTATION');
      sh.getRange('iciIdacceptation').setValue(e.source.getActiveRange().offset(0, -23).getValue());
      cellule.setValue(!cellule.getValue())
      ss.setActiveSheet(sh);
      sh.getRange('A1').activate();
    }
  }
  // Case à cocher dans la colonne Y. Si cochée, ouvre la feuille ACCEPTMAT et met l'ID dans la cellule A1.
  if (feuille.getName() == 'SUIVI DES DOSSIERS' && cellule.getValue() == true) {
    var ss = SpreadsheetApp.getActiveSpreadsheet()
    if (cellule.getColumn() == 25) {
      var sh = ss.getSheetByName('ACCEPTMAT');
      sh.getRange('iciIdacceptmat').setValue(e.source.getActiveRange().offset(0, -24).getValue());
      cellule.setValue(!cellule.getValue())
      ss.setActiveSheet(sh);
      sh.getRange('A1').activate();
    }
  }
  // Case à cocher dans la colonne Z. Si cochée, ouvre la feuille CONTRAT et met l'ID dans la cellule A1.
  if (feuille.getName() == 'SUIVI DES DOSSIERS' && cellule.getValue() == true) {
    var ss = SpreadsheetApp.getActiveSpreadsheet()
    if (cellule.getColumn() == 26) {
      var sh = ss.getSheetByName('CONTRAT')
      sh.getRange('iciIdcontrat').setValue(e.source.getActiveRange().offset(0, -25).getValue());
      cellule.setValue(!cellule.getValue())
      ss.setActiveSheet(sh);
      sh.getRange('A1').activate();
    }
  }
  // Récupère les données situées dans les colonnes A(ID), AB,AC et AE de la feuille SUIVI DES DOSSIERS pour les mettre dans la feuille BdD dans les colonnes A,B,C et D. Au moment de la mise à jour, reprend les données de la BdD pour les mettre en phase avec chaque ID
  if (feuille.getName() != 'SUIVI DES DOSSIERS') return;
  var editRange = {
    top: 3,
    bottom: feuille.getLastRow(),
    left: 28,
    right: 30
  };
  var derColBdD = columnToLetter(editRange.right - editRange.left + 2)
  var bdd = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BdD')
  var der = bdd.getLastRow()
  var ids = bdd.getRange(1, 1, der, 1).getValues().flat()
  var n = 1
  for (var i = e.range.rowStart; i <= e.range.rowEnd; i++) {
    var id = sh.getRange(i, 1).getValue()
    var row = ids.indexOf(id) + 1
    if (row == 0) {
      row = der + n++
      bdd.getRange(row, 1).setValue(id)
    }
    if (i >= editRange.top && i <= editRange.bottom) {
      for (var j = e.range.columnStart; j <= e.range.columnEnd; j++) {
        if (j >= editRange.left && j <= editRange.right) {
          var c = (j - editRange.left + 2)
          bdd.getRange(row, c).setValue(sh.getRange(i, j).getValue())
          sh.getRange(i, j).setFormula(`iferror(vlookup($A${i};BdD!$A:$${derColBdD};${c};0))`)
        }
      }
    }
  }
}

function onEdit(f) {
  var feuille = f.source.getActiveSheet();
  var sh = f.source.getActiveSheet()
  // Récupère les données située dans les colonnes A(ID),P de la feuille CTL pour les mettre dans la feuille BdDCTL dans les colonnes A et B. Au moment de la mise à jour, reprend les données de la BdDCTL pour les mettre en phase avec chaque ID
  if (feuille.getName() != 'CTL') return;
  var editRange = {
    top: 3,
    bottom: sh.getLastRow(),
    left: 16,
    right: 16
  };
  var bdd = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BdDCTL')
  var der = bdd.getLastRow()
  var ids = bdd.getRange(1, 1, der, 1).getValues().flat()
  var n = 1
  for (var i = f.range.rowStart; i <= f.range.rowEnd; i++) {
    if (i >= editRange.top && i <= editRange.bottom) {
      for (var j = f.range.columnStart; j <= f.range.columnEnd; j++) {
        if (j >= editRange.left && j <= editRange.right) {
          var id = sh.getRange(i, 1).getValue()
          if (ids.indexOf(id) != -1) {
            bdd.getRange(ids.indexOf(id) + 1, 1, 1, 2).setValues([[id, sh.getRange(i, j).getValue()]])
          }
          else {
            bdd.getRange(der + n++, 1, 1, 2).setValues([[id, sh.getRange(i, j).getValue()]])
          }
          sh.getRange(i, j)
            .setFormula(`iferror(vlookup(A${i};BdDCTL!A:B;2;0))`)
        }
      }
    }
  }
} 

function columnToLetter(column) {
  var temp, letter = '';
  while (column > 0) {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}

Il ne peut y avoir qu'une seule onEdit(e)

Mais tu peux écrire ceci

function onEdit(e) {
  onEdit1(e)
  onEdit2(e)
  onEdit3(e)
}
function onEdit1(e) {
  Browser.msgBox('first onEdit function')
}
function onEdit2(e) {
  Browser.msgBox('second onEdit function')
}
function onEdit3(e) {
  Browser.msgBox('third onEdit function')
}

Voilà qui résoudrait tous mes problèmes.
Je teste et je reviens te dire
Merci
Steelson

Ca fonctionne parfaitement.

J'aurai du coup moins de scrupule à utiliser le onEdit maintenant que j'ai compris comment en faire plusieurs qui fonctionnent en même temps.

Encore un très grand merci Steelson, tu es vraiment un pro de google sheet.

Rechercher des sujets similaires à "function onedit meme sheet"