web-dev-qa-db-fra.com

Google Sheets - Comment compter l'occurrence de chaque jour de la semaine s'il ne s'agit pas de jours fériés?

Je voudrais compter l'occurrence de chaque jour de la semaine dans un mois s'ils ne sont pas des jours fériés.

Plus en détail, j'aimerais savoir combien de lundis, mardis, mercredis, jeudis et vendredis une personne doit travailler au cours d'un mois donné, car chaque jour a des heures d'ouverture différentes et leur salaire est basé sur cela.

Jusqu'à présent, j'utilise la fonction personnalisée suivante:

function occurrenceOfSpecificDay(dayName, monthName, year) {
  // set names
  var monthNames = ["January", "February", "March", 
    "April", "May", "June",
    "July", "August", "September", 
    "October", "November", "December"
  ];
  var dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", 
    "Thursday", "Friday", "Saterday"
  ];

  // change string to index of array
  var day = dayNames.indexOf(dayName);
  var month = monthNames.indexOf(monthName)+1;

  // determine the number of days in month
  var daysinMonth = new Date(year, month, 0).getDate();

  // set counter
  var sumDays=0;

  // iterate over the days and compare to day
  for(var i=1; i<=daysinMonth; i++) {
    var checkDay = new Date(year, month-1, parseInt(i)).getDay();    
    if(day === checkDay ) {
      sumDays ++;
    }
  }

  // show amount of day names in month
  return sumDays;
}

Avec ce script, je peux retourner le nombre de lundis en septembre 2019 en insérant =occurrenceOfSpecificDay("Monday", "September", 2019) dans une cellule, mais je ne veux pas compter le jour s'il s'agit d'un jour férié.

Je voudrais étendre la condition suivante avec un argument supplémentaire qui renvoie faux si le jour donné est un jour férié danois:

if(day === checkDay ){
    sumDays ++;
}
1
Biró Norbi

@tedinoz m'a guidé vers une approche différente: au lieu de la fonction personnalisée, j'ai fini par utiliser NETWORKDAYS.INTL de la manière suivante:

  • Lundi: =NETWORKDAYS.INTL("8/1/2019",eomonth("8/1/2019", 0), "0111111")
  • Mardis: =NETWORKDAYS.INTL("8/1/2019",eomonth("8/1/2019", 0), "1011111")
  • Mercredis: =NETWORKDAYS.INTL("8/1/2019",eomonth("8/1/2019", 0), "1101111")
  • Jeudis: =NETWORKDAYS.INTL("8/1/2019",eomonth("8/1/2019", 0), "1110111")
  • Vendredi: =NETWORKDAYS.INTL("8/1/2019",eomonth("8/1/2019", 0), "1111011")

Explication

Selon le documentation , le 3ème paramètre de NETWORKDAYS.INTL est une séquence de 7 caractères de "1" et de "0", représentant les jours de la semaine (le premier caractère est lundi, le suivant est mardi, etc.) où le "1" signifie "week-end" et le "0" signifie "jour de semaine".

Depuis NETWORKDAYS.INTL ne compte que les jours ouvrables, il peut être utilisé pour compter des jours spécifiques en définissant les caractères représentant les autres jours sur "0". Sens, 0100000 ne comptera que les mardis (uniquement si ce ne sont pas des jours fériés) car les autres jours sont définis comme des week-ends.

1
Biró Norbi