出力結果イメージ
VBAからgoogleカレンダーAPIを実行して、エクセルにイメージのような祝日一覧を出力します。
手順
Google Cloud PaltformでAPI キーを作成
VBAからgoogleカレンダーAPIを実行する為、APIを有効化し、APIキーを作成します。
Google Cloud Paltformでプロジェクト既に作成済みの場合は、認証情報の画面からAPIキーを作成します。
(Google Cloud Paltformでプロジェクト作ったことない人は、私の過去記事ですが こちら が参考になるかもです。 )
APIキーを作成したらVBAで使いますのでどこかにメモしておきます。
画面の右下にあるキーを制限リンクからセキュリティを適宜設定できます。
VBA JSON を使えるようにする
APIのレスポンスをJSONにパースする為のモジュールがgithubに公開されてます。
-
Latest release から最新版をダウンロードします。
-
VBAメニューの
ファイル
->ファイルのインポート
からダウンロードした JsonConverter.bas をインポートします。 -
(Windowsの場合)VBAの
ツール
->参照設定
から、Microsoft Scripting Runtime チェックを入れます。
VBAのコード
APIKeyの変数の中身を、さきほど作成したAPIキーに置き換えます。
Main() 関数を実行すると、出力結果のイメージのように出力されます。
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等があります。
{
"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
},
参考サイト
参考にさせていただきました ありがとうございます