Créer un bouton pour affichier boite de dialogue qui renseigne la feuille

Bonjour à tous,

J'aimerais créer un bouton sur le lequel l'utilisateur puisse cliquer.

Une fois qu'il clique dessus, j'aimerais qu'une boite de dialogue s'affiche.

Dans cette boite de dialogue, j'aimerais qu'il puisse cocher une option parmi les deux proposées.

Une fois cochée, il valide.

Une fois validée, cela vient remplir une feuille avec un horodateur et la saisie est récupérée pour alimenter un calcul global.

Voici un lien test : https://docs.google.com/spreadsheets/d/1GNHmDyEBIA6CXf-EuFVQgg3P_mW35_suAOhW_w9htkM/edit?usp=sharing

Un grand merci pour vos retours :-)

Bonjour,

Attention : les images insérées dans une cellule ne sont pas cliquables. Il faut les mettre au-dessus.

Cela risque de faire beaucoup de clics, et puis le fait de programmer une boite de dialogue.

J'aime bien les choses plus simples :

Mets une vraie case à cocher en G2 et G3 (ou ailleurs !) : insertion > case à cocher

function onEdit(event){
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName()=='Feuille 1'){
    if (cellule.getA1Notation()=='G2' && cellule.getValue()){
      Browser.msgBox('je fais ceci')
      cellule.setValue(false)
    }
    if (cellule.getA1Notation()=='G3' && cellule.getValue()){
      Browser.msgBox('je fais cela')
      cellule.setValue(false)
    }
  }
}

