web-dev-qa-db-ja.com

Googleスプレッドシート-祝祭日でない場合、各曜日の発生を数える方法は?

祝祭日でない場合、月の各曜日の発生をカウントしたいと思います。

さらに詳しく言えば、ある月に1人の人が月曜日、火曜日、水曜日、木曜日、金曜日にいくら働かなくてはならないのか知りたいのです。

これまでのところ、私は次のカスタム関数を使用しています:

_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;
}
_

このスクリプトを使用すると、セルに=occurrenceOfSpecificDay("Monday", "September", 2019)を挿入することで、2019年9月の月曜日の数を返すことができますが、休日の場合は日を数えたくありません。

指定された日がデンマークの祝日である場合にfalseを返す追加の引数を使用して、次の条件を拡張したいと思います。

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

@tedinozは私に別のアプローチを導きました:カスタム関数の代わりに、私はNETWORKDAYS.INTLを次のように使用することになりました:

  • 月曜日:=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")

説明

documentation によると、NETWORKDAYS.INTLの3番目のパラメータは、曜日を表す「1」と「0」の7文字長のシーケンスです。最初の文字は月曜日、次の文字は火曜日などです。「1」は「週末」を意味し、「0」は「平日」を意味します。

NETWORKDAYS.INTLは就業日のみをカウントするため、他の日を表す文字を「0」に設定することにより、特定の日をカウントするために使用できます。残りの日は週末として定義されているため、0100000は火曜日のみをカウントします(休日でない場合のみ)。

1
Biró Norbi