Case à cocher qui fait office de compteur en format suivant H/M/S

Bonjour à tous

Je me permets de poser ma question ici car je ne trouve pas de réponse sur le net.

Attention cette demande est pour un jeux merci

Je souhaite faire un compteur de temps avec une case a cocher, je m'explique.

Quand la personne ouvre l'entreprise dans la journée elle devra cliquer sur la case en question et sa lance un compteur, quand elle s'en vas elle reclique dessus et sa stop le compteur.

quand elle réouvre l'entreprise elle refait la même action.

Je souhaite donc à chaque fois qu'elle clique sur la case, le compteur se lance et s'additionne avec le précédent si elle fait l'opération plusieurs fois dans la journée.

Ensuite faire un calcule suivant : par tranche de 30 minutes ouvré il gagné X argent.

Merci par avance.

Bonjour,

as-tu une maquette de fichier ?

Une nouvelle fois la demande n'est pas très claires

voici deux scripts qui permettent un défilé de temps dans 3 cellules de !a feuille "chronomètre"

var classeur = SpreadsheetApp.getActiveSpreadsheet();
var feuille = classeur.getSheetByName('Chronomètre');
function  ajoutSecondes(secondes, minutes, heures){
  while (heures <=24){   
    feuille.getRange(2,1).setValue(heures); 
    while (minutes <=59){   
      feuille.getRange(2,2).setValue(minutes);     
      while (secondes <= 59 ){     
        var h = feuille.getRange(2,1).getValue()
        var m = feuille.getRange(2,2).getValue()
        var s = feuille.getRange(2,3).getValue()
        if (h === 'pause' || m === 'pause' || s === 'pause'|| h === 'reinit' || m === 'reinit' || s === 'reinit' ) {
          return
        }      
        feuille.getRange(2,3).setValue(secondes); 
        SpreadsheetApp.flush();
        Utilities.sleep(1000)
        secondes ++
      }    
      secondes = 0;
      minutes = feuille.getRange(2,2).getValue();
      minutes ++
    }
    minutes = 0;
    heures = feuille.getRange(2,1).getValue();
    heures ++
  }
}

function demarrageMinuteur(){
  var heures = feuille.getRange(2,1).getValue();
  var minutes = feuille.getRange(2,2).getValue();
  var secondes = feuille.getRange(2,3).getValue();
  ajoutSecondes(secondes, minutes, heures);
}
chrono

Tu as de nouveau raison Gilbert ... et ta proposition 'intéresse beaucoup !

Une proposition complémentaire, voire complètement différente ... https://docs.google.com/spreadsheets/d/1YRe-JWJMKaaDMmwy0DjQDF6V7HHDoOXURT79ulcd1ow/copy

function onEdit(event){ 
  var f = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  if ( r.getA1Notation() == 'B2' && r.getValue()){ 
    var der = f.getLastRow()+1
    if (f.getRange('C2').getValue()==''){
      f.getRange('C2').setValue(new Date());
    }else{
      f.getRange('D2').setValue(new Date());
      f.getRange('C'+der).setValue(f.getRange('C2').getValue())
      f.getRange('D'+der).setValue(f.getRange('D2').getValue())
      f.getRange('C2:D2').clearContent()
    }
    r.setValue(!r.getValue())
  }
}

https://docs.google.com/spreadsheets/d/142CI1kk5_Bipx6lePqCi7Qwidwoi5WQXlWfFoqopEFs/edit?usp=sharing

Voici le lien de mon doc ou je tente mes essais sans succès

Pour plus de facilité merci de faire une copie du tableau en dessous pour que chaque personne puisse exposer son idée et mettre les idées en concordance.

Les ligne 1 et 2 seront copié et coller pour chaque jour de la semaine

Vous êtes au top en tous cas merci

pour que le fichier ait juste la possibilité d’être copié

Remplacer dans le lien edit?usp=sharing par /copy

Alors Juste une copie sera créée sans modifier ton original

@Gilbert, questions :

  • faut-il préférer un déclencheur sur la fonction ou une boucle Utilities.sleep(1000).
  • est-ce qu'en cas de boucle, google limite le temps de script ?

pour la question 1 les deux fonctionnent il faut voir si l' on préfère un morceau de code ou un trigger qui risque d'être oublié

pour la question 2 oui le temps de script est limité je pense que cette limite est encore en vigueur (a voir)

la durée d'exécution maximale du script est désormais fixée à 30 minutes pour les Utilisateurs G Suite Business/Enterprise/Education etseulement 6 minutes pour les autres utilisateurs


