PowerShellでマネーフォワード クラウド請求書APIを実行

160
にほんブログ村 IT技術ブログへ

マネーフォワード クラウド請求書とは?

ブラウザで請求書を作成して管理する事ができるクラウドサービスです。
もちろん作成した請求書はPDFにしたり印刷したりできます。
面白いのは、作った請求書を郵送までしてくれるサービスなんかも有るそうです。

なお「請求書」をうたっていますが、同サービスで「見積書 / 納品書 / 領収書」も作成できます。
公式は以下です。

PowerShellでクラウド請求書APIを実行する

画面でポチポチやって請求書作成しても良いんですが、最近のクラウドサービスらしく、REST APIが公開されているので PowerShellで試しに実行してみました。

実行前の準備

準備には以下が必要です。
注意点も併せて記載しました。特に認証に使うトークンは2種類必要なのを気を付けてください。
当たり前ですがRead権限のトークンで見積書作成APIは実行できません。

  • クラウド請求書のサービス契約
    • 契約プラン毎にAPIの実行制限があります。注意。
  • APIを実行するアプリケーションの作成
    • アプリとは単なるAPI実行のための設定です。
    • Read権限とWrite権限それぞれ必要です。
  • アクセストークンの発行
    • Read権限とWrite権限それぞれ必要です。

準備の詳細は、以下をご確認ください。

APIドキュメント

以下にAPIドキュメントが有ります。
curl での実行例が記載されています。

GitHub
 
moneyforward/invoice-api-doc
https://github.com/moneyforward/invoice-api-doc
Contribute to moneyforward/invoice-api-doc development by creating an account on GitHub.

取引先をGetする

PowerShellで実行する場合は以下のように「Invoke-RestMethod」で実行します。
注意点は、トークンは取得なのでRead権限用を使用します。また、先頭に固定文字が入ります。
また、パラメータとしてpage、per_pageを指定します。ページングのためのパラメータです。
per_pageが1ページの取得件数です。Maxは100件のようです。pageは、その名の通りページ数です。

# アクセストークン(Read)
$READ_TOKEN = 'BEARER xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# MF請求書API URL
$API_URL = 'https://invoice.moneyforward.com/api/v2/'
# カレントページ数
$pageNumber = 1
# 1ページあたりの件数
$per_pageNumber = 10

# 取引先一覧取得
$partners = Invoke-RestMethod -Method Get `
    -Headers @{'Authorization' = $READ_TOKEN } `
    -uri $( $API_URL + 'partners.json?page=' + "$pageNumber" + '&per_page=' + "$per_pageNumber")
# 結果出力
$partners

取得したオブジェクトは以下のようなものです。

work> $partners | Get-Member
   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
data        NoteProperty Object[] data=System.Object[]
included    NoteProperty Object[] included=System.Object[]
meta        NoteProperty System.Management.Automation.PSCustomObject meta=@{total_count=1217; total_pages=122; current_page=1; per_page=10}

必要なところは、$partners.dataなので以下のように。

work> $partners.data | foreach {
    $_.attributes
}

code        : aaa
name        : XXXX株式会社
name_kana   :
name_suffix : 御中
memo        :
created_at  : 2019-12-11T10:19:53.000+09:00
updated_at  : 2019-12-11T10:19:53.000+09:00

code        : bbb
name        : ●●●●株式会社
name_kana   :
name_suffix : 御中
memo        :
created_at  : 2019-12-11T10:20:43.000+09:00
updated_at  : 2019-12-11T10:20:43.000+09:00

~~~~~~~~

ページング処理とループ制御

REST APIだとHTTP通信でデータ取得するので、大量のデータを全部一括で取得できるようにはなっていません。1回に取得できる件数が決まっていて、ページング処理で何回かにわけて取得していく形になります。

今回のクラウド請求書APIでもページング用パラメータがあるので、特定のデータを抽出したい場合は、ページ数を変えながら何回かループ処理していく事になります。

以下は指定の取引先名のデータを取得するスクリプトです。

# アクセストークン(Read)
$READ_TOKEN = 'BEARER XXXXXXXXXXXXXXXXXXXXX'
# MF請求書API URL
$API_URL = 'https://invoice.moneyforward.com/api/v2/'
# 検索する取引先名
$keyword = "テスト株式会社"

# メタデータ取得関数
Function Get-MfMetaData {
    param($data)
    $retMeta = $null
    if ($data -eq 'partner') {
        $retMeta = Invoke-RestMethod -Method Get -Headers @{'Authorization' = $READ_TOKEN } -uri $( $API_URL + 'partners.json?page=' + "1" + '&per_page=' + "1")
    }
    $retMeta.meta
}

# 取引先取得関数
Function Get-MfPartners {
    param($pageNumber, $per_pageNumber, $serch_name)
    # 取引先 取得
    $partners = Invoke-RestMethod -Method Get -Headers @{'Authorization' = $READ_TOKEN } -uri $( $API_URL + 'partners.json?page=' + "$pageNumber" + '&per_page=' + "$per_pageNumber")
    # 取引先 名称検索(完全一致)
    $partners.data | where { $_.attributes.name -eq $serch_name }
}

# トータル件数取得のため、メタデータ取得
$metaData = Get-MfMetaData -data 'partner'

# レコードトータル件数から100件取得時のトータルページ数を算出
[float]$divisionResult = $metaData.total_count / 100
[int]$totalPage = [Math]::Floor($divisionResult)
[int]$remainder = $metaData.total_count % 100

if ($remainder -ge 1) {
    $totalPage++
}

# トータルページ数分ループ実行
foreach ($number in 1..$totalPage) {
    $getPartner = $null
    $getPartner = Get-MfPartners -pageNumber $number -per_pageNumber 100 -serch_name $keyword
    if ($null -ne $getPartner) {
        $getPartner
        break;
    }
}

まとめ

PowerShellでクラウド請求書APIを実行して、データ取得してみました。
BashとかLinuxのShellだと出力を文字列処理でゴニョゴニョしないといけないので
ロジックとは別のとこで、悩まないといけません。
PowerShellなら出力が全てオブジェクトなのでやっぱり便利です。
ShellスクリプトならPowerShellを使うのが良い選択だと思います。

広告

1件のピンバック

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

wpmaster
  • wpmaster
  • フリーランスシステムエンジニアの鎌形です。
    鎌形システムエンジニアリングとして都内で活動中です。

%d人のブロガーが「いいね」をつけました。