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 ++;
}
@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:
=NETWORKDAYS.INTL("8/1/2019",eomonth("8/1/2019", 0), "0111111")
=NETWORKDAYS.INTL("8/1/2019",eomonth("8/1/2019", 0), "1011111")
=NETWORKDAYS.INTL("8/1/2019",eomonth("8/1/2019", 0), "1101111")
=NETWORKDAYS.INTL("8/1/2019",eomonth("8/1/2019", 0), "1110111")
=NETWORKDAYS.INTL("8/1/2019",eomonth("8/1/2019", 0), "1111011")
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.