Notification lors de la modifications d'une cellule dans une plage

Bonjour,

Je cherche à être notifié lorsque qu'une cellule particulière est modifié. J'ai vu des sujets similaire dans le forum mais rien pour m'aider.

La feuille de mon google sheet se remplie grâce à un formulaire.

Dans ce formulaire il y a une partie commentaire pour laquelle j'aimerai être notifiée lorsque celle-ci et celle-ci seulement est remplie.

De plus je souhaiterais avoir une autre notification en fonction de certaines données, je m'explique...

J'ai un tableau A,B,C,D, toutes les valeurs sont numériques et la "D" est au format pourcentage.

Si "A" est supérieur ou égal à 40 et que le pourcentage dans le calcul (B+C)/A est supérieur à 10% alors je reçois une notification.

=SI(C2>=40;(D2+E2+F2)/C2) ceci est la formule que j'ai mise dans une cellule et cette cellule est au format pourcentage

Pour être franc je suis novice dans excel (pour les VBA) et google sheet et je vois qu'il y a des VBA et Script dans Google sheet.

Je ne sais pas si il vaut mieux un script ou vba mais j'ai trouvé un script que voici, qui fonctionne bien lorsque c'est moi qui modifie manuellement.

var email = "mon adresse email";
var range = "B2:B5000";

function onOpen() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();

  var Sousmenu = [];

   Sousmenu.push({name: "Notif cellule", functionName: "Message"});  

   ss.addMenu("Info Notif", Sousmenu);
 }

function Message() {
Browser.msgBox ('Cellule programmée : '+ range +'.   Email programmé :' +email);
}

function Notification() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var editRange = sheet.getActiveRange();
  var editRow = editRange.getRow();
  var editCol = editRange.getColumn();
  var testrange = sheet.getRange(range);
  var rangeRowStart = testrange.getRow();
  var rangeRowEnd = rangeRowStart + testrange.getHeight()-1;
  var rangeColStart = testrange.getColumn();
  var rangeColEnd = rangeColStart + testrange.getWidth()-1;
  if (editRow >= rangeRowStart && editRow <= rangeRowEnd 
      && editCol >= rangeColStart && editCol <= rangeColEnd)
  { 
  var objet = 'Nouveau commentaire dans '+sheet.getName();
  var body = 'Un commentaire a été saisi dans '+ sheet.getName() + '. Voici le lien pour visualiser la ligne complète concernant le commentaire saisi ' + ss.getUrl() + 'Commentaire: «' + editRange.getValue() + '».';
  MailApp.sendEmail(email, objet, body);
  }
}

seulement voilà...lorsque c'est le formulaire qui rempli le tableau (chose prévu) la formule dans la case disparait et je n'ai pas de notification.

Si quelqu'un pouvait éclairer ma lanterne merci beaucoup.

Bonjour,

Je ne sais pas si il vaut mieux un script ou vba mais j'ai trouvé un script que voici, qui fonctionne bien lorsque c'est moi qui modifie manuellement.

seulement voilà...lorsque c'est le formulaire qui rempli le tableau (chose prévu) la formule dans la case disparait et je n'ai pas de notification

VBA ou GS c'est pareil, si la modification est le résultat d'une opération non manuelle, la détection ne se fera pas.

Il faut alors procéder différemment, avec un déclencheur (trigger) tous les x minutes : balayer la feuille, repérer les commentaires et envoyer un email (suppose aussi d'avoir mis un indicateur pour ne pas répéter l'envoi). Avec GS cela peut se faire fichier fermé (contrairement à VBA).

Bonjour Steelson

VBA ou GS c'est pareil, si la modification est le résultat d'une opération non manuelle, la détection ne se fera pas.

Merci pour cette précision.

Il faut alors procéder différemment, avec un déclencheur (trigger) tous les x minutes : balayer la feuille, repérer les commentaires et envoyer un email (suppose aussi d'avoir mis un indicateur pour ne pas répéter l'envoi).

je vais essayer de pencher sur cette idée alors....

Avec GS cela peut se faire fichier fermé (contrairement à VBA).

et bien alors, la solution se fera sur GS.

merci

Je ferai un test de mon côté aussi ...

Voici mes résultats ...

