毎日9時に実行する、毎週月曜日だけ実行するなどスケジュールを設定して運用している時に、土日や祝日は実行したくないという要望をいただくことが多いです。
そんな時にワークフローの条件分岐機能を利用することで実現できるのでぜひご活用ください!
3種類方法があります。それぞれ利点があるので、以下の表を参考にして選択してください。
| 方法 | お勧めユーザー |
|---|---|
| Google Calendar API を利用する | Google Calendar で自社独自の休日を管理している |
| クエリで判定する | 創業記念日休暇や年末年始休暇が毎年固定の日付でお休みになる |
| 休日マスターテーブルを作成する | 処理時間を増加させたくたい マスターテーブルの更新が苦ではない 転送元HTTP・HTTPSの転送設定を利用したくない |
方法1:Google Calendar API を利用する
STEP1 特別休日の情報を取得する
-
HTTP・HTTPSの接続情報を作成する
-
Google系サービスのOAuth2.0認証を作成する方法 を参考にして設定を行なってください
- 有効化するAPIは、Google Calendar API
- TROCCOに設定するスコープは、
https://www.googleapis.com/auth/calendar.readonly
-
Google系サービスのOAuth2.0認証を作成する方法 を参考にして設定を行なってください
-
祝日以外の特別休日をGoogle Calendarに用意する
- Google Calendar の「設定」→「カレンダーを追加」→「新しいカレンダーを作成」から新しくカレンダーを追加する
- Google Calendar上に上記カレンダーを使用した休日情報を追加する
- Google Calendar の「設定」→「カレンダーを追加」→「新しいカレンダーを作成」から新しくカレンダーを追加する
-
TROCCOの転送設定を作成する
- 転送元HTTP・HTTPS
- OAuth2.0を利用するにチェックをつけて、1で作成した接続情報を利用する
- 転送先DWH(Google BigQuery、Snowflake、Amazon Redshift)
- 転送元HTTP・HTTPS
-
転送設定STEP1の「転送元 HTTP・HTTPSの設定」は以下を記載する
- URL:
https://www.googleapis.com/calendar/v3/calendars/<カレンダーID>/events- カレンダーIDはGoogle カレンダーの「カレンダー設定」から確認できる
- カレンダーIDはGoogle カレンダーの「カレンダー設定」から確認できる
- HTTPメソッド:GET
- 文字エンコード:UTF-8
- 入力ファイル形式:JSONPath
- ルート:
$.items[*].start
- ルート:
- URL:
-
転送設定STEP1の「転送元 HTTP・HTTPSの設定」内でカスタム変数を追加する
- 日付フォーマットは
%Y-%m-%d %H:%M:%Sで、タイムゾーンはAsia/Tokyoを選択
- 日付フォーマットは
- 転送設定STEP1の「転送先の設定」で転送モードは洗い替えを選択してください
-
転送設定STEP2のプレビューが表示されたのを確認する
- 2でGoogleカレンダーに追加した休日が抽出されていることをプレビューで確認する
- 2でGoogleカレンダーに追加した休日が抽出されていることをプレビューで確認する
-
STEP2の「フィルター設定」を追加する
- 5で追加したカスタム変数を使って今日の日付のレコードのみを転送する
- 5で追加したカスタム変数を使って今日の日付のレコードのみを転送する
- 設定を保存する
STEP2 祝日の情報を取得する
-
転送設定を作成する
- 転送元HTTP・HTTPS
- 転送先DWH(Google BigQuery、Snowflake、Amazon Redshift)
-
転送設定STEP1の「転送元 HTTP・HTTPSの設定」は以下を記載する
- URL:
https://www.googleapis.com/calendar/v3/calendars/ja.japanese.official%23holiday@group.v.calendar.google.com/events - HTTPメソッド:GET
- 文字エンコード:UTF-8
- 入力ファイル形式:JSONPath
- ルート:
$.items[*]
- ルート:
- URL:
- 転送設定STEP1の「転送先の設定」で転送モードは洗い替えを選択してください
-
STEP2のフィルター設定で祝日のレコードのみ取得するように絞り込む(祭日は除外)
-
リクエスト時に今日の日付で絞り込みをする
- STEP1に戻って、カスタム変数を追加する
- 日付フォーマットは
%Y-%m-%dで、タイムゾーンはAsia/Tokyoを選択
- 日付フォーマットは
- パラメータにカスタム変数を埋め込む
-
timeMin:$today$T00:00:00+0900 -
timeMax:$today$T23:59:59+0900
-
- STEP1に戻って、カスタム変数を追加する
-
STEP2に遷移する時に「自動データ設定をスキップ」する
※ 自動データ設定を実行してしまうと休日ではない場合0レコードでカラム定義が作成できずエラーになる - 設定を保存する
STEP3 ワークフローの条件分岐機能を利用して休日判定を行う
-
データチェックタスクを追加する
-
平日 or 土日 を判定するクエリを入力する
SELECT CASE WHEN EXTRACT( DAYOFWEEK FROM CURRENT_DATE("Asia/Tokyo") ) IN (2, 3, 4, 5, 6) THEN 1 ELSE 0 END AS is_weekend; - エラー条件はクエリ結果が0(土日)ならエラーとする
-
-
条件分岐タスクを追加する
1で追加したデータチェックの結果が成功(平日)したらtrueにする
エラー(土日)になったらfalseにする -
STEP1とSTEP2で作成した転送設定タスクをワークフローに追加する
-
データチェックタスクを追加する
-
STEP1の特別休日のデータとSTEP2の祝日のデータが存在しているか判定するクエリを入力する
SELECT CASE WHEN EXISTS (SELECT 1 FROM `systemn-playground.kimura_test.holiday_check` LIMIT 1) OR EXISTS (SELECT 1 FROM `systemn-playground.kimura_test.company_holiday_check` LIMIT 1) THEN 0 ELSE 1 END AS is_holiday; - エラー条件はクエリ結果が0(特別休日または祝日)ならエラーとする
-
-
条件分岐タスクを追加する
4で追加したデータチェックの結果が成功(平日)したらtrueにする
エラー(特別休日または祝日)になったらfalseにする - 営業日に実行したいタスクをTrueの後ろに繋げてワークフローを実行する
方法2:クエリで判定する
STEP1 国民の祝日データを取得する
国民の祝日は、内閣府が公開している国民の祝日データから取得します。
-
転送設定を作成する
- 転送元HTTP・HTTPS
- 転送先DWH(Google BigQuery、Snowflake、Amazon Redshift)
-
転送設定STEP1の「転送元 HTTP・HTTPSの設定」は以下を記載する
- URL:
https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv - HTTPメソッド:GET
- 文字エンコード:Shift-JIS
- 入力ファイル形式:CSV/TSV
- URL:
-
今日の日付が休日か判定するための絞り込みを行うのでカスタム変数を定義しておく
-
転送設定STEP2のカラム定義で、カラム名を扱いやすい名前に変える
-
転送設定STEP2のフィルター設定で、転送対象を本日分に絞り込む
STEP2 ワークフローの条件分岐機能を利用して休日判定を行う
- STEP1で作成した転送設定をワークフローに追加する
-
データチェックタスクを追加する
例としてGoogle BigQueryデータチェックを使用 -
データチェックタスクで以下のクエリを記載する
土日、祝日以外にも、年末年始の休暇が毎年12月29日〜1月4日まで固定で設定されているので判定基準に追加SELECT CASE WHEN -- 土日(土曜 = 7, 日曜 = 1) EXTRACT(DAYOFWEEK FROM CURRENT_DATE('Asia/Tokyo')) IN (1, 7) OR -- 祝日(祝日テーブルにレコードが存在している場合) EXISTS ( SELECT 1 FROM `project_name.dataset_name.japanese_holidays` ) OR -- 年末年始休暇(12月29日〜1月4日) FORMAT_DATE('%m%d', CURRENT_DATE('Asia/Tokyo')) BETWEEN '1229' AND '1231' OR FORMAT_DATE('%m%d', CURRENT_DATE('Asia/Tokyo')) BETWEEN '0101' AND '0104' THEN 1 ELSE 0 END AS is_non_working_day; -
データチェックタスクのエラー条件は、クエリの結果が1(営業日ではない)の場合エラーになるように入力する
-
条件分岐のタスクを追加する
データチェックタスクの結果がエラーではないという条件を入力する -
営業日のみ実行したいタスクをTrue側に繋げる
方法3:休日マスターテーブルを作成する
STEP1 休日のマスターテーブルをDWHに用意する
-
データマート定義を作成する
- クエリ実行モードは「データ転送モード」を選択する
-
マスターテーブルを以下のクエリで作成する
2025年の祝日、年末年始休暇(12/29〜1/4)SELECT * FROM UNNEST([ STRUCT(DATE '2025-01-01' AS holiday_date, '元日' AS holiday_name), STRUCT(DATE '2025-01-13', '成人の日'), STRUCT(DATE '2025-02-11', '建国記念の日'), STRUCT(DATE '2025-02-23', '天皇誕生日'), STRUCT(DATE '2025-02-24', '天皇誕生日 振替休日'), STRUCT(DATE '2025-03-20', '春分の日'), STRUCT(DATE '2025-04-29', '昭和の日'), STRUCT(DATE '2025-05-03', '憲法記念日'), STRUCT(DATE '2025-05-04', 'みどりの日'), STRUCT(DATE '2025-05-05', 'こどもの日'), STRUCT(DATE '2025-05-06', '憲法記念日 振替休日'), STRUCT(DATE '2025-07-21', '海の日'), STRUCT(DATE '2025-08-11', '山の日'), STRUCT(DATE '2025-09-15', '敬老の日'), STRUCT(DATE '2025-09-23', '秋分の日'), STRUCT(DATE '2025-10-13', 'スポーツの日'), STRUCT(DATE '2025-11-03', '文化の日'), STRUCT(DATE '2025-11-23', '勤労感謝の日'), STRUCT(DATE '2025-11-24', '勤労感謝の日 振替休日'), STRUCT(DATE '2025-01-02', '年末年始'), STRUCT(DATE '2025-01-03', '年末年始'), STRUCT(DATE '2025-01-04', '年末年始'), STRUCT(DATE '2025-12-29', '年末年始'), STRUCT(DATE '2025-12-30', '年末年始'), STRUCT(DATE '2025-12-31', '年末年始') ]);
- ジョブを実行するとBigQuery上にテーブルが作成される
STEP2 ワークフローの条件分岐機能を利用して休日判定を行う
- データチェックタスクを追加する
-
データチェックタスクで以下のクエリを記載する
土日、マスターテーブルに今日の日付があるかチェックをするSELECT CASE WHEN -- 土日チェック EXTRACT(DAYOFWEEK FROM CURRENT_DATE('Asia/Tokyo')) IN (1,7) OR -- 今日がマスターテーブルに存在している休日かチェック EXISTS ( SELECT 1 FROM `project_name.dataset_name.holiday_master` h WHERE h.holiday_date = CURRENT_DATE('Asia/Tokyo') ) THEN 1 ELSE 0 END AS result; -
データチェックタスクのエラー条件は、クエリの結果が1(営業日ではない)の場合エラーになるように入力する
-
条件分岐のタスクを追加する
データチェックタスクの結果がエラーではないという条件を入力する - 営業日のみ実行したいタスクをTrue側に繋げる
以上です。
長くはなりましたが、ご自身の環境にあった方法でお試しください。
補足
年末年始休暇の実行を停止させるという記事の用意もあります。
(参考)【TROCCO】休暇期間にスケジュール実行を停止させる方法
コメント
0件のコメント
記事コメントは受け付けていません。