OpenProjectをExcelでエクスポート/インポートする


# はじめに

皆さんはチケット管理ツールは何を使っていますか？
Redmineだったり、Backlogが有名ですよね。
Trelloは開発向けというか、不具合管理だったり開発以外での運用に有効なイメージがあったりします（個人的感想です）。

個人的には新規で立ち上げる際でセキュリティ関連や予算の都合上でオンプレ型の制約であればOpenProject一択だと思ってたりするのですが、あまり浸透していないのが現状…。

なので過去に居たプロジェクトでExcelでタスク管理をしてたのですがあまりにも更新がされない/見づらい/残タスクが分かり辛い等の問題でOpenProjectへの切り替えを提案したのですが

「お客様への報告がしづらい」という指摘がありました。
気持ち的にはめっちゃ分かるのですが、そこはエンジニアだろ！？　なんとかしろよ？って思ったのですが、実際に何とかしてみました。
要はお客様用のフォーマットとOpenProjectのダウンロードの相互コンバートが出来れば良いので、まずはOpenProjec⇔Excelの相互変換が出来れば良いのかなと！
今回はそのことを記事にしてみました。

またOpenProject等の環境構築は公式に記載していて、英文もそこまで難しくないので割愛します。

Dockerでの環境構築が楽ちんです♪

https://www.openproject.org/docs/installation-and-operations/installation/docker/

# APIのトークンを発行する（OpenProject）

まずはこれをしないと何も始まりません。
外部のAPI（Slack等）を連携する際にも必要になります。

個人設定>アクセストークン>APIの生成で表示されるスナックバーに表示されます（黒字部分）。
再表示不可能なのでメモ帳辺りにコピーしておきます。

# OpenProjectExcelをCloneする

https://github.com/opf/OpenProjectExcel

OpenProjectのインポートを可能にするExcelVBAがこちらにあります。
こちらをGit Cloneもしくはzipでダウンロードします。
これ以降はこちらにあるOpenProjectAPI.xlsmを利用します。

# OpenProject情報をダウンロードする（エクスポート）

OpenProject上ではこんな感じのタスクがあるとします。
![op3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/213e4547-f3d7-b6ae-7c98-693657b8fd01.png)

これらをダウンロードしたいと思います。

OpenProjectExcelを立ち上げるとこんな画面が表示されると思います。

![op2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/0e8c7de5-9c84-f97a-d2fe-8dc17dc0470f.png)

URLとプロジェクト名、API-Tokenを入力します。
Tokenについては先程発行したAPIのトークンです。

今回はローカル内で立ち上げたのでlocalhostになってます。

Set As Defaultで設定を保持して、Acceptを押下するとテキストの文字変換でエラーが発生します。
この辺りは無視して消してもらっても良いと思いますｗ
（私は下記コードを削除しても問題なかったですが、不具合ありましたら教えてください）

```VBA
TextStr = Replace(TextStr, "\u00E0", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00E1", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00E2", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00E3", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00E4", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00E5", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00E6", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00E7", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00E8", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00E9", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00EA", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00EB", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00EC", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00ED", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00EE", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00EF", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00F0", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00F1", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00F2", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00F3", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00F4", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00F5", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00F6", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00F7", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00F8", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00F9", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00FA", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00FB", "・, , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00FC", "・, , , vbBinaryCompare)
```

ソースコードを削除し、再度実行すると下記のような形でダウンロードが完了すると思います。
ただし親子関係が不明瞭なのでこの辺りを修正していきます。

![op5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/76d5c4aa-7c3a-7d8e-8f4c-222095997f40.png)

ただしID、タイトルだけでは報告に使えないのと思うのでグレーの列を追加してダウンロードしたい項目を追加していきます。

![op6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/d58b5883-e9fb-187c-0df6-7b6650906c8b.png)

プルダウン項目を見るとOpenProjectに定義されている列が一覧で表示されます。
該当しない列を入力してもVBA側でエラーが出るので、列名を変更したい場合はOpenProject側を修正しましょう。

今回は「開始日	終了日	親項目」の3つを追加しました。

先程ダウンロードした項目を消して、再度ダウンロードしてみます。

![op7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/dea9f74e-11b8-2d62-7367-0cbef27b637f.png)

見事表示されました。親子関係もしっかりと表現出来ていますね！

# インポートする

ExcelからOpenProjectへの意向でいちいちWEB画面上で入力するのはめんどいので一括でインポートが出来たら楽ですよね。
その為の機能も搭載しております。

先程のExcelに新しく一覧機能を追加してみました。
こちらをインポートしたいと思います。

![op8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/fad8579e-85fd-3641-772a-e42c3b883ec8.png)

一覧機能というタスクに3つの子タスクを作りたいので、半角スペース4文字を子タスクのタイトルの先頭に追加しております。
この状態でCtrl+b(macは分からない…)を押してメニューを開きます。

![op9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/003195ee-aed1-e69d-6f67-68581cb79e88.png)

Uploadを押すとこんな感じのダイアログが表示されると思います。
これは親子関係を示すための識別値を入力します。
今回は半角スペース4文字にしているので、入力欄に半角スペース4文字を入力してOKを押下します。
押下するとUploadが開始されます。

![op10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/730e1ebc-ab98-be63-45c5-8fbae892a383.png)

Uploadが完了するとupdatestatusにステータスコードが表示されます。
201が表示されると作成されているハズなので、OpenProject側を確認してみましょう。

![op11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/73379d6e-6dbe-9848-977b-41956d7e9be7.png)

問題なく表示されることが確認できました！
また、OpenProjectで進捗や期日が親子関係で連動する設定をすると親のID:40の一覧機能の開始～終了が子タスクの範囲になってることが分かります。
ガントチャートも併せて反映されるので、タスクの状態がより追いやすくなると思います。

これでUploadの解説は以上となります。

# あとがき

Excel管理は不具合や残タスクが追いづらくなったり、進捗の因果関係が分かり辛くなったりします。この記事を読んでいずれかのタスク管理ツールの使用を検討するPJTがひとつでも増えればと思ってます！

参考：

https://www.openproject.org/blog/synchronize-excel-openproject/