Création pointeuse

Bonjour

je lance un sujet en parallèle d'un autre car je bloque également. Les deux se ressemblent mais il me manque certaines connaissances.

Je pars à la recherche d'aide

Le fichier est le suivant : https://docs.google.com/spreadsheets/d/1BoCBX3s7_-kZvILIgfWXpEw5OQ6t8LJBmvGXvz1Qzbg/edit?usp=sharing

J'essaie de fabriquer une pointeuse : la personne sélectionne son prénom dans le menu déroulant. Le prénom s'affiche sur deux boutons (arrivée et départ).

La personne clique sur le bouton qui correspond (si elle arrive ou si elle part). La date et l'heure s'affiche sur le bouton puis se sauvegarde dans un onglet qui porte le nom de la personne. Dans la colonne A1 si elle arrive, dans la colonne B1 si elle part.

Je bloque sur 2 problèmes. Je n'arrive pas à programmer la condition si le nom du menu est X alors choisir tel onglet, si le nom est Y alors choisir tel onglet.

Et enfin, je n'arrive pas à mettre les données du bouton départ dans la colonne B1.

Mille mercis

Salut,

Demande d'accès faite

Par contre, il faut prendre en compte les quelques faiblesses inhérentes à un tel système : si quelqu'un se trompe, si quelqu'un pointe pour une autre personne, etc.

Bonjour Pierre,

Et merci de ton aide.

J'ai ouvert l'accès. Effectivement, il y a des faiblesses. L'idéal aurait été de faire plus complexe avec un code pin et surtout une fenêtre pop qui deamnde confirmation.

Mais j'ai essayé de faire avec mes compétences. Est-ce qu'une fenêtre de confirmation est difficile à mettre en oeuvre ?

Primo, si je reprends ton fonctionnement actuel :

function arrivee(){
  const feuille = SpreadsheetApp.getActive().getActiveSheet();
  const user = feuille.getRange('A2').getValue();
  const horodatage = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'dd-MM-YYYY    HH:mm') 
  const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  for (let sheet of sheets) {
    if (sheet.getName() === user) {
      sheet.appendRow([horodatage,"arrivée"]);
      return;
    }
  }
  console.error(`Aucune feuille trouvée pour l'utilisateur : ${user}`);
}

function depart(){
  const feuille = SpreadsheetApp.getActive().getActiveSheet();
  const user = feuille.getRange('A2').getValue();
  const horodatage = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'dd-MM-YYYY    HH:mm') 
  const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  for (let sheet of sheets) {
    if (sheet.getName() === user) {
      sheet.appendRow([horodatage,"départ"]);
      return;
    }
  }
  console.error(`Aucune feuille trouvée pour l'utilisateur : ${user}`);
}

ainsi, dans la page de chaque employée, il sera noté l'horodatage et le type de pointage (arrivée / départ).

Ensuite, si on veut mettre un pin (exemple avec arrivee) :

function arrivee(){
  const feuille = SpreadsheetApp.getActive().getActiveSheet();
  const user = feuille.getRange('A2').getValue();
  const horodatage = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'dd-MM-YYYY    HH:mm') 
  const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  const settingSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('settings');
  const userSetting = settingSheet.getDataRange().getValues().find(row => row[0] === user);
  const userPin = userSetting[1]; 
  const ui = SpreadsheetApp.getUi();
  for (let sheet of sheets) {
    if (sheet.getName() === user) {
      var pass = ui.prompt("Bonjour, "+user+" veuillez mettre votre code PIN afin de valider votre arrivée :").getResponseText();
      if (pass == userPin) {
      sheet.appendRow([horodatage,"arrivée"]);
      ui.alert("Arrivée enregistrée, bonne journée !");
      return;
        }else{    
          ui.alert("Code PIN incorrect.");
          return;
        }
    }
  }
  console.error(`Aucune feuille trouvée pour l'utilisateur : ${user}`);
}

Je ne sais pas quoi dire.

C'est dingue ce que tu arrives, vous arrivez à faire, aussi rapidement.

Vraiment merci !

J'aimerais vraiment arriver à faire ce type de programme. Je comprends globalement ce que tu as fait mais j'en suis incapable.

Un immense merci. Je vais pouvoir avancer. Mon but étant que j'obtienne automatiquement les durées quotidiennes et hebdomadaires.

C'est super.

C'est grosso modo du javascript, on sort de l'usage "standard' d'un tableur, si tu le souhaites, il y a des tutos disponibles sur ce site : https://sheets-pratique.com/fr/apps-script

Merci Pierre.

Je bloque déjà sur quelque chose

https://docs.google.com/spreadsheets/d/1e_uHI8YT-PmZ-Sz4IewQomnpc8wxJn1YR-guX10DSEs/edit?usp=sharing

Dans l'onglet Catherine, j'ai voulu calculer la différence de durée entre le départ et l'arrivée.

J'ai d'abord transformé le script pour avoir une colonne date et une colonne heure.

Puis dans une cellule j'ai mis : =IF(AND(B1=B2;A1<>A2);C2-C1;"") Normalement, il y a une arrivée et un départ. Sinon, Catherine a oublié de pointer une fois et ca ne calcule rien.

que j'ai voulu appliquer à toute la colonne.

Ca fonctionne mais le souci et que lorsque Catherine repointe, la ligne suivante se met à l'endroit où la fonction ne s'applique plus dans la colonne.

Est-ce à cause de la fonction appendRow ?

Faudrait-il que je m'y prenne autrement ?

Merci.

Re,

Correction faite, c'est la fonction depart qui insère la duree directement

Pierre,

encore une fois merci !

Je pensais arriver à le faire plus facilement. Et là, je suis perdu dans le script. Mais c'est très gentil

Ce n'est pas si complexe, on prends la date et l'heure, on les transforme en objet date, on soustrait départ - arrivée en ms, puis on convertir en HH:SS et on insère.

Une amélioration serai de vérifier que l'input précédent est bien de type "arrivée"

Idem, avant de valider une arrivée il serai judicieux de vérifier que l'input précédent est un départ.

Merci Pierre,

j'avais effectivement pensé à ces améliorations.

J'essaierai de le faire moi lorsque j'aurai progressé

Rechercher des sujets similaires à "creation pointeuse"