6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

出力結果イメージ

VBAからgoogleカレンダーAPIを実行して、エクセルにイメージのような祝日一覧を出力します。
image.png

手順

Google Cloud PaltformでAPI キーを作成

VBAからgoogleカレンダーAPIを実行する為、APIを有効化し、APIキーを作成します。
Google Cloud Paltformでプロジェクト既に作成済みの場合は、認証情報の画面からAPIキーを作成します。
(Google Cloud Paltformでプロジェクト作ったことない人は、私の過去記事ですが こちら が参考になるかもです。 )
image.png

APIキーを作成したらVBAで使いますのでどこかにメモしておきます。
画面の右下にあるキーを制限リンクからセキュリティを適宜設定できます。
image.png

VBA JSON を使えるようにする

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

  1. Latest release から最新版をダウンロードします。

  2. VBAメニューの ファイル -> ファイルのインポート からダウンロードした JsonConverter.bas をインポートします。

  3. (Windowsの場合)VBAの ツール -> 参照設定 から、Microsoft Scripting Runtime チェックを入れます。
    image.png

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.datesummary だけをエクセルに出力しましたが、 他にもリンクとかイベント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
  },

参考サイト

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

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?