Macro de gestion de choix successif

Hello

Je souhaite créer une base de données sur laquelle je vais inscrire une question qui aura 2 choix possibles de réponses. Les choix conditionneront 2 nouvelles questions différentes qui à leur tour auront 2 choix possibles

En fonction de la réponse choisie, je souhaite que s'affiche la question suivante ainsi que les 2 nouvelles réponses possibles qui seront dépendants de la réponse choisie précédemment. Et ainsi de suite.

Dans le fichier j'ai mis en exemple une petite bdd à 3 questions et une feuille avec un exemple rapide d'affichage voulu.

En gros c'est un peu comme un formulaire mais je souhaite passer par macro et affichage sur le tableur.

Je pensais faire un script qui dit si on clique sur choix A, alors dans la BDD, on va chercher la cellule suivante. Mais comme je veux faire un nombre assez importante de questions, il faut que le script puisse être dynamique au même titre que l'évolution des questions et réponses.

Il faut donc surement que j'organise différemment la bdd mais j'ai du mal à visualiser comme faire et comment écrire le script.

https://docs.google.com/spreadsheets/d/1Tdx25rVvqQVniuXiiDNCHp4VLUBaN0u1EXrmBZqe3CY/edit#gid=1262608...

Bonjour,

Une réponse à base de query, sans script

=iferror(sort(unique(query(A:F;"select F where A='"& 'new question'!A2 &"' and C='"& 'new question'!A5 &"'  and E='"& 'new question'!A8 &"' "))))

Je ne sais pas si c'est volontaire, mais tu as mis la même question question 3D avec des réponses différentes selon des choix antérieurs différents. J'en ai tenu compte en rallongeant les formules.

Voir dans le fichier partagé.

En effet c'est une erreur de ma part pour la question3 ;)

Pas con les query. Organiser la bdd comme cela convient bien.

Mais je souhaite que les questions suivantes ne soient pas visibles et qu'elles remplacent la précédente.

En effet je n'ai pas fait toute la mise en forme pour ce test mais j'aurai un tableau de bord unique avec une image associée à chaque question. Pour associer l'image à une question je n'ai pas de souci. Je galère juste pour que la bonne question s'affiche en fonction du choix.

C'est pour cela que je pensais faire un script du genre : si je clique sur choix A, ca va afficher dans une cellule masquée "choix A". Ainsi avec une simple rechercheV dans le script, j'aurai pu changer la question 1 par la question 2.

Mais ca ne fonctionnerait que pour 1 question. Au choix suivant, il faudrait que ma matrice pour la rechercheV se décale chercher la question 3 dans la bdd.

J'ai réécrit ma bdd pour peut être rendre plus visible. On aura toujours droit entre choix A ou B, donc il me suffirait de faire juste 2 script: Un par bouton. Le plus dur est commment je vais chercher la bonne question en fonction des questions précédentes.

ok, je reprendrai dans cet esprit ... un peu plus tard dans la journée

désolé, là je n'ai pas pigé comment faire, où afficher la question et les choix, et comment revenir en arrière si nécesaire

Hello

Dans mon exemple, je souhaite que les questions s'affichent toujours en cellule E2 et les 2 choix en F4 et F5

Je ne veux pas de retour en arrière possible. une fois le choix arreté, on ne peux pas revenir en arrière.

Par rapport à ma BDD, ca donne cela:

La cellule A1 de la bdd s'affiche en E2 dans la feuille "question"

Les cellules C1 et C5 s'affichent en F4 et F5

Si on clique sur choix 1, la cellule E1 de bdd s'affiche en E2 et en F4-F5 on a les cellules bdd G1 et G3 qui s'affichent

Si on clique sur choix 2, alors c'est E5 qui s'affiche en E2 et en F4-F5 on a les cellules bdd G5 et G7

Et ainsi de suite.

Mais comme annoncé, il faut surement que j'organise ma bdd différemment pour faciliter le script

Si on clique sur choix 1, la cellule E1 de bdd s'affiche en E2 et en F4-F5 on a les cellules bdd G1 et G3 qui s'affichent

Si on clique sur choix 2, alors c'est E5 qui s'affiche en E2 et en F4-F5 on a les cellules bdd G5 et G7

pour être précis, choix 1 et choix 2 c'est choix A et choix B

image

je vais donc ajouter sur la feuille un "niveau de profondeur" qui permet de savoir à quel étape on est arrivé ... (il faudra quand même un raz quelque part)

script

function choixA() {
  var f = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  var rep = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('réponses')
  var n = f.getRange('C2').getValue()
  n=n+1
  rep.getRange(1,n).setValue(f.getRange('F4').getValue())
  f.getRange('C2').setValue(n)
}
function choixB() {
  var f = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  var rep = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('réponses')
  var n = f.getRange('C2').getValue()
  n=n+1
  rep.getRange(1,n).setValue(f.getRange('F5').getValue())
  f.getRange('C2').setValue(n)
}

