Partager via


Exemple de scénario de scripts Office : Bouton d’horloge perforé

L’idée de scénario et le script utilisés dans cet exemple ont été fournis par Brian Gonzalez, membre de la communauté Scripts Office.

Dans ce scénario, vous allez créer une feuille de temps pour un employé qui lui permet d’enregistrer ses heures de début et de fin avec un bouton. En fonction de ce qui a été enregistré précédemment, la sélection du bouton commence leur jour (horloge entrante) ou termine leur journée (horloge sortante).

Tableau avec trois colonnes ( « Horloge entrante », « Horloge sortante » et « Durée ») et un bouton intitulé « Horloge perforée » dans le classeur.

Instructions d’installation

  1. Téléchargez l’exemple de classeur sur votre OneDrive.

    Table avec trois colonnes : « Horloge entrante », « Horloge sortante » et « Durée ».

  2. Ouvrez le classeur dans Excel.

  3. Sous l’onglet Automatiser , sélectionnez Nouveau script et collez le script suivant dans l’éditeur.

    /**
     * This script records either the start or end time of a shift, 
     * depending on what is filled out in the table. 
     * It is intended to be used with a Script Button.
     */
    function main(workbook: ExcelScript.Workbook) {
      // Get the first table in the timesheet.
      const timeSheet = workbook.getWorksheet("MyTimeSheet");
      const timeTable = timeSheet.getTables()[0];
    
      // Get the appropriate table columns.
      const clockInColumn = timeTable.getColumnByName("Clock In");
      const clockOutColumn = timeTable.getColumnByName("Clock Out");
      const durationColumn = timeTable.getColumnByName("Duration");
    
      // Get the last rows for the Clock In and Clock Out columns.
      let clockInLastRow = clockInColumn.getRangeBetweenHeaderAndTotal().getLastRow();
      let clockOutLastRow = clockOutColumn.getRangeBetweenHeaderAndTotal().getLastRow();
    
      // Get the current date to use as the start or end time.
      let date: Date = new Date();
    
      // Add the current time to a column based on the state of the table.
      if (clockInLastRow.getValue() as string === "") {
        // If the Clock In column has an empty value in the table, add a start time.
        clockInLastRow.setValue(date.toLocaleString());
      } else if (clockOutLastRow.getValue() as string === "") {
        // If the Clock Out column has an empty value in the table, 
        // add an end time and calculate the shift duration.
        clockOutLastRow.setValue(date.toLocaleString());
        const clockInTime = new Date(clockInLastRow.getValue() as string);
        const clockOutTime  = new Date(clockOutLastRow.getValue() as string);
        const clockDuration = Math.abs((clockOutTime.getTime() - clockInTime.getTime()));
    
        let durationString = getDurationMessage(clockDuration);
        durationColumn.getRangeBetweenHeaderAndTotal().getLastRow().setValue(durationString);
      } else {
        // If both columns are full, add a new row, then add a start time.
        timeTable.addRow()
        clockInLastRow.getOffsetRange(1, 0).setValue(date.toLocaleString());
      }
    }
    
    /**
     * A function to write a time duration as a string.
     */
    function getDurationMessage(delta: number) {
      // Adapted from here:
      // https://stackoverflow.com/questions/13903897/javascript-return-number-of-days-hours-minutes-seconds-between-two-dates
    
      delta = delta / 1000;
      let durationString = "";
    
      let days = Math.floor(delta / 86400);
      delta -= days * 86400;
    
      let hours = Math.floor(delta / 3600) % 24;
      delta -= hours * 3600;
    
      let minutes = Math.floor(delta / 60) % 60;
    
      if (days >= 1) {
        durationString += days;
        durationString += (days > 1 ? " days" : " day");
    
        if (hours >= 1 && minutes >= 1) {
          durationString += ", ";
        }
        else if (hours >= 1 || minutes > 1) {
          durationString += " and ";
        }
      }
    
      if (hours >= 1) {
        durationString += hours;
        durationString += (hours > 1 ? " hours" : " hour");
        if (minutes >= 1) {
          durationString += " and ";
        }
      }
    
      if (minutes >= 1) {
        durationString += minutes;
        durationString += (minutes > 1 ? " minutes" : " minute");
      }
    
      return durationString;
    }
    
  4. Renommez le script en « Horloge à poinçon ».

  5. Enregistrez le script.

  6. Dans le classeur, sélectionnez la cellule E2.

  7. Bouton Ajouter un script. Accédez au menu Plus d’options (...) dans la page Détails du script , puis sélectionnez Ajouter dans le classeur.

  8. Enregistrez le classeur.

Exécutez le script

Sélectionnez le bouton Perforer l’horloge pour exécuter le script. Il enregistre l’heure actuelle sous « Horloge entrante » ou « Horloge sortante », en fonction de ce qui a été entré précédemment.

Le tableau et le bouton « Punch clock » dans le classeur.

Remarque

La durée est enregistrée uniquement si elle est supérieure à une minute. Modifiez manuellement l’heure « Horloge entrante » pour tester des durées plus importantes.