Sheets case à cocher macro

gaston gaston
1 618 contributions
Membre depuis le 01/03/2001
Envoyé le 21/09/2023 à 22:32


Bonjour,

J'ai voulu créer un déclenchement de macro à partir d'une case à cocher comme dans cette vidéo.

j'ai adapté le code à mes besoins:

function OnEdit() {
let activeCell=SpreadsheetApp.getActiveSpreadsheet().getActiveCell()
let reference=activeCell.getName()
let sheetName=activeCell.getSheet().getName()
let activeValue=activeCell.getValue()
/* 3 conditions: si on est sur la cellule nommée ccplus10q de la feuille Form, et que la chkbox est cochée:*/
if(reference=="ccplus10q" && sheetName == "Form" && activeValue==true)
{
/*lancement de la macro incrementQ */
incrementQ();
/* une fois la fonction effectuée on décoche la chkbox */
activeCell.cellValue(false)
}
}


je ne comprends pas pourquoi rien ne se passe lorsque je coche ma case, alors que ma macro incrementQ fonctionne quand je la lance directement ? [:o]
carpe diem
Bipbipcoyote Bipbipcoyote
4 287 contributions
Membre depuis le 06/03/2001
Envoyé le 22/09/2023 à 13:42 Modifié par Bipbipcoyote


Bonjour,
de prime abord sans avoir rien vérifié jusqu'à présent
et qu'y a-t-il dans IncrementQ ?
et es-tu sûr que la case à cocher se nomme ccplus10q ? pourquoi n'utilise pas getRange comme sur la vidéo, c'est pareil qu'un nom et évite toute ambiguïté
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 618 contributions
Membre depuis le 01/03/2001
Envoyé le 22/09/2023 à 14:51


Bonjour,

j'ai essayé avec une autre macro que incrementQ mais ça ne change rien
pour info code de incrementQ:

let counterSS=SpreadsheetApp.getActiveSpreadsheet()
function incrementQ() {
let counterCellQv=counterSS.getRangeByName('MontantQiqong')
let prix10Q=counterSS.getRangeByName('Tarif10Q')
counterCellQv.setValue(counterCellQv.getValue()+prix10Q.getValue())
}