Si cela déclenche un email, il faudra alors mettre un déclencheur sur onEDit qui devient un "installable trigger" (voir restrictions ici https://developers.google.com/apps-script/guides/triggers)

Bonjour Mikhail,

Merci pour ton retour 😊

Pour te mettre dans le contexte, les utilisateurs doivent atteindre un certain nombre de "saisie" pour finaliser un projet sous forme de jeu.

Ils doivent faire jusqu'à 40 Saisies (étalées sur plusieurs semaines). Donc une seule case à cocher ne suffit pas.

Dans l'idéal, ils doivent pouvoir cliquer sur une icône "cliquable" qui leur demandera de confirmer leur saisie. Une fois ceci fait, cela vient alimenter tout un système, dont un décompte. Et ils doivent pouvoir cliquer 40 fois.

Un bouton cliquable n'aura aucune limite. Une case à cocher si 😔

Je n'ai pas vraiment saisi ta remarque

Un bouton cliquable n'aura aucune limite. Une case à cocher si

note bien que je remets à false la case à cocher, donc c'est sans limite

Bonjour Mikhail,

Je n'ai pas bien compris, tu veux dire que les cases à cocher se "décocheraient" automatiquement une fois les clics effectués?

Du c'est bien ça, cela voudrait dire :

  1. L'utilisateur clic sur un choix
  2. Une boîte de dialogue s'ouvre pour confirmer
  3. Il valide
  4. La case de re"décoche" toute seule

C'est bien ça ?

Est-ce qu'un accès uniquement en lecture peut faire l'affaire ?

oui pour 1 et 4 sans forcément passer par 2 et 3 (sauf si on veut se prémunir d'une mauvaise manip)

oui en lecture seule c'est ok, je ferai une copie pour tester

trop bien Mike

case a cocher click

Bonjour, c'est vraiment super :-)

Par contre, je n'ai pas réussi à faire fonctionner le code. Je l'ai copié, j'ai renommé la bonne feuille et bonnes cellules.

Je dois installer quelque chose en complément c'est cela ? (le fameux trigger ?)

Merci pour votre patience ...

si tu lances un email avec cela il faudra en effet le déclarer en trigger, mais essaie juste comme Gilbert avant toute adaptation

Bonjour,

Merci pour ce retour, j'ai testé et effectivement, ça fonctionne. J'avais une erreur au début, la case se remettait en "False" après avoir coché, mais en toute lettre. J'ai juste eu besoin de supprimer et remettre les cases à cocher. Désormais, c'est tout bon.

L'étape suivante pour moi serait de réussir à créer une ligne dans sheet lorsqu'on coche une case, je m'explique :

  1. L'utilisateur clic sur la case 1 ou 2 (15 minutes ou 30 minutes dans mon exemple)
  2. Son clic génère une ligne dans l'onglet "Sessions" que j'ai créé dans la feuille
  3. Les lignes créées sont composées d'un horodateur et de la saisie de 15 ou 30 minutes
  4. La saisie de 15 ou 30 minutes est utiliser pour alimenter d'autres calculs dans le tableau.

Est-ce que c'est possible de créer tout ce "mécanisme" ?

Je remets le lien de la feuille "test" ici (le code est resté activé) : https://docs.google.com/spreadsheets/d/1GNHmDyEBIA6CXf-EuFVQgg3P_mW35_suAOhW_w9htkM/edit#gid=0

https://docs.google.com/spreadsheets/d/1xijtvF5CygD74FFX_emaIA8L2p8NAx1bbHZIFG4FWvA/edit?usp=sharing

function onEdit(event){
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName()=='Feuille 1'){
    var fSessions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sessions');
    var derL=fSessions.getLastRow()+1
    if (cellule.getA1Notation()=='G2' && cellule.getValue()){
      fSessions.getRange('A'+derL).setValue(new Date())
      fSessions.getRange('B'+derL).setValue(cellule.offset(0,1).getValue())
      Browser.msgBox('OK Reporté dans "Sessions"')
      cellule.setValue(false)
    }
    if (cellule.getA1Notation()=='G3' && cellule.getValue()){
      fSessions.getRange('A'+derL).setValue(new Date())
      fSessions.getRange('B'+derL).setValue(cellule.offset(0,1).getValue())
      Browser.msgBox('OK Reporté dans "Sessions"')
      cellule.setValue(false)
    }
  }
}

Excellent ! Merci beaucoup Mikhail, c'est vraiment top ! Merci merci merci !

J'ai réussi à l'adapter à mon projet final.

Pour finaliser mon idée, j'aurais encore besoin de 2 éléments :

  1. Est-il est possible d'intégrer un bouton pour confirmer la saisie, par exemple : "cliquez sur ok" pour valider votre saisie.
  2. Pouvons nous empêcher toute saisie pendant 15 minutes après en avoir effectuée une ?

Encore merci pour tout.

Pour le point 1, tu as des exemples ici https://www.sheets-pratique.com/fr/codes/msgbox

Est-ce que je te laisse adapter ?


Pour le point 2, on peut contrôler l'écart par rapport au dernier enregistrement dans Sessions, ou utiliser PropertiesService

Je regarde demain

Salut Mikhail,

Un grand merci pour ton aide. Je vais essayer de trafficoter tout cela et l'adapter à mon projet, ça me permet de progresser un peu dans le domaine.

Je tente de faire ça dans les jours qui viennent. Si je rencontre des difficultés, je ne manquerai pas de les partager sur ce topic.

Encore merci pour ta patience, c'est tellement appréciable !

Une information pour le point 2 alors ... si tu compares 1/1/2021 17:15 et 1/1/2021 17:16 tu auras 60000, car le temps est alors traduit en millisecondes.

Si tu souhaites que la différences soit 15mn, alors compare avec 900000

Bon, première difficulté ...

En fait, quelque soit ma saisie, cela enregistre quelque chose dans l'onglet "Sessions" ... même si je dis non.

Deuxième difficulté, si je n'autorise que la "lecture" à l'utilisateur, il ne peut pas cocher les cases 🤔

Une idée ?

Voici mon code :

function onEdit(event){
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName()=='Feuille 1'){
    var fSessions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sessions');
    var derL=fSessions.getLastRow()+1
    if (cellule.getA1Notation()=='G2' && cellule.getValue()){
      fSessions.getRange('A'+derL).setValue(new Date())
      fSessions.getRange('B'+derL).setValue(cellule.offset(0,1).getValue())
      if (Browser.msgBox('Confirmation', 'Etes-vous sûr ?', Browser.Buttons.YES_NO) == 'yes') {
    Browser.msgBox('Vous avez cliqué sur "Oui" !')
      cellule.setValue(false)
    }
    if (cellule.getA1Notation()=='G3' && cellule.getValue()){
      fSessions.getRange('A'+derL).setValue(new Date())
      fSessions.getRange('B'+derL).setValue(cellule.offset(0,1).getValue())
      Browser.msgBox('OK Reporté dans "Sessions"')
      cellule.setValue(false)
    }
  }
  }}

