エクセルVBAからgoogleカレンダーの日本の祝日を取得して一覧出力する方法

## 出力結果イメージ
VBAからgoogleカレンダーAPIを実行して、エクセルにイメージのような祝日一覧を出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/1b19a38a-d7da-abee-a96a-895ec87c0def.png)

## 手順
### Google Cloud PaltformでAPI キーを作成
VBAからgoogleカレンダーAPIを実行する為、APIを有効化し、APIキーを作成します。
Google Cloud Paltformでプロジェクト既に作成済みの場合は、認証情報の画面からAPIキーを作成します。
（Google Cloud Paltformでプロジェクト作ったことない人は、私の過去記事ですが [こちら](https://qiita.com/cazimayaa/items/5fdfbc060dff7a11ee15#gcp%E5%81%B4%E3%81%A7%E3%82%84%E3%82%8B%E3%81%93%E3%81%A8) が参考になるかもです。 ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/c8172eae-bbf5-ba5f-71ba-ce69d7bdff7e.png)

APIキーを作成したらVBAで使いますのでどこかにメモしておきます。
画面の右下にあるキーを制限リンクからセキュリティを適宜設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/234fcc99-8c6e-ef92-8107-67f8e347ecaa.png)

### VBA JSON を使えるようにする
APIのレスポンスをJSONにパースする為のモジュールがgithubに公開されてます。

- https://github.com/VBA-tools/VBA-JSON

1. [Latest release](https://github.com/VBA-tools/VBA-JSON/releases) から最新版をダウンロードします。

2. VBAメニューの `ファイル` -> `ファイルのインポート` からダウンロードした **JsonConverter.bas** をインポートします。
3. （Windowsの場合）VBAの `ツール` -> `参照設定` から、**Microsoft Scripting Runtime** チェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/c3ba3b61-214b-edac-dfeb-434708757bd0.png)




### VBAのコード
**APIKey**の変数の中身を、さきほど作成したAPIキーに置き換えます。
**Main()** 関数を実行すると、出力結果のイメージのように出力されます。

```visualbasic
Sub Main()
    Const APIURL    As String = "https://www.googleapis.com/calendar/v3/calendars/"
    '日本の休日カレンダーのID  
    Const CalID     As String = "ja.japanese#holiday@group.v.calendar.google.com"    
    Const APIKey    As String = "さっき作ったAPIキーに置き換える"
    
    '祝日を取得したい期間（2020年1月1日～12月31日）
    Const StartDay  As Date = #1/1/2020#
    Const EndDay    As Date = #12/31/2020#
    
    'URLの作成
    Dim Url As String
    
    'APIキーと開始／終了日時をパラメータに設定
    Url = APIURL & CalID & "/events?key=" & APIKey _
        & "&timeMin=" & Format(StartDay, "yyyy-mm-dd") & "T00:00:00.000Z" _
        & "&timeMax=" & Format(EndDay, "yyyy-mm-dd") & "T23:59:59.000Z"

    'API実行
    Dim Result As String
    Result = GetContents(Url)
    
    '取得結果をJSONにパース
    Dim Parse As Object
    Set Parse = JsonConverter.ParseJson(Result)

    ' A列に日にち、B列に祝日名を出力
    Set Items = Parse("items")
    For i = 1 To Items.Count
        Set Item = Items(i)
        Cells(i, 1) = Item("start")("date")
        Cells(i, 2) = Item("summary")
    Next i

End Sub

Function GetContents(Url As String) As String
    Dim XmlHttp As Object
    Set XmlHttp = CreateObject("MSXML2.XMLHTTP")
    XmlHttp.Open "GET", Url, False
    XmlHttp.Send
    GetContents = XmlHttp.ResponseText
End Function
```

## （参考までに）APIのレスポンス
レスポンスの中の **items** の中に祝日情報が入った配列があります。（元日だけ抜粋しました）
今回は  **start.date** と **summary** だけをエクセルに出力しましたが、 他にもリンクとかイベントID等があります。

```javascript
{
 "kind": "calendar#events",
 "etag": "\"p324fvifujfjue0g\"",
 "summary": "日本の祝日",
 "updated": "2020-02-22T05:12:53.000Z",
 "timeZone": "UTC",
 "accessRole": "reader",
 "defaultReminders": [],
 "nextSyncToken": "CMD-u4Wz5OcCEAAYAQ==",
 "items": [
  {
   "kind": "calendar#event",
   "etag": "\"3101521598000000\"",
   "id": "20200101_60o30d9l64o30c1g60o30dr56g",
   "status": "confirmed",
   "htmlLink": "https://www.google.com/calendar/event?eid=MjAyMDAxMDFfNjBvMzBkOWw2NG8zMGMxZzYwbzMwZHI1NmcgamEuamFwYW5lc2UjaG9saWRheUB2",
   "created": "2019-02-21T14:53:19.000Z",
   "updated": "2019-02-21T14:53:19.000Z",
   "summary": "元日",
   "creator": {
    "email": "ja.japanese#holiday@group.v.calendar.google.com",
    "displayName": "日本の祝日",
    "self": true
   },
   "organizer": {
    "email": "ja.japanese#holiday@group.v.calendar.google.com",
    "displayName": "日本の祝日",
    "self": true
   },
   "start": {
    "date": "2020-01-01"
   },
   "end": {
    "date": "2020-01-02"
   },
   "transparency": "transparent",
   "visibility": "public",
   "iCalUID": "20200101_60o30d9l64o30c1g60o30dr56g@google.com",
   "sequence": 0
  },
```



## 参考サイト
参考にさせていただきました :cat: ありがとうございます :sparkles: 

- [Google カレンダーから自動で祝日/祭日を取得する方法](https://note.com/joho2008/n/n2ed415cabeaa)
- [宇宙一わかりやすい？VBA-JSONを使ったJSONパースのしかた](https://qiita.com/emesh/items/0834a5ad373d2ade6a93)