Macro compter nb de caractères jusqu'au curseur

gaston gaston
1 592 contributions
Membre depuis le 01/03/2001
Envoyé le 18/05/2023 à 16:07


Bonjour,

Dans Google Sheets, je voudrais pouvoir faire une macro qui permette, dans une cellule donnée, d'insérer une chaîne de caractère à l'endroit du curseur.
En fait cette cellule contient un texte dans lequel je voudrais inclure des mots précis entre accolades, afin que ça soit interprété par une autre macro qui les remplacera alors par des variables, ceci afin de créer facilement le texte d'un email, à partir de certaines données variables.
Je me disais donc qu'il faudrait que la macro puisse compter le nombre de caractères jusqu'au curseur, et après le curseur mais est-ce possible ?
carpe diem

Répondre à ce message

Bipbipcoyote Bipbipcoyote
4 141 contributions
Membre depuis le 06/03/2001
Envoyé le 18/05/2023 à 19:29 Modifié par Bipbipcoyote


Bonjour,
et ceci ne te convient pas ? ici il faut envoyer un email à la fois mais cela peut régler ton souci par concaténation

ou celui ci ici automatiquement
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 592 contributions
Membre depuis le 01/03/2001
Envoyé le 18/05/2023 à 20:43 Modifié par gaston


Bonjour,
En fait, je n'ai aucun problème pour mettre le texte d'une cellule de Sheet dans un mail et l'envoyer ensuite, ni même de remplacer certains mots clés par leur équivalents en variables:
j'ai créé un Google Forms dans lequel j'ai écrit une macro qui, lorsque les gens valident leur reponse, leur envoie automatiquement un email, dans lequel entre autres sont reprises leurs réponses, avec en prime un petit calcul basé sur le produit d'un des champs de réponse (un nb de participants) avec la valeur d'une cellule située dans le classeur associé (un prix unitaire).
Le template du mail est situé dans une cellule du classeur, bien agrandie, de façon à ce qu'on puisse écrire lisiblement un texte avec sauts de ligne (en faisant ctrl enter, ce qui permet d'éviter d'ajouter des /n ou des car(50) ou autres).
Ça fonctionne très bien déjà ainsi...enfin presque ;-).

Jusqu'à présent je rédige le texte du mail moi-même, avec des mots clés pour les variables, (par exemple sous cette forme: bonjour {nom} ), mais ce que je voudrais, c'est que ceux qui vont gérer ces inscriptions puissent modifier le texte dans la cellule en question et ajouter facilement ces mots clés , sachant que, souvent, les gens ne font pas attention et risquent de ne pas saisir exactement ce qu'il faut.
Évidemment, je peux mettre les mots clés en question dans des cellules à côté et qu'ils fassent un copier-coller à l'endroit où ils veulent, mais s'ils avaient juste à cliquer sur un bouton, ce serait encore mieux.
Note bien que je pourrais tout aussi bien utiliser une feuille de traitement de texte pour mon Template...
carpe diem
Bipbipcoyote Bipbipcoyote
4 141 contributions
Membre depuis le 06/03/2001
Envoyé le 18/05/2023 à 22:29


Bonjour,
une piste, c'est de leur proposer de donner les valeurs au travers d'input box, tu en récupères les entrées et tu fais la concaténation comme montré dans les vidéos précédentes ou dans le code
vidéo qui montre comment utiliser une inputbox
Je pense que ce serait moins compliqué et cela évite que l'utilisateur aille effacer ce qu'il ne doit pas
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 592 contributions
Membre depuis le 01/03/2001
Envoyé le 18/05/2023 à 22:41 Modifié par gaston


Bonjour,

OK, mais le problème reste le même: comment trouver l'endroit exact où on veut insérer les mots clé quand on ecrit, par exemple :
"Bonjour {Nom}. Votre paiement devra être de {prix} euros à régler par chèque" comment indiquer ça à la macro: "endroit où est le curseur" ?
regarde au dessus, j'ai apporté des précisions dans ma précédente réponse, qui explique ce que j'ai déjà fait et quel est exactement mon besoin.

PS: je t'ai envoyé un mp
carpe diem
Bipbipcoyote Bipbipcoyote
4 141 contributions
Membre depuis le 06/03/2001
Envoyé le 19/05/2023 à 00:54 Modifié par Bipbipcoyote


Bonjour,
Je suppose que ton message est toujours identique

tu peux utiliser le code suivant, du moins t'en inspirer (3ème vidéo regarde la il explique comment récupérer la valeur des boutons et pouvoir ainsi faire des if then ) moi ici j'ai fait au plus simple

function showInputBox() {
var ui = SpreadsheetApp.getUi();
var nom = ui.prompt("Donnez moi un nom ! : ")
var nombre = ui.prompt("Combien voulez vous de vélos ? : ")
var spreadsheet = SpreadsheetApp.getActive();
var str1 = "Bonjour ";
var str2 =" je vous écris pour vous demander de me vendre ";
var str3 =" bicyclettes";
var combinaison = str1.concat(nom.getResponseText(),str2,nombre.getResponseText(),str3 );;

spreadsheet.getRange('D1').setValue(combinaison);
};
Fichier exemple
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
Bipbipcoyote Bipbipcoyote
4 141 contributions
Membre depuis le 06/03/2001
Envoyé le 19/05/2023 à 13:17 Modifié par Bipbipcoyote


Bonjour,
Vidéo qui montre comment utiliser un addd-on qui permet d'envoyer automatiquement 75 emails personnalisés gratuitement avec des variables. Cela remplit ce que tu veux faire
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 592 contributions
Membre depuis le 01/03/2001
Envoyé le 19/05/2023 à 15:25 Modifié par gaston


