営業日数を手動で計算するのは、特に土日祝を考慮する場合、煩雑でミスが発生しやすい作業です。しかし、Google Apps Script(GAS)とGoogle Calendar APIを組み合わせることで、正確かつ効率的に土日祝を除いた営業日数を自動算出することが可能です。本記事では、キャッシュを活用してパフォーマンスを向上させつつ、営業日数を自動で算出する方法を、実際のコードとサンプルデータを使ってわかりやすく解説します。
営業日数を効率的に自動算出する方法とは?
土日祝日を考慮した営業日数の算出は、業務効率化の重要なポイントです。
しかし、祝日や休日情報を毎回計算することで、処理に膨大な時間がかかる場合があります。
そこで、この記事ではGoogle Calendar APIを使い、日本の土日祝日を自動的に取得し、キャッシュを活用してパフォーマンスを改善する営業日数の計算方法を解説します。
通常の営業日数計算の問題点
従来の方法では、祝日情報を毎回取得し、その都度計算するため、大量のデータをループして判定する処理が発生し、処理時間が長くなりがちです。
例えば、特定の期間内に土日祝日を配列として持ち、全ての営業日を判定しようとすると、全ての日付に対して祝日かどうかを毎回チェックするため、大きな負担がかかります。
特に長期間の計算や大規模データを扱う場合、パフォーマンスが低下する原因となります。
キャッシュを使ったパフォーマンス改善の仕組み
ここでは、Google Apps Script(GAS)を使い、Google Calendar APIで取得した祝日情報をキャッシュし、毎回APIを呼び出さずに処理速度を向上させる方法を紹介します。
キャッシュを利用することで、祝日データを1回取得した後は再利用可能になり、処理時間を大幅に削減します。
コードの詳細解説
今回紹介するコードでは、次の2つのファイルで構成されています:
Util.gs
: 土日祝日をキャッシュするためのユーティリティ関数。measure.gs
: 営業日数を実際に計算する関数。
Util.gs の解説:土日祝日をキャッシュする仕組みと営業日判定のロジック
// 祝日のキャッシュを作成
let holidayCache = {}; // 祝日データを一時的に保存するキャッシュ
function cacheHolidays(startDate, endDate) {
const start = new Date(startDate);
const end = new Date(endDate);
if (Object.keys(holidayCache).length === 0) { // キャッシュが空の場合にのみ祝日を取得
const events = calendar.getEvents(start, end); // Google Calendar APIで祝日を取得
events.forEach(event => {
const dateKey =formatDate(event.getStartTime()); // 日付をキーにしてキャッシュに格納
holidayCache[dateKey] = true; // キャッシュに祝日情報を保存
});
}
}
function isCachedHoliday(date) {
const dateKey = formatDate(date);
return holidayCache[dateKey] || false; // キャッシュから祝日をチェック
}
function isWorkingday(date) {
const dayOfWeek = date.getDay(); // 曜日を取得 (0=日曜, 6=土曜)
return (dayOfWeek !== 0 && dayOfWeek !== 6 && !isCachedHoliday(date)) // 土日祝を除外
}
function hasHolidayCache() {
return !(Object.keys(holidayCache).length === 0); // キャッシュが空か確認
}
function formatDate(date) {
const d = new Date(date);
let month = '' + (d.getMonth() + 1);
let day = '' + d.getDate();
const year = d.getFullYear();
if (month.length < 2) month = '0' + month;
if (day.length < 2) day = '0' + day;
return [year, month, day].join('-'); // yyyy-MM-dd形式の文字列で返す
}
ポイント:
holidayCache
は、Google Calendar APIで取得した祝日を一時的に保存します。
一度祝日データをキャッシュすれば、その後は同じデータを再利用し、毎回APIを呼び出す必要がなくなります。cacheHolidays()
関数は、指定された日付範囲の祝日を取得し、キャッシュに保存します。これにより、APIを呼び出す回数を減らし、パフォーマンスを向上させます。isWorkingday()
関数では、日付が土曜 (6
) や日曜 (0
) でないこと、および祝日キャッシュに含まれていないことを確認し、営業日かどうかを判定します。- この方法で、毎回APIや祝日リストをチェックする必要がなくなり、パフォーマンスが最適化されます。
measure.gs の解説:営業日数を計算するロジック
function calculateElapsedBusinessDays(startDate, endDate) {
let count = 0; // 営業日数のカウンター
let currentDate = new Date(startDate); // 現在の日付を開始日に設定
// 祝日キャッシュが空の場合はキャッシュを構築
if (!Util.hasHolidayCache()) {
Util.cacheHolidays(startDate, endDate); // 祝日情報をキャッシュ
}
// 終了日も1日足して含むように設定
let end = new Date(endDate);
end.setDate(end.getDate() + 1); // 終了日を含めるために1日追加
// 営業日を計算
while (currentDate < end) {
if (Util.isWorkingday(currentDate)) { // 土日祝を除外してカウント
count++; // 営業日数をカウント
}
currentDate.setDate(currentDate.getDate() + 1); // 次の日へ移行
}
return count; // 計算された営業日数を返す
}
ポイント:
calculateElapsedBusinessDays()
関数では、キャッシュされた祝日情報を使用して営業日数を効率的に計算します。- キャッシュされたデータを使用することで、APIの再呼び出しや大量のループ処理を回避し、処理速度を大幅に向上させます。
実際のサンプルデータと営業日数の計算
では、具体的なサンプルデータを使って営業日数を計算してみます。
例として、2024年4月1日から2024年4月10日までの営業日数を計算すると、次のようになります。
日付 | 曜日 | 営業日? |
---|---|---|
2024/4/1(月) | 月 | 営業日 |
2024/4/2(火) | 火 | 営業日 |
2024/4/3(水) | 水 | 営業日 |
2024/4/4(木) | 木 | 営業日 |
2024/4/5(金) | 金 | 営業日 |
2024/4/6(土) | 土 | 休み |
2024/4/7(日) | 日 | 休み |
2024/4/8(月) | 月 | 営業日 |
2024/4/9(火) | 火 | 営業日 |
2024/4/10(水) | 水 | 営業日 |
営業日数は8日間になります。
コードの意図
終了日を含めて計算するロジックのため、例えば「2024年4月1日から4月10日まで」と指定した場合、4月10日も営業日としてカウントされることになります。
そのため、終了日を含める設定がある場合は、最終日が営業日であれば必ずカウントされる仕様です。
このように、コードを実行すれば、自動で土日祝日を除外した営業日数が計算されます。
キャッシュ機能により、長期間や複数回の計算でも高速に処理が行われます。
キャッシュの重要性とメリット
キャッシュを使用することで、毎回同じ祝日データを再取得する無駄な処理を避け、パフォーマンスが大幅に向上します。
特に、長い期間や頻繁に営業日数を計算する場合、キャッシュの有無で処理速度に大きな差が生じます。
キャッシュのメリット:
- APIの呼び出し回数が減るため、通信量の節約とレスポンス速度の向上。
- 大量のデータ処理におけるパフォーマンス改善。特に祝日が多い期間において、繰り返しの計算負荷を軽減。
- コードのメンテナンス性が向上し、不要な処理を避けることで、スクリプト全体がシンプルに。
結論
GASとGoogle Calendar APIを使った土日祝のキャッシュを活用することで、効率的かつ高速に営業日数を自動算出することが可能です。
キャッシュ機能を実装することで、API呼び出し回数が減り、複雑な処理もスムーズに行えるようになります。
業務効率化や自動化が必要なプロジェクトでは、この方法をぜひ活用してみてください!