et quelques formules

en E2

=OFFSET('réponses'!A1;;question!C2-1)

en F4

=query({OFFSET('new bdd'!A:E;;4*(question!C2-1))};"select Col5 where Col3='choix A' and Col1='"&OFFSET('réponses'!A1;;question!C2-1)&"' limit 1";0)

en F5

=query({OFFSET('new bdd'!A:E;;4*(question!C2-1))};"select Col5 where Col3='choix B' and Col1='"&OFFSET('réponses'!A1;;question!C2-1)&"' limit 1";0)

Top!

Alors je vais regarder pour modifier un peu la formule car dans les choix proposés tu écris les questions suivantes.

En effet en F4 et F5, je veux 2 types de réponse qui dans la bdd se nomment choix A et B et non la question suivante. La question suivante découle de la réponse et ne fait pas partie des choix A ou B

Je vais aussi réfléchir au reset. Pour l'instant de ce que je comprend, il faut que je tape 1 dans "étape" pour revenir en arrière.

Pour l'instant ca me va. Je vais faire plusieurs séries de 4-5 questions. Il me faudra faire une sorte de reset après chaque série et basculer alors sur une nouvelle bdd

Je vais déjà fignoler de mon côté tout ça.

Merci pour ton aide. Tu m'as bien fait avancé

Voila j'ai réussi à modifier tes formules et une valeur du script pour voir s'afficher les questions et réponses.

J'ai fait un test avec 3 questions/réponses que j'ai écrit dans la bdd et ca marche bien

Maintenant il va falloir que je parvienne sur le même tableau de bord à définir une fin de série et à changer de bdd.

Mon but est de faire une série de 4-5 questions par jour et de repartir de 0 le lendemain sur une nouvelle série

Mais bon ce sera l'étape supérieure. Je vais déjà prendre un peu de temps pour faire un affichage personnalisé

Suite à ton aide Mikhail, j'ai un peu avancé.

https://docs.google.com/spreadsheets/d/1k5N6T2WWPJWi6S4o4lbnCUweFFr9aOZJTAPY54m7ZPg/edit#gid=2851511...

Je vais fournir ce "questionnaire" à plusieurs personnes qui pourront potentiellement se connecter en même temps. Pour palier à cela, je pense que je vais créer une feuille par personne et je distribuerai les droits pour que chacun ne puisse accéder qu'à sa feuille. (Pour l'instant j'ai juste crée 2 feuilles nominatives)

Ainsi chacun pourra répondre en simultané.

Je vais donner un score à la fin d'un cycle de 4 questions et dans la feuille "résultats", je vais consigner les scores de chacun.

Je vais faire plusieurs séries de questions. Il faudrait qu'à la fin de la série, la personne puisse visualiser son score et passer à la série suivante.

Je bloque sur 3 sujets:

-Comment passer à la série suivante? Quel serait le plus facile à mettre en oeuvre? Je pense par exemple à un bouton "passer à la série suivante" qui ne s'active que si la série est terminée (soit la cellule P1=5) Peut-être y a t'il une autre solution?

-Comment automatiquement décaler les intitulés des cellules J6 J14 et J17 afin qu'il aille chercher les infos dans la bdd à partir de la série suivante

