Horodatage suivant condition valeur
Bonjour,
Cela fait maintenant plusieurs heures que je cherche une solution à mon problème.
Je souhaites sur une google sheets déclencher un horodatage suivant la valeur d'une cellule (valeur =1) valeur qui elle même calculé par une formule (condition SI cellule X = truc alors 1)
J'ai bien trouvé ce code (ci dessous) et commenté pour comprendre la mécanique mais là je me rends compte qu'il n'est utilisable que lors d'un changement de valeur de la cellule, hors ma cellule contient une formule et ne change donc pas de valeur.
function onEdit() {
const feuille = SpreadsheetApp.getActiveSheet(); // constante qui récupère la feuille active
if (feuille.getName() == "Suivi demande devis clients") { // constante qui récupère le nom du document "Suivi demande devis clients"
const plage = feuille.getActiveCell(); // constante qui récupère la cellule active de la feuille
const colonne = plage.getColumn(); // constante qui récupère la colonne ou se trouve la cellule active
if (colonne === 2) { // Si la plage de valeurs de la colonne 2 de la constante "colonne" change d'état
const prochaineCellule = plage.offset(0, 1); // définition de la variable "prochainecellule" qui sera 0 colonne en dessous et 1 cellule à droite
if (prochaineCellule.getValue() === '') // si la cellule en question est vide (ne contient pas déjà une date)
prochaineCellule.setValue(new Date()); // alors affichage date du jour
}
}
}Pouvez vous me proposer une modif de ce code permettant de faire le job?
Merci
Bonjour,
Plusieurs possibilités, si vous souhaitez vous servir du script tel quel, mettez un déclencheur, par exemple à l'ouverture du fichier, toutes les X heures, ou bien les X minutes.
Sinon, pourquoi ne pas raccourcir le fonctionnement, là si je comprends bien : condition SI cellule X > valeur nouvelle cellule = 1 > script horodate nouvelle cellule
Transformé en : condition SI cellule X > script horodate nouvelle cellule
Bonjour,
merci pour cette première réponse.
Plusieurs possibilités, si vous souhaitez vous servir du script tel quel, mettez un déclencheur, par exemple à l'ouverture du fichier, toutes les X heures, ou bien les X minutes.
Je voudrais que ce soit instantané.
Sinon, pourquoi ne pas raccourcir le fonctionnement, là si je comprends bien : condition SI cellule X > valeur nouvelle cellule = 1 > script horodate nouvelle cellule
Transformé en : condition SI cellule X > script horodate nouvelle cellule
La cellule qui déclenche l'horodatage provient d'un état donné. C'est à dire, en source j'ai une liste de choix (Devis en cours;...; devis signé). Lorsque le devis est signé (donc sélection "devis signé" dans la liste de choix) je veux horodater.
Pour l'instant mon déclencheur d'horodatage est la valeur 1 via la formule =SI(L3="devis signé";1;"").
À tester si tu souhaites que l'horodatage soit en colonne M :
function onEdit(e) {
const feuille = SpreadsheetApp.getActiveSheet(); // Récupère la feuille active
const now = new Date();
const date = Utilities.formatDate(now, "GMT+2", "dd/MM/yyyy - HH:mm:ss"); // formattage de l'horodatage
if (feuille.getName() == "Suivi demande devis clients") { // Vérifie si la feuille est bien "Suivi demande devis clients"
const cell = e.range; // Récupère la cellule qui a été éditée
const colonne = cell.getColumn(); // Récupère la colonne de la cellule éditée
const ligne = cell.getRow(); // Récupère la ligne de la cellule éditée
if (colonne === 12 && cell.getValue() === "devis signé") { // Vérifie si modification a lieu dans la colonne L et si le choix dans la liste = "devis signé"
feuille.getRange(ligne, colonne + 1).setValue(date); // Insère l'horodatage dans la colonne suivante
}
}
}J'ai une erreur sur la ligne: const cell = e.range; // Récupère la cellule qui a été éditée
Erreur
TypeError: Cannot read properties of undefined (reading 'range')
onEdit @ Code.gs:7
Sinon pour
feuille.getRange(ligne, colonne + 1).setValue(date); // Insère l'horodatage dans la colonne suivante
Si je veux insérer en colonne 2 je peux faire "feuille.getRange(ligne, colonne - 11)"?
Ok l'erreur n'en est pas une en fait. Le script fonctionne mais uniquement si je tape manuellement "devis signé", ca ne prends pas en compte la valeur de la liste de choix.
Après avoir tourné le truc dans plusieurs sens j'ai trouvé le problème...devis signé est Devis signé dans ma liste de choix...
Le script fonctionne! merci beaucoup Pierre!
Ok, je prends le conseil!
Encore merci
Bonjour,
Je reviens vers vous car j'ai une faille dans mon système. Pour mémoire quand je mets une valeur "devis signé" ca déclenche l'horodatage. Jusqu'ici nous sommes bon. Le problème vient du fait que si je repasse ma cellule en "devis non signé" puis que je repasse en "devis signé" ca va me déclenché de nouveau l'horodatage.
Il faudrait donc rajouter une condition, si la cellule n'est pas vide.
Pierre, sans vouloir abuser, c'est possible de me rajouter la condition?
Merci
J'ai modifier ainsi:
function onEdit(e) {
const feuille = SpreadsheetApp.getActiveSheet(); // Récupère la feuille active
const now = new Date();
const date = Utilities.formatDate(now, "GMT+2", "dd/MM/yyyy - HH:mm:ss"); // formattage de l'horodatage
if (feuille.getName() == "Suivi demande devis clients") { // Vérifie si la feuille est bien "Suivi demande devis clients"
const cell = e.range; // fonction de détéction d'une cellule éditée pour lancer la fonction
const colonne = cell.getColumn(); // Récupère la colonne de la cellule éditée
const ligne = cell.getRow(); // Récupère la ligne de la cellule éditée
if (colonne === 14 && cell.getValue() === "Devis signé") { // Vérifie si modification a lieu dans la colonne 11 et si le choix dans la liste = "Devis signé"
const cellule = feuille.getRange(ligne, colonne - 12)
if (cellule.getValue() === '')
feuille.getRange(ligne, colonne - 12).setValue(date); // Insère l'horodatage dans la colonne souhaitée, ici 11-9= colonne 2
}
}
}le rajout en question:
const cellule = feuille.getRange(ligne, colonne - 12)
if (cellule.getValue() === '')Ca fonctionne à première vue mais n'étant pas à l'aise j'ai peur des effets de bords.
Si quelqu'un peu me valider et m'expliquer la signification de car j'ai du mal à comprendre comment la ligne permet de faire le lien avec notre cellule...
feuille.getRange(ligne, colonne - 12)Bonjour,
La cellule où tu mets l'horodatage est situé en
feuille.getRange(ligne, colonne - 12)ligne = la ligne où a eu lieu la modification en "Devis signé"
colonne = la colonne où a eu lieu la modification en "Devis signé" (colonne 14 apparemment donc N)
donc, colonne -12 = colonne 2 sans doute, donc B ?
const cellule = feuille.getRange(ligne, colonne - 12)
if (cellule.getValue() === '')
feuille.getRange(ligne, colonne - 12).setValue(date);Le rajout vérifie si la cellule est vide, et si oui, écrit l'horodatage il me semble toutefois + logique de ne pas re-appeler la range de la cellule mais de directement écrire dessus :
var cellule = feuille.getRange(ligne, colonne - 12)
if (cellule.getValue() === '')
cellule.setValue(date);Merci pierre pour ces précisions.
Je rencontre un problème sur ma feuille qui est en partage avec d autres utilisateurs, je viens de me rendre compte que la macro ne fonctionne pas chez eux! Pour l instant, pas trouvé d astuce pour remédier au problème. J'ai joué avec les autorisations de la feuille mais rien y fait. Une idée?
Merci
Quel est le message d'erreur ?
> il faut aller dans la page Apps Script, a gauche dans l'onglets "Executions", là, il y a le liste de chaque script, il faut cliquer sur une ligne en échec afin de voir le message.
Bonjour Pierre,
Encore une fois merci, j'avais protégé la cellule ou la macro venait écrire et donc elle passait en échec
Erreur Vous tentez de modifier une cellule ou un objet protégés. Si vous avez besoin d'effectuer cette modification, demandez au propriétaire de la feuille de calcul de supprimer la protection.
J'ai donc supprimé la protection sur la colonne en question. Le masquage de la colonne sera suffisante dans mon cas (c'est juste pour éviter les fausses manip)
Bonne journée
