Workato：日本の祝日をレシピで利用するには

Workatoで何らかの処理を行う際、日本の祝日をを避けてレシピを実行したい場合があります。

Googleカレンダーがical形式で公開している、「日本の祝日」カレンダーを利用すると、過去1年分から未来1年分のまでの日本の祝日を取得することができます。今回は、このカレンダーをWorkatoで利用する方法についてご紹介します。

# 手順
## １．Lookup tablesの作成

Googleカレンダーより取得した祝日情報を管理するためのLookup tablesを作成します。
列として「summary」と「date」を用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ed2dd264-0243-7d78-7900-0432e4f90efe.png)

後続の手順においては、icalから取得した結果を定期的に（1ヶ月に1回）Lookup tablesへ格納しています。Lookup tablesへ格納することで、レシピの実行ごとにicalを取得したり処理する必要が無くなります。また、各レシピではLookup tablesを参照することで、祝日判定が行えるようになります。（パフォーマンスや、タスク実行数の削減において有効です）

## ２．レシピの作成

Lookup tablesへ祝日をセットするためのレシピを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/664ae492-f208-8edf-5aee-5bdaec8aa8cc.png)

### トリガー
「Scheduler by Workato」トリガーを使用し、次の通り設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/363440bc-db29-d20a-9c96-a8fd9cb53035.png)


例）1ヶ月に1回 毎月1日の0:00に実行する場合

|項目  |値   |
|:---:|:---:|
|Time unit |Months |
|Trigger every| 1 (months) |
|Days of the month| 1 |
|Trigger at|12:00 am |
|Timezone|Tokyo (あるいはOsaka) |


### アクション
#### １）Rubyコネクターを追加し、次の通り設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/dea5b55a-f1d4-3a19-cc17-961e55ad2e26.png)

##### Name
任意の名称

##### Input
設定不要

##### Output schema
次のように定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/78a28051-d3fc-d333-2a0c-ba3357c5d676.png)


|Name  |Data type   |Optional |
|:---:|:---:|:---:|
|result |Array |No |
|summary|String |No |
|date|Date |No |

なお、`summary` と `date` は、`result`の下にネストします。

※フィールドをネストする方法は、以下を参照ください。

https://qiita.com/tabimoba/items/4e4b69e87a040b8c5308

##### Code
次の通り入力します。

```ruby
ical = get("https://www.google.com/calendar/ical/japanese__ja%40holiday.calendar.google.com/public/basic.ics")
	.response_format_raw

rows = ical.split("\r\n")

result = []
event = {
      'summary' => '',
      'date' => ''
}

rows.each do |row|
  cols = row.split(":")

  if cols[0] == 'BEGIN' && cols[1] == 'VEVENT'
    event = {
      'summary' => '',
      'date' => ''
    }
  end

  if cols[0] == 'END' && cols[1] == 'VEVENT'
  	result.push(event)
  end
  
  if cols[0] == 'SUMMARY'
    event['summary'] = cols[1]
  end
  
  if cols[0] == 'DTSTART;VALUE=DATE'
    event['date'] = (
    	cols[1].slice(0..3) + '-' + 
    	cols[1].slice(4..5) + '-' + 
    	cols[1].slice(6..7)
    ).to_date
  end  
end

{
  result: result
}

```

#### ２）Lookup tablesをtruncateするアクションを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/6e87c0ee-ff7a-43a7-7859-e25a44af7c77.png)

#### ３）Repeat actionを追加し、Input listにRubyコネクターのOutput schemaで定義したresult配列をセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/7db0f4c1-d1c7-8e25-56e9-c4973e5b48e0.png)

#### ４）Lookup tablesにエントリー（レコード）をセットするアクションを追加します。
Repeat action (foreach)より返される値を、対応するフィールドにセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8a618b25-fd29-32e8-5ff1-965d3f6323c9.png)

## ３．レシピの実行

２で作成したレシピを実行すると、以下のように１で作成したLookup tablesへ祝日情報がセットされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/5eeb6ac6-cb72-ff9c-c51f-29f4e62776cd.png)

## ４．他レシピでの祝日情報の活用
他レシピでは、以下のようなレシピを実装することで祝日判定が行えるようになります。
（以下のレシピでは、本日の日付をもとに、祝日判定を行っています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/40a396d0-7b9c-ca5d-2524-aa3ea3e32784.png)

ステップ２では、本日の日付を検索条件に指定しています。
dateの値は、Lookup tablesの値に合わせたフォーマットとする必要があります。また、WorkatoのデフォルトのタイムゾーンはPST（米国太平洋標準時）であるため、日本標準時（JST）へ変換する必要があります。これらに対応するため、Formulaを利用して、 `=now.in_time_zone("Asia/Tokyo").strftime("%Y-%m-%d")` と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/afb768b6-c3d3-8fda-55ee-5911c581a392.png)

ステップ３では、祝日以外の処理を定義しています。
ステップ２の検索結果が0件であれば、本日は祝日以外であると判断することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e0597786-b682-cba0-7caa-886f52ee3270.png)

ステップ５では、祝日の処理を定義しています。
ステップ２の検索結果が1件以上であれば（0件以外であれば）、本日は祝日であると判断することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/55cc27bb-8657-40f2-cd0b-1ea1ee679e0c.png)