【Redmine】Excelを使用したユーザ・グループ情報一括取得

# 目的
Redmineでユーザ情報をExcelにダウンロードしてきます。APIを使用して楽勝です。

# 前提
「管理」-「設定」-「認証」から「RESTによるWebサービスを有効にする」にチェックを入れておきましょう。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/98996/1cc701a3-c262-5ed9-a6f8-b9190e0bee68.png)

APIキーも確認しておきましょう。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/98996/ae784c59-1a9b-605e-0ac5-709075158652.png)

# Excel VBA

以下のサイトのVBAを使用しましたが、少々問題が起きました。
> http://d.hatena.ne.jp/chiheisen/20130421/1366543773

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つのマクロで実施する(これもすぐにできそう)。