(visuellement dans la bdd j'ai mis les mêmes intitulés mais ce sera bien sur des questions et choix différents pour chaque série)

-Comment conserver les score de chaque série dans la feuille "Résultats" fonction du nom et de la série?

Pour ces 3 problèmes je ne vois que de la macro possible et c'est la que je bute comme à mon habitude

Je suis parvenu à solutionner ma question n°2 mais ca m'oblige à dupliquer chaque macro pour chaque feuille afin que chaque personne puisse utiliser le tableur en même temps.

De même j'ai pu gérer ma BDD par série en affichant le numéro de série en O1

Reste à incrémenter cette valeur en fin de série.

Bonjour,

Je suis parvenu à solutionner ma question n°2 mais ca m'oblige à dupliquer chaque macro pour chaque feuille afin que chaque personne puisse utiliser le tableur en même temps.

Une solution est peut-être d'envoyer le lien uniquement en remplaçant la in par copy ... dans ce cas le script est lui aussi copié. Mais cela oblige ensuite le participant à donner des droits d'accès et indiquer l'id du nouveau fichier.

Je n'ai pas regardé si comme dans excel il était possible de dupliquer le script automatiquement.

Mais si chaque participant crée une copie du fichier, je ne pourrai pas faire de bilan récapitulaitf des scores.

Sinon j'ai déjà trouvé une astuce pour protéger ma bdd. Je peux bien sur la protéger mais ca n'empêchera pas l'accès en mode lecture à la feuille. Et donc un public averti saura quoi faire.

Je protégerai donc les feuilles puis j'ajouterai une grande image au dessus de toute les cellules. Comme seul moi pourrait toucher à cette image, personne ne pourra visualiser ce qu'il y a dessous.

Ca m'évite ainsi de mettre le bdd sur un autre Gsheets et de faire des importrange.

Mais si chaque participant crée une copie du fichier, je ne pourrai pas faire de bilan récapitulaitf des scores.

si tu connais l'id de chaque fichier, il suffit de compiler avec importrange

Ah oui, c'est une bonne idée. Ca va m'éviter de créer beaucoup de duplication de feuilles et de macro.

sur 5 participants cela n'aurait pa posé un gros problème mais je peux en avoir beaucoup. Et avec cette méthode, je ne suis pas obligé de me fixer une limite.

Au bout de 4 questions (soit la cellule P1=5), je souhaite stopper la macro.

J'ai donc mis un msgbox afin d'avertir la personne.

  function nom1choixA() {
var f = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet() //déclare la feuille active par la variable f
  var rep = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('réponses') //déclare la feuille réponse par la variable rep
  var n = f.getRange('P1').getValue() //déclare la cellule P1 
  if (n==5)
  Browser.msgBox('Série terminée!', Browser.Buttons.ok); 
  else
  n=n+1
  rep.getRange(1,n).setValue(f.getRange('P2').getValue()) //renseigne la cellule ligne1, colonne n de la feuille reponse par la valeur inscrite en P2 de la feuille f
  f.getRange('P1').setValue(n) //icrémente P1 de 1
}

Mais je ne vois pas comment stopper la macro. En effet si n=5 il n'incrémente plus n mais continue néanmoins la ligne suivante en me remplacant P2 de la feuille réponse

rep.getRange(1,n).setValue(f.getRange('P2').getValue())

si bien que je perds les données dans mon tableau de bord, notamment les scores.

Comment après mon msgbox je peux demander de ne plus rien faire?

Hello

Bon je suis parvenu à pratiquement finaliser ce que je voulais faire.

https://docs.google.com/spreadsheets/d/1VD3-5ai1pEcmXGt__3cMIY2nceZFQf4G388l_7R0A4A/edit?usp=sharing

Je peux finir une série, ca enregistre automatiquement le score dans la feuille résultat, la série change automatiquement à une certaine date souhaitée, etc

Je bloque juste sur un dernier point.

Je peux entamer une nouvelle série si la valeur de la cellule P1 de la feuille NOM1 est égale à 1

J'ai donc pensé à ajouter un script pour changer la valeur de la cellule à la fin de ma série

 if (n==6) {
  fscore.getRange(2,l+1).setValue(f.getRange('C26').getValue()) //renseigne le score dans la feuille résultat
  f.getRange('P1').setValue('1')
  Browser.msgBox('Série terminée!', Browser.Buttons.ok);

Seulement cela signifie que je peux recommencer à 0 ma série, ce que je ne souhaite pas.

Il faut donc que P1 prenne la valeur 1 si et seulement si je change de série.

Je change de série si la valeur de la cellule O1 s'incrémente de 1 (elle s'incrémente automatiquement par rapport à la date du jour)

Quel script me permettrait de donner la valeur de 1 à la cellule P1 lorsque la cellule O1 change?

hello j'ai trouvé une solution pour mon problème mais je dois mettre une condition dans le script et je ne sais pas l'écrire.

Ma condition est la suivante: si P1<6 et N1=N2, afficher un msgbox, sinon donner la valeur de 1 à P1 et copier coller en valeur N1 en N2

Voici le script que j'ai écrit. Bien sur il ne comprend pas mon IF AND avec mes 2 conditions. Comment je dois les rédiger?

function start(){
var f = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
if f.getRange('P1').getValue()<6 and f.getRange('N1').getValue()=f.getRange('N2').getValue() { 
  Browser.msgBox('Session déjà démarrée!', Browser.Buttons.ok)
}
else {
  f.getRange('P1').setValue('1')
  f.getRange('N2').activate();
  f.getRange('N1').copyTo(f.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  }
}

Bonjour,

if(f.getRange('P1').getValue()<6 && f.getRange('N1').getValue()==f.getRange('N2').getValue() {
  Browser.msgBox('Session déjà démarrée!', Browser.Buttons.ok)
}
else {
  f.getRange('P1').setValue('1')
  f.getRange('N2').activate();
  f.getRange('N1').copyTo(f.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  }
}
Rechercher des sujets similaires à "macro gestion choix successif"