Limitations

  1. s'il faut en C3 faire défiler le temps, alors un trigger ne sera pas possible à moins de 1mn, on ne verra pas défiler les secondes mais si on cherche des plages d'une demi-heure ce n'est sans doute pas important
  2. sinon la solution Gilbert est à privilégier mais avec une limitation à 6mn en temps total (sauf si j'ai bien compris jouer avec les properties)
  3. il y a peut-être une autre solution, c'est de mettre le décompte dans une page html en sidebar, dans ce cas, le script tourne sur le poste utilisateur sans limitation de temps, sans intervention du serveur, sans latence

solution un peu complexe à base de déclencheurs ...

  • onglet mike
  • il me reste à faire le cumul
  • il faut d'abord activer (voir menu)

bon, je pense qu'il y a plus simple !

function onInstall(e) {
  onOpen(e); 
}
function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('**ACTIVER**')
  .addItem('👉 Activer', 'activate')
  .addToUi();
}
function activate(){
  if(!isTrigger('onSpeEdit')) {
    ScriptApp.newTrigger('onSpeEdit')
      .forSpreadsheet(SpreadsheetApp.getActive())
      .onEdit()
      .create();
  }
  SpreadsheetApp.getActive().toast('your script is now active !')
}
function onSpeEdit(event) {
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName()=='mike' && cellule.getA1Notation()=='B3'){
    if (cellule.getValue()){
      myTriggerSetup('decompte')
      SpreadsheetApp.getActive().toast('Début du décompte !')
      var d = new Date()
      feuille.getRange('C3:D3').setValue(d)
    }else{
      myTriggerDelete('decompte')
      SpreadsheetApp.getActive().toast('Fin du décompte !')
      var d = new Date()
      feuille.getRange('D3').setValue(d)
      feuille.getRange('F3').setValue(feuille.getRange('E3').getValue())
      SpreadsheetApp.flush();

      // https://stackoverflow.com/questions/59518770/adding-two-time-duration-values
      var rgD = feuille.getRange('F3') // durée
      var rgT = feuille.getRange('G3') // total
      rgD.setNumberFormat("#.################");
      rgT.setNumberFormat("#.################");
      var vD=Number(rgD.getDisplayValues());
      var vT=Number(rgT.getDisplayValues());
      rgD.setNumberFormat("[h]:mm:ss");
      rgF.setNumberFormat("[h]:mm:ss");
      feuille.getRange('G3').setValue(vD+vT)
      feuille.getRange('G3').setNumberFormat("[h]:mm:ss")

      feuille.getRange('C3:D3').clearContent()
    }
  }
}
function decompte(){
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName('mike').getRange('D3').setValue(new Date())
}
function myTriggerSetup(nom) {
  if(!isTrigger(nom)) {
    ScriptApp.newTrigger(nom)
      .timeBased()
      .everyMinutes(1)
      .create();  
  }
}
function myTriggerDelete(nom){
     deleteTriggersByName(nom);
}
function deleteTriggersByName(name){
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++){ 
    if (triggers[i].getHandlerFunction().indexOf(name) != -1) 
    {
      ScriptApp.deleteTrigger(triggers[i]);
    }
}}
function isTrigger(funcName) {
     var r=false;
     if(funcName) {
       var allTriggers=ScriptApp.getProjectTriggers();
       var allHandlers=[];
       for(var i=0;i<allTriggers.length;i++) {
         allHandlers.push(allTriggers[i].getHandlerFunction());
       }
       if(allHandlers.indexOf(funcName)>-1) {
         r=true;
       }
     }
     return r;
}

c'est super l'aide que vous m'apporter.

Mais je suis vraiment débutant dans Excel.

Je ne sais pas comment intégrer les scripts que vous écrivait.

il n'y a pas de fonction dans Excel qui permette de le faire?

Ne pas confondre excel et google sheets, il faut que tu précises si tu utilises l'un ou l'autre.

Et ce que tu demandes n'est pas forcément simple à réaliser.

Oui pardon je l'utilise dans google sheet

Mais c'est pareil je suis débutant aussi .

Ok mais pour les intervenants il y a beaucoup de différences c’est pourquoi nous demandons de spécifier

D'accord je suis vraiment désolé dans ce cas

Je pensais que sa ne changerais rien

As-tu des remarques par rapport à ma proposition (qui je l'avoue est assez complexe) ?

Je vais tenter de faire de même avec un code html/javascript en sidebar si cela t'intéresse ...

Rechercher des sujets similaires à "case cocher qui fait office compteur format suivant"