capture d ecran 330
function envoyer() {
  var document = SpreadsheetApp.getActive();
  var f = document.getSheetByName('Feuille 1');
  var derL = f.getLastRow();
  var c = 5; // E
  for (var i = 2; i <= derL; i++){
    if ( (f.getRange(i,c).getValue() != '') && (f.getRange(i,c+1).getValue() == '') ) {
      //Browser.msgBox(f.getRange(i,c).getValue());
      GmailApp.sendEmail('abcd.efgh@gmail.com', 'Réception d\'un commentaire', f.getRange(i,c).getValue()) ;
      f.getRange(i,c+1).setValue('ok');
    }
  }
};

un déclencheur horaire ... et cela fonctionne sur fichier fermé !

Merci steelson

ça fonctionne nikel par contre peux-tu m'expliquer cette partie de ton code

  for (var i = 2; i <= derL; i++){
    if ( (f.getRange(i,c).getValue() != '') && (f.getRange(i,c+1).getValue() == '') ) {
      //Browser.msgBox(f.getRange(i,c).getValue());

de ce que je comprends ça cherche la dernière ligne et colonne déclarée mais comment ça fonctionne???

et dernière chose si je peux abuser...

Penses-tu que l'on peut intégrer une formule comme SOMMEIF ou autre dans un script, ou est-ce que l'on demande a un script d'appeler une vba qui exécutera une formule??

Je pose cette question car comme je l'avais écris dans mon 1er message.....

De plus je souhaiterais avoir une autre notification en fonction de certaines données, je m'explique...

J'ai un tableau A,B,C,D, toutes les valeurs sont numériques et la "D" est au format pourcentage.

Si "A" est supérieur ou égal à 40 et que le pourcentage dans le calcul (B+C)/A est supérieur à 10% alors je reçois une notification.

=SI(C2>=40;(D2+E2+F2)/C2) ceci est la formule que j'ai mise dans une cellule et cette cellule est au format pourcentage

Merci

PS: ah et le coté diffusé... c'est royal !!!

Explications

  var derL = f.getLastRow();

est la dernière ligne de la feuille

  for (var i = 2; i <= derL; i++){
    if ( (f.getRange(i,c).getValue() != '') && (f.getRange(i,c+1).getValue() == '') ) {

on va en effet balayer toutes les lignes, de la 2 jusqu'à la dernière

for (var i = 2; i <= derL; i++)
  • si il y a un commentaire
f.getRange(i,c).getValue() != ''
  • et (&&) si ce dernier n'a pas été diffusé
f.getRange(i,c+1).getValue() == ''

alors, on envoie le courriel

Il n'y a aucun abus ... je suis à ton écoute ...

Penses-tu que l'on peut intégrer une formule comme SOMMEIF ou autre dans un script, ou est-ce que l'on demande a un script d'appeler une vba qui exécutera une formule??

Je pose cette question car comme je l'avais écris dans mon 1er message.....

De plus je souhaiterais avoir une autre notification en fonction de certaines données, je m'explique...

J'ai un tableau A,B,C,D, toutes les valeurs sont numériques et la "D" est au format pourcentage.

Si "A" est supérieur ou égal à 40 et que le pourcentage dans le calcul (B+C)/A est supérieur à 10% alors je reçois une notification.

=SI(C2>=40;(D2+E2+F2)/C2) ceci est la formule que j'ai mise dans une cellule et cette cellule est au format pourcentage

je préfère toujours faire les calculs dans la feuille et non dans le script, question "philosophique" personnelle. Un tableur est fait pour calculer.

pour aller plus loin cela mérite de ta part un petit fichier très simplifié, histoire de bien comprendre où sont les données. Ceci

Si "A" est supérieur ou égal à 40 et que le pourcentage dans le calcul (B+C)/A est supérieur à 10%

doit pouvoir s'écrire simplement

if ( (f.getRange(i,1).getValue() > 40) && (f.getRange(i,4).getValue() > 0.1) ) {
    // mettre ici le script d'envoi de la notification
}

Merci pour l'explication

je préfère toujours faire les calculs dans la feuille et non dans le script, question "philosophique" personnelle. Un tableur est fait pour calculer.

Je suis d'accord avec toi mais....

seulement voilà...lorsque c'est le formulaire qui rempli le tableau (chose prévu) la formule dans la case disparait et je n'ai pas de notification.

La formule est effacé par la saisie du formulaire même si celle-ci se situe dans une cellule qui elle même est dans une colonne non repris par le formulaire.

if ( (f.getRange(i,1).getValue() > 40) && (f.getRange(i,4).getValue() > 0.1) ) {

// mettre ici le script d'envoi de la notification

}

Je vais essayé

Merci

Je viens de voir qu'il manque un détail qui a son importance dans le script....

(i,4) ne peut pas avoir de résultat vu que la formule présente dans la cellule est effacé.

Si "A" est supérieur ou égal à 40 et que le pourcentage dans le calcul (B+C)/A est supérieur à 10% alors je reçois une notification.

Dans le script on a la condition concernant "A"(>=40), on a la condition concernant "D"(>10%) même si c'est pas au format pourcentage mais il n'y a pas le moyen de calculer "D" qui est (B+C)/A..

C'est le souci, je pensais qu'un formulaire remplissait les colonnes pour lequel il avait été programmé mais en fait un formulaire s'octroie d'office une ligne et seulement après rempli les colonnes programmées.

on peut dans le script mettre la formule de calcul ou le résultat du calcul dans E avant de tester la valeur > 10%, ou bien tester en direct

((f.getRange(i,2).getValue()+f.getRange(i,3).getValue())/f.getRange(i,1).getValue()) > 0.1

au passage, j'ai mis 0.1 par prudence, faut faire un test pour savoir si 10% st acceptable

ah j'avais fais quelque chose comme ça...

      var a,b,c;
      a = f.getRange(i,1).getValue
      b = f.getRange(i,2).getValue
      c = f.getRange(i,3).getValue

      var pourcentage ;
      pourcentage = (b+c)/a ;

je ne m'étais pas trop planté mis à part la syntaxe (qui a son importance).

c'est bien, mais getValue est une fonction, cela s'écrit getValue()

on peut dans le script mettre la formule de calcul ou le résultat du calcul dans E avant de tester la valeur > 10%, ou bien tester en direct

je pense que tester en direct serait intéressant

ok pour getValue et je viens de m'apercevoir que j'ai oublié les points virgule ;

je pense que le ; n'est pas obligatoire comme en php, mieux vaut le mettre quand même

j'ai cette erreur en voulant mettre supérieur ou égal

SyntaxError: Unexpected token '>=' (ligne 13, fichier "Calcul.gs"

j'ai mis une accolade à la fin de la ligne car j'ai mis un "If" avant ...

((f.getRange(i,2).getValue()+f.getRange(i,3).getValue())/f.getRange(i,1).getValue()) > 0.1

et ensuite le script d'envoi de notification

ça y est j'ai trouvé l'erreur de syntaxe... c'était logique mais bon..... le 0.1 le mettre dans la parenthèse

((f.getRange(i,2).getValue()+f.getRange(i,3).getValue())/f.getRange(i,1).getValue()> 0.1)

je teste et je te dis...

Merci en tous cas Steelson

donc oui ça fonctionne cependant tu avais raison, il vaut mieux mettre le résultat dans une autre cellule et ensuite envoyé ce résultat.

Alors j'ai essayé ceci mais ça ne fonctionne pas et ça fonctionnait mais il n'y avait pas la condition de la valeur supérieur ou égal à 40

    var r = 10;
      r = ((f.getRange(i,4).getValue()+f.getRange(i,5).getValue()+f.getRange(i,6).getValue())/f.getRange(i,3).getValue()
    for (var i = 2; i <= derL; i++){  
if (f.getRange(i,3).getValue()>=40) and r.getValue()>0.1);

j'ai mis:

"r" représentes la colonne "K"

"r" représente cette formule

ensuite vérification de chaque cellule dans la colonne "K" à partir de "K2"

et les conditions pour envoyer l'autre notification

Dans ce cas ci, r n'est pas une cellule, c'est une variable que tu as définie, donc ne pas mettre r.getValue()

sinon, ce serait plus facile de poursuivre avec un fichier si nécessaire

Rechercher des sujets similaires à "notification lors modifications plage"