Déclencher des scripts (fonctions personnalisées) lors ajout ou modification de données

a marqué ce sujet comme résolu.

Bonjour,

Je n’ai pas trouvé comment faire exécuter plusieurs scripts lorsque la valeur de la cellule change ou par d’autres moyens ? C’est à dire au fur et à mesure que j’entre des données en fin de ligne, j’aimerai que les fonctions personnalisées qui sont en début de ligne recalcul automatiquement les valeurs. Exactement de la même manière que cette fonction : =NBVAL() . Lors d’ahout de données danssa plage de calcule le résultat se met automatiquement à jour. actuellement j’essai cela :

function maFonction() {
var maValeur = SpreadsheetApp.getActiveSheet().getRange("H1").getValue();
if(maValeur == "réinitialiser"){
// ici mettre la fonction que vous souhaitez
    sousterre();
    surface();
    repos();
    disponible();
}
}

les autres codes à déclencher sont tous de cette façon :

function sousterre(){
// définir les variables
var ss = SpreadsheetApp.getActiveSheet()
var n= ss.getLastColumn();
  for(var C1=n;C1>=1;C1--) { // boucle de n à 1
    if(ss.getRange(ss.getCurrentCell().getRow(),C1).getValue() == "ST"){
         // on a trouvé la cellule qui contient ST
  for(var C2=C1;C2>=1;C2--){
    if(ss.getRange(ss.getCurrentCell().getRow(),C2).getValue() != "ST"){
  return  C1-C2;
        }
      }       
    }    
  }
}

Lien vers le fichier exemple :

https://docs.google.com/spreadsheets/d/1RP3o3OSjHJhkV9eGZbUGrFo-XPXQFFLlHOoRhZzsKK8/edit#gid=0

Merci

Bonjour,

Merci DonKnacki pour ces solutions.

Cela fonctionne bien par contre le temps d’exécution est un peu long avec seulement 29 colonnes et 8 lignes. Habituellement le fichier comporte entre 100 à 150 lignes sur 500 colonnes !!!

Les formules personnalisées elles sont située uniquement sur 4 colonnes et 100 à 150 lignes.

+0 -0

Tu peux améliorer un peu en sortant le calcul de la ligne des boucles.

function sousterre(){
// définir les variables
var ss = SpreadsheetApp.getActiveSheet()
var n= ss.getLastColumn();
row = ss.getCurrentCell().getRow();
  for(var C1=n;C1>=1;C1--) { // boucle de n à 1
    if(ss.getRange(row ,C1).getValue() == "ST"){
         // on a trouvé la cellule qui contient ST
  for(var C2=C1;C2>=1;C2--){
    if(ss.getRange(row,C2).getValue() != "ST"){
  return  C1-C2;
        }
      }       
    }    
  }
}

Tu peux peut être aussi essayer d’utiliser la fonction match au lieu de ta fonction

+0 -0

Bonjour, Oui petite amélioration. Merci

En effet au départ j’avais bien pensé à la fonction match (ou Equiv) mais je n’ai pas réussi à faire. Je n’arrive pas à partir de la fin de la ligne pour remonter au début.

C’est vrai que là je n’aurai plus de problème pour les calculs du fait que c’est une fonction native sheets.

+0 -0

Bonjour

Très grosse amélioration, j’ai enfin trouvé une solution par formules ce qui me dispensera de le faire avec un script. Le calcul est instantané :) .

Néanmoins, j’ai juste un petit problème avec une formule, je n’arrive pas à y intégrer une plage dynamique, je suis obligé de rentrer les données en dur (pas pratique) :colere: .

J’ai bien essayé avec la fonction décaler mais en vain. mes formules :

=ArrayFormula(MAX( (M14:14="ST")* COLONNE(M14:14))-MAX(SI(M14:AG14<>"ST";COLONNE(M14:AG14))))

Il faudrait que dans la seconde partie de la formule (- max …..) le début soit toujours en colonne M et que la fin corresponde au numéro de la colonne issue de la première partie;

Avec le fichier c’est plus facile à expliquer. https://docs.google.com/spreadsheets/d/1RP3o3OSjHJhkV9eGZbUGrFo-XPXQFFLlHOoRhZzsKK8/edit#gid=0

+1 -0

Bonjour,

Comme quoi la nuit porte conseil. La solution est :

=ArrayFormula(SI(MAX((I14:14="ST")*COLONNE(I14:14))=0;0;MAX((I14:14="ST")*COLONNE(I14:14))-MAX(SI(DECALER($I14;0;0;1;MAX((I14:14="ST")*COLONNE(I14:14))-9)<>"ST";COLONNE(DECALER($I14;0;0;1;MAX((I14:14="ST")*COLONNE(I14:14))-9))))))
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte