1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

駅すぱあと VBA SDKを使って、交通費精算時に定期情報の更新を行う

Posted at

本記事はヴァル研究所の支援として作成された記事です

駅すぱあとはAPIを公開しており、駅情報や経路探索などをAPI経由で行えます。メソッドはすべてGETメソッドで、情報取得系のみです。レスポンスはJSONまたはXMLで返ってきます。

この駅すぱあと APIを利用しやすくするSDKを開発しはじめました。SDKはVBAで作っており、Excelなどから利用できます(Windowsのみ、macOSでは利用できません)。

今回は、交通費精算時に定期情報の更新を行うやり方について、定期情報の更新 - 駅すぱあと API Documents 駅データ・経路検索のWebAPIに記載されている内容を参考にしたSDKを使って紹介します。

外出時の交通費を申請する場合、通勤定期券を持っている区間は申請から控除しますが、登録していた定期情報で定期控除ができなくなっていた場合に、申請の時に通知が出せると便利です。
定期区間の情報は、駅や路線の新設や廃止があるため、定期情報の定期的な更新を推奨しています。

必要な情報

SDKを利用する際にはAPIキーが必要です。無料トライアルがあるので、こちらから取得してください。

注意点

  • SDKはWindowsでのみ動作します
  • SDKは非公式です。公式サポートへの問い合わせはご遠慮ください

ファイルのインポート

こちらのリポジトリにある *.cls*.bas ファイルをすべてインポートします。これらは以下のライブラリを含んでいます。

初期化

先ほど取得したAPIキーを使ってSDKを初期化します。

Dim client As Ekispert
Set client = New Ekispert
client.ApiKey = "YOUR_API_KEY"

定期券情報の作成

定期情報を、定期経路シリアライズデータとして作成する

定期券の情報を作成します。(ここでは、定期券情報がエラーとなるように、あえて廃駅を含む定期経路でサンプルを作成しています。)

GET /v1/json/search/course/extreme?key=アクセスキーを入力してください&viaList=長万部:中ノ沢&date=20240301&searchType=plain

SDKでは以下のようになります。

Dim Query As CourseExtremeQuery
Set Query = Client.CourseExtremeQuery()

Query.ViaList(0) = "長万部"
Query.ViaList(1) = "中ノ沢"
Query.DateProp = DateSerial(2024, 3, 1)
Query.SearchType = SearchTypeEnum.Plain

Dim Result As ResultSet
Result = Query.Find()

If Not Result.Success Then
    MsgBox Result.Error.Message
    Exit Sub
End If

Debug.Print Result.Courses(0).Teiki.SerializeData ' シリアライズデータ
Debug.Print Result.Courses(0).Teiki.DisplayRoute ' 表示用文字列

定期経路シリアライズデータは VkV4QaECp8rIAQEDpgE0160EksEBpU55wQGlT5kFkcMBAQMBBKVPmQeRxQGlTnkCpU|ZAwAEAAUACAEKAQwA--7fc83b8180c61894bbec3b4a6b9cadf92b7a9b14--0--63 のようになり、表示用文字列は 長万部--JR函館本線(函館-長万部)--中ノ沢 のようになります。

定期情報の更新

定期情報の更新が必要かチェックする

日々の交通費精算の時に、定期区間の控除が失敗していないかをチェックする方法です。APIとしては、以下のように呼び出します(SDKではJSONを使っているので、その部分を変更しています)。

GET /v1/json/search/course/extreme?key=アクセスキーを入力してください&viaList=国縫:長万部
&searchType=plain
&assignTeikiSerializeData=VkV4QaECp8rIAQEDpgE0160EksEBpU55wQGlT5kFkcMBAQMBBKVPmQeRxQGlTnkCpU|ZAwAEAAUACAEKAQwA--7fc83b8180c61894bbec3b4a6b9cadf92b7a9b14--0--63
&addAssignStatus=true&checkEngineVersion=false

SDKでは以下のようになります。

Dim Query1 As CourseExtremeQuery
Set Query1 = Client.CourseExtremeQuery()

Query1.AddAssignStatus = True
Query1.ViaList(0) = "浅草"
Query1.ViaList(1) = "とうきょうスカイツリー"
' Query1.ViaList(0) = "浅草:とうきょうスカイツリー" でもOK

Query1.AssignDetailRoute(0) = "浅草"
Query1.AssignDetailRoute(1) = "東武伊勢崎線区間準急"
Query1.AssignDetailRoute(2) = "Down"
Query1.AssignDetailRoute(3) = "業平橋"
' Query1.AssignDetailRoute(0) = "浅草:東武伊勢崎線区間準急:Down:業平橋" でもOK

Dim today As Date
today = Date
Query1.DateProp = today + TimeValue("10:00:00")

そして、探索を行います。

Dim Result1 As ResultSet
Result1 = Query1.Find()

If Not Result1.Success Then
    MsgBox Result1.Error.Message
    Exit Sub
End If

Debug.Print Result1.Courses(0).AssignStatus.RequireUpdate ' 0 
Debug.Print Result1.Courses(0).AssignStatus.Code ' 99

Code は、指定した定期区間が正しく控除されたかを確認するステータスです。
Code0 以外であれば、定期区間の控除ができなかったと判断できます。定期区間の控除ができなかった場合、ステータスコードを確認することで、控除ができない理由を知ることができます。以下は経路探索 - 駅すぱあと API Documents 駅データ・経路検索のWebAPIによる RequireUpdate の説明です。

定期割り当てステータスコード
定期割り当てステータスコードが0以外の場合は、定期区間の運賃は控除されていません。
- 0: 正常に定期経路が割り当てられた。
- 1: 定期券を利用しても運賃が変わらない、または高くなってしまう。
- 2: 定期区間を含む経路ではない。
- 3: 割引乗車券が含まれる経路のため、定期区間の控除計算ができない。
- 4: 定期情報から定期経路を再現できない。
- 99: 予期しない理由により定期経路が割り当てられない。

またRequireUpdate は、定期券の情報が古くなっていないかを確認するステータスです。
RequireUpdate0 以外であれば、定期情報の更新が必要です。以下は経路探索 - 駅すぱあと API Documents 駅データ・経路検索のWebAPIによる RequireUpdate の説明です。

定期情報の更新判定ステータスコード
0以外の場合は定期情報の更新が必要です。
- 0: 更新の必要なし
- 1: 定期経路文字列に旧名称の駅名が指定されている
- 2: 定期経路文字列に指定された駅名が見つからない
- 3: 定期経路文字列に旧名称の路線名が指定されている
- 4: 定期経路文字列に指定された路線名が見つからない
- 5: 定期経路文字列の駅名もしくは路線名の廃止など
- 6: 定期経路シリアライズデータが不正

定期情報を更新する

「定期経路シリアライズデータ」と「定期経路の表示用文字列」を再取得します。APIは以下のように呼び出します。

GET /v1/json/search/course/extreme?key=アクセスキーを入力してください&viaList=高円寺:渋谷&searchType=plain

SDKでは以下のようになります。 Teiki.DisplayRoute が定期経路の表示用文字列です。

Dim Query1 As CourseExtremeQuery
Set Query1 = Client.CourseExtremeQuery()

' 使い回す場合には Query1.Reset を使ってリセットしてください

Query1.ViaList(0) = "高円寺"
Query1.ViaList(1) = "渋谷"
Query1.SearchType = Plain

Dim Result3 As ResultSet
Result3 = Query1.Find()

If Not Result3.Success Then
    MsgBox Result3.Error.Message
    Exit Sub
End If

Debug.Print Result3.Courses(0).Teiki.SerializeData ' シリアライズデータ
Debug.Print Result3.Courses(0).Teiki.DisplayRoute ' 表示用文字列

たとえば定期経路シリアライズデータは VkV...-81 のようになり、表示用文字列は 高円寺:JR中央線快速:Up:新宿:JR山手線内回り:Down:渋谷 のようになります。

このように、APIを直接コールするのに比べて、SDKを使うことで簡単に定期情報の更新が行えます。

ソースコード

SDKのコードは以下のリポジトリにて公開しています。ライセンスはMIT Licenseです。

EkispertAPIMania/VBA-SDK: Excel VBAなどで動作する駅すぱあと VBA SDKです(Windowsのみ)

まとめ

駅情報やルートは適宜更新されるので、定期情報についても定期的な更新チェックが必要です。駅すぱあとAPIを使えば、そうしたチェックの手間を大幅に軽減できます。経費計算などをシステム自動化する際に、ぜひ駅すぱあと APIを利用してください。本SDKを使えば、Excelなどから簡単に利用できます。

何か不具合があれば、Issueにて連絡いただければ対応します(macOSでは動かないので注意してください)。

EkispertAPIMania/VBA-SDK: Excel VBAなどで動作する駅すぱあと VBA SDKです(Windowsのみ)

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?