LoginSignup
9
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-05

目的

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

前提

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

1.png

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

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

9
8
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
9
8