目的
Redmineでユーザ情報をExcelにダウンロードしてきます。APIを使用して楽勝です。
前提
「管理」-「設定」-「認証」から「RESTによるWebサービスを有効にする」にチェックを入れておきましょう。
APIキーも確認しておきましょう。
Excel VBA
以下のサイトのVBAを使用しましたが、少々問題が起きました。
Redmineは、(当たり前ですが)チケットの場合は、チケットだけで、auto_incrementになっていましたが、ユーザIDユーザIDとグループIDは共通のauto_incrementになっているため、ユーザ作成、グループ作成、ユーザ作成といったように作っていくと、ユーザIDだけで連番にはならなくなってしまい、連番ではなくなったところで、Excelへの取得が終わってしまう。
これでは使えないため(※)、ユーザIDが飛んだ場合もExcelへ取得できるようにした。
※ユーザもグループもいつ追加になるかわからないですし、どういう順番で作成するかもわからない。
Option Explicit
Const API = "http://xxx.xxx.xxx.xxx/users.xml"
Sub ボタン1_Click()
Dim i As Integer
i = 2
Dim j As Integer
j = 0
'xxに最大のユーザ数を記載する。多い分には構わない。
For i = 2 To xx
'エラー処理ルーチン無効化
On Error GoTo 0
Dim id As String
id = Cells(i, 1)
Dim issue As Object
'APIアクセスキーなしの場合は、こちらを使用
'Set issue = GetXmlData(API + id + ".xml")
'APIアクセスキーありの場合は、こちらを使用
Set issue = GetXmlData("http://xxx.xxx.xxx.xxx/users.xml?key=xxxxxx")
'エラー処理ルーチン有効化(プロパティがなかったときは、無視して続行)
On Error Resume Next
Cells(i, 1) = issue.getElementsByTagName("id").Item(j).text
Cells(i, 2) = issue.getElementsByTagName("login").Item(j).text
Cells(i, 3) = issue.getElementsByTagName("firstname").Item(j).text
Cells(i, 4) = issue.getElementsByTagName("lastname").Item(j).text
Cells(i, 5) = issue.getElementsByTagName("mail").Item(j).text
Cells(i, 6) = issue.getElementsByTagName("created_on").Item(j).text
Cells(i, 7) = issue.getElementsByTagName("last_login_on").Item(j).text
j = j + 1
Next i
End Sub
使用方法
Const API のxxx.xxx.xxx.xxxにRedmineサーバのIPアドレスを記入してください。
For i = 2 To xxのxxに最大ユーザ+グループ数を記入してください。多い分には構わないので、適当に100ぐらい入力しておけばいいです(100ユーザ + グループを越える場合は、それ以上の数にする)。
Set issue = GetXmlData("http://xxx.xxx.xxx.xxx/users.xml?key=xxxxxx")に、IPアドレス(xxx.xxx.xxx.xxx)と、前提部分に書いたAPIキー(key=xxxxxx)を記入してください。
注意点
元のプログラムですと、users配下から、順に1.xml、2.xmlと取得するような形となっている(正確にはissues。ここではusersに読みかえています)。
この場合、デフォルトで2.xmlにあるAnonymousユーザも取得できるが、上記プログラムでは取得できないのは、認識しておいてください(そもそもusers.xmlでは、Anonymousが表示されない)。
個人的には、Anonymousは自分で作成したものではなく、RedmineのGUIの表示上もみえないので、不要な気がしている。
2015/12/06 追加
同じ要領で、グループ版も作成しました。
Option Explicit
Const API = "http://xxx.xxx.xxx.xxx/groups.xml"
Sub ボタン1_Click()
Dim i As Integer
i = 2
Dim j As Integer
j = 0
'ユーザの数が多いならば、"10"の値を変える
For i = 2 To 10
'エラー処理ルーチン無効化
On Error GoTo 0
Dim id As String
id = Cells(i, 1)
Dim issue As Object
'APIアクセスキーなしの場合は、こちらを使用
'Set issue = GetXmlData(API + id + ".xml")
'APIアクセスキーありの場合は、こちらを使用
Set issue = GetXmlData("http://xxx.xxx.xxx.xxx/groups.xml?key=xxxxxxxxxxx")
'エラー処理ルーチン有効化(プロパティがなかったときは、無視して続行)
On Error Resume Next
Cells(i, 1) = issue.getElementsByTagName("id").Item(j).text
Cells(i, 2) = issue.getElementsByTagName("name").Item(j).text
j = j + 1
Next i
End Sub
今後の課題
http://xxx.xxx.xxx.xxx/users.xml から取得すると、ユーザIDの昇順とはならない。昇順となるモジュールを追加する(マクロの追加でやってもいいかも。すぐにできそう)。
ユーザID/グループIDを1つのマクロで実施する(これもすぐにできそう)。