Plutôt ceci (question de positionnement)

function onEdit(event){
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName()=='Feuille 1'){
    var fSessions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sessions');
    var derL=fSessions.getLastRow()+1
    if (cellule.getA1Notation()=='G2' && cellule.getValue()){
      if (Browser.msgBox('Confirmation', 'Etes-vous sûr ?', Browser.Buttons.YES_NO) == 'yes'){
        fSessions.getRange('A'+derL).setValue(new Date())
        fSessions.getRange('B'+derL).setValue(cellule.offset(0,1).getValue())
        Browser.msgBox('OK Reporté dans "Sessions"')
      }
      cellule.setValue(false)
    }
    if (cellule.getA1Notation()=='G3' && cellule.getValue()){
      if (Browser.msgBox('Confirmation', 'Etes-vous sûr ?', Browser.Buttons.YES_NO) == 'yes'){
        fSessions.getRange('A'+derL).setValue(new Date())
        fSessions.getRange('B'+derL).setValue(cellule.offset(0,1).getValue())
        Browser.msgBox('OK Reporté dans "Sessions"')
      }
      cellule.setValue(false)
    }
  }
}

Et pour la lecture, of course, lecture seulement = lecture, pas modif !

Bonjour Mikhail, merci infiniment !!!

J'ai réussi à l'adapter à mon projet final, quel bonheur :-)

Je pense qu'il n'y a plus que cette histoire de "PropertiesService" pour éviter que les utilisateurs soient tentés de cliquer trop de fois sur une des cases. Est-ce que a tout hasard tu as eu la possibilité de voir ?

Je suis bien gêné de t'en demander tant. Merci encore Mikhail !

Edit : En ce qui concerne le mode "lecteur", je l'ai basculé en mode éditeur en protégeant toute la feuille, sauf les cellules concernées (là ou il est possible de cocher).

Désolé, j'ai oublié, je regarde ...

Un essai, j'ai mis 1 mn pour les essais, ensuite tu peux régler ...

function onEdit(event){
  var delai = 1 // minutes
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName()=='Feuille 1'){
    var fSessions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sessions');
    var derL=fSessions.getLastRow()+1
    if (cellule.getA1Notation()=='G2' && cellule.getValue()){
      d=new Date()
      if (d.getTime()-getHorodateAction() < delai * 60000){toast('Trop rapide !')}else{
      if (Browser.msgBox('Confirmation', 'Etes-vous sûr ?', Browser.Buttons.YES_NO) == 'yes'){
        fSessions.getRange('A'+derL).setValue(d)
        setHorodateAction(d.getTime())
        setHorodateAction(new Date())
        fSessions.getRange('B'+derL).setValue(cellule.offset(0,1).getValue())
        toast('OK Reporté dans "Sessions"')}
      }
      cellule.setValue(false)
    }
    if (cellule.getA1Notation()=='G3' && cellule.getValue()){
      d=new Date()
      if (d.getTime()-getHorodateAction() < delai * 60000){toast('Trop rapide !')}else{
      if (Browser.msgBox('Confirmation', 'Etes-vous sûr ?', Browser.Buttons.YES_NO) == 'yes'){
        fSessions.getRange('A'+derL).setValue(d)
        setHorodateAction(d.getTime())
        fSessions.getRange('B'+derL).setValue(cellule.offset(0,1).getValue())
        toast('OK Reporté dans "Sessions"')}
      }
      cellule.setValue(false)
    }
  }
}
function toast(body, title, timeout) {
  return SpreadsheetApp.getActive().toast(
    body,
    title || "information",
    timeout || 5 // In seconds
  );
}
function setHorodateAction(value) {
  return PropertiesService.getUserProperties().setProperty("ACTION", value);
}
function getHorodateAction() {
  return PropertiesService.getUserProperties().getProperty("ACTION") || "";
}
function clearHorodateAction(){
  PropertiesService.getUserProperties().deleteProperty("ACTION");
}
Rechercher des sujets similaires à "creer bouton affichier boite dialogue qui renseigne feuille"