Bonjour,

Oh ben, la macro que j'ai faite fonctionne déjà , reliée au formulaire [;)] ( et je me la suis faite parce que j'avais bien trouvé un add-on, mais il ne faisait pas tout ce que je voulais) .
Je me suis fait, d'autre part, un autre classeur, depuis lequelle je peux saisir toute une liste d'adresses et envoyer un même email à ces adresses, à partir du moment où la chkbox en face de leur ligne est cochée. Je peux même filtrer les adresses pour m'envoyer qu'à ceux qui ont une adresse Gmail, par exemple. Bien entendu, en respectant le quota de 100 msg par jour de Gmail ( que j'ai fait en sorte qu'on puisse consulter en cliquant un bouton). C'est beaucoup plus efficace que de mettre tout le monde en cci, avec les adresses séparées par des virgules: ça évite que les mails ne passent en spam directement, comme c'est souvent le cas avec certains serveurs comme Orange ( j'ai testé avec des copains)
Je vais te mettre une copie de mon fichier dans le dossier que je t'ai partagé, et tu verras.
carpe diem
Bipbipcoyote Bipbipcoyote
4 141 contributions
Membre depuis le 06/03/2001
Envoyé le 19/05/2023 à 16:28


Bonjour,
ah ok, parfait, je n'ai plus à me casser la tête alors [:D] [:D]
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
Bipbipcoyote Bipbipcoyote
4 141 contributions
Membre depuis le 06/03/2001
Envoyé le 19/05/2023 à 16:49 Modifié par Bipbipcoyote


Bonjour,
j'ai bidouillé un peu (j'ai un peu de mal à retenir la syntaxe de app script, sans doute que je n'en fait pas assez) mais voici une petite fonction qui permet enfin de trouver une donnée précise et qui pourrait alors y appliquer la technique du offset
On demande via une inputbox une donnée à rechercher, (ce serait mieux sans doute de choisir un numéro d'ID pour éviter les doublons, deux personnes qui porteraient le même nom) . Bien entendu on n'utiliserait pas la console mais des setValue
remarque, l'ID doit être personnalisé avec des lettres et des chiffres, pour ne pas interférer avec les données numériques bien entendu, du genre ID_45896, il faut que cette donnée soit unique dans la plage

function retrouverUnSeulEnregistrement(){
const nom = Browser.inputBox('Quel nom recherchez-vous ? :', Browser.Buttons.OK);
let feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Eleves'); // désigne la feuille de travail
let derniere_cellule = feuille.getLastRow(); // retrouve le numéro de ligne de la dernière cellule remplie ! attention reprend aussi les lignes vides
let cel = feuille.getRange('A2:G'+ derniere_cellule); //sélectionne une plage de données, la première ligne sont des titres = le pourquoi du A2

for (let x = 1; x <= derniere_cellule-1; x ++){
if(cel.getCell(x,2).getValue() == nom){
console.log(
'Nom : ' + cel.getCell(x,2).getValue() +
' Prénom : ' + cel.getCell(x,3).getValue()
);
}
}
};

on peut alors injecter les getValue dans des variables et en faire tout ce que l'on veut
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 592 contributions
Membre depuis le 01/03/2001
Envoyé le 19/05/2023 à 18:20 Modifié par gaston


Bonjour,

Intéressant. Merci, je me mets ça de côté. (+)

Dans le dossier que je t'ai partagé, j'ai modifié la macro que j'avais créée dans le formulaire FormReponseAuto, et j'ai résolu le petit problème que j'avais pour la création du texte. Dans le classeur associé (FormReponseAuto (réponses), tu verras que dans l'onglet Param, j'ai la cellule F2 qui me se sert de texte temporaire: la macro copie colle la cellule C2 où est le template, en F2, où elle attribue ensuite la valeur des variables aux noms entre accolades (donc le texte change à chaque nouvelle soumission du formulaire), il suffit ensuite de se servir de cette cellule F2 pour remplir l'e-mail, et le tour est joué [:)(] (cette idée de texte temporaire m'est venue en regardant cette video)

Edit:
précision: la macro est accessible depuis le Form et non pas depuis le classeur

Mais donc, tu peux voir maintenant comment je gère le texte du mail: je l'écris dans UNE SEULE CELLULE: ça donne beaucoup plus de liberté que d'avoir plusieurs cellules, sauf que, donc, il ne faut pas faire de faute quand on écrit les valeurs entre accolades. C'est pour cela que je demandais au départ s'il était possible de trouver la position du curseur dans une cellule.
Evidemment, si on écrit le mail et que là tout d'un coup, on veut le nom de variable, on peut dire que c'est juste après le dernier caractère qu'on veut coller un mot, mais si on veut modifier ce qu'on a écrit et qu'on veut ajouter cette variable au milieu du texte, comment faire ? Dire que c'est entre tel et tel mot ? Un peu lourd comme utilisation...

Ta fonction, elle (si j'ai bien compris), cherche une cellule où il y a une valeur donnée par l'inputbox
carpe diem
Bipbipcoyote Bipbipcoyote
4 141 contributions
Membre depuis le 06/03/2001
Envoyé le 19/05/2023 à 19:07


Bonjour,
oui, c'est ce qu'elle fait... Je pense que c'est l'une des fonctions les plus souvent utilisées sur une base de données car finalement, je constate que la plupart des gens utilisent les tableurs comme gestionnaire de base de données et l'action la plus fréquente est de parcourir les enregistrements pour en retrouver un bien particulier pour pouvoir le modifier, l'effacer ou l'afficher,
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions

Participer à cette discussion

« Retour sur la liste des messages de ce forum