La cellule qui contient la case à cocher s'appelle bien ccplus10q , je viens de re-vérifier
(ce n'est pas comme sur excel où on peut donner un nom au chkbox: j'ai déjà utilisé ce système de cellule nommée pour récupérer la valeur d'une case à cocher dans une fonction et ça marche)
je préfère utiliser une cellule nommée car je trouve ça plus explicite dans mon code que H26 par exemple (je vais avoir plusieus cases à cocher et donc plusieurs conditions)
que je mette getRange ne change rien

carpe diem
Bipbipcoyote Bipbipcoyote
4 287 contributions
Membre depuis le 06/03/2001
Envoyé le 22/09/2023 à 15:55 Modifié par Bipbipcoyote


Bonjour,
ceci fonctionne. J'ai nommé la feuille Compteur

function compteur(){
let compteurSS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Compteur");
let compteurCell = compteurSS.getRange("B1");
compteurCell.setValue(compteurCell.getValue()+1);
}

function onEdit(e) {
const nomdelaFeuille = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
const cellule = e.range;
const adresse = cellule.getA1Notation ();
// Browser.msgBox(nomdelaFeuille);
if (nomdelaFeuille == "Compteur" && adresse == "B4" && cellule.getValue() == true) {
compteur();
}
}

le code de la vidéo ne fonctionnait pas non plus chez moi, mais c'est peut être une question de version, le truc c'est d'utiliser le msgbox pour vérifier ce que contiennent les variables, ensuite on le remet en commentaire, car je n'obtenais pas le nom de la feuille etc... et donc la condition n'était pas remplie

j'ai testé sur mon smartphone, cela fonctionne
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 618 contributions
Membre depuis le 01/03/2001
Envoyé le 22/09/2023 à 17:08 Modifié par gaston


Bonjour,

Super, merci! Je vais tester ça. Je me suis effectivement demandé si en ajoutant e, ça ne fonctionnerait pas mieux (il en parle au début de sa vidéo, je crois), mais à dire vrai, je ne comprends pas bien cette notion d'événement objet...

Edit: effectivement ça fonctionne ainsi

par contre ces 2 codes fonctionnent


function compteur(){
let compteurSS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Compteur");
let compteurCell = compteurSS.getRange("B1");
//Browser.msgBox(compteurCell); me renvoie: Range
compteurCell.setValue(compteurCell.getValue()+1);
}

function compteur2(){
let compteurSS2 = SpreadsheetApp.getActiveSpreadsheet();
//j'ai dû enlever le getSheetByName("Compteur")
let compteurCell2 = compteurSS2.getRangeByName('valeur1');
//Browser.msgBox(compteurCell2); me renvoie: Range
compteurCell2.setValue(compteurCell2.getValue()+10);
}


ça m'aurait bien arrangé que le onEdit fonctionne aussi avec le nom de la plage, mais je ne trouve pas la syntaxe pour récupérer le nom: getName ne fonctionne pas avec Range
carpe diem
Bipbipcoyote Bipbipcoyote
4 287 contributions
Membre depuis le 06/03/2001
Envoyé le 22/09/2023 à 20:22


Bonjour,
c'est comme dans Excel, tout est "objet" au sens informatique du terme (un classeur, une feuille, une cellule, etc sont des objets)
et ces objets ont des
1. des propriétés
2. des méthodes
3. des événements

Le tableur traite ces objets dans un ordre précis (par défaut)

Pour l'expliquer, on prend souvent l'exemple suivant
un véhicule a une couleur
un véhicule a 2 phares à l'avant
etc... ce sont ses propriétés
un véhicule roule
un véhicule recule
etc.. ce sont des méthodes
un véhicule se met à rouler à un moment X
un véhicule passe de la première à la seconde vitesse
etc... donc à cet instant précis on dit qu'un événement se déclenche et en l'interceptant l'on peut alors interrompre temporairement l'ordre par défaut du traitement de l'objet et demander au tableur de faire autre chose et de revenir dans l'objet qu'il traitait lorsque cette déviation est terminée
(on parle d'interruption ou de déclencheurs ou triggers en anglais)
en voici quelques exemples

Et c'est ce qui se passe dans le code fourni
le tableur est à l'écoute des événements , ici il détecte que l'on modifie une cellule, du coup il interrompt le traitement de cette cellule et il ferait autre chose si la condition que l'on a fixé se vérifie sinon, bin il poursuit le traitement de la cellule

Si la condition est remplie, le code de l'autre procédure est exécuté et quand c'est terminé le tableur reprend là où il s'était suspendu

Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
Bipbipcoyote Bipbipcoyote
4 287 contributions
Membre depuis le 06/03/2001
Envoyé le 22/09/2023 à 21:21 Modifié par Bipbipcoyote


Bonjour,
regarde sur ce lien notamment le const cellule = feuille.getRange(2, 4);
tu peux toujours incrémenter les valeurs numériques de la ligne et de la colonne

pour un test
function exemple() {
var cellule = SpreadsheetApp.getActiveRange()
var numeroColonne = cellule.getColumn()
var numeroLigne = cellule.getRow()

const adresse = cellule.getA1Notation();

Browser.msgBox(adresse);
}

un autre exemple qui permet de parcourir une plage de données
Copie ce fichier dans ton drive pour le tester
la fonction retrouverUnSeulEnregistrement
tu tapes par exemple Delon et la procédure retrouve le nom et le prénom,
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions

Discussion trop ancienne

Cette discussion a été automatiquement fermée car elle n'a plus reçue de nouveau message depuis trop longtemps.

Nous vous suggérons de créer un nouveau message

« Retour sur la liste des messages de ce forum