redmine.tokyo 第13回勉強会 LT 1 2017.11.18

OutlookからRedmineを制御
顧客管理の自動化
2017.11.18 山崎進

既存の顧客管理方法
メール受信

Webフォーム登録

情報登録
顧客

オペレーター
メール送信
フォルダー作成とメール移動
2
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

OutlookからRedmineを制御
メール受信

Webフォーム登録

自動情報登録顧客

オペレーター
メール下書きフォルダー作成とメール移動
3
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

OutlookからRedmineを制御

デモ動画
4
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

5
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

OutlookからRedmineを制御
Subject: ANKO ガントチャートお問い合わせ
ANKO ガントチャートのお問い合わせがHPのフォームから送信されました。
会社名：株式会社山崎
電話番号：03-1234-5678
お名前 ：山崎
メールアドレス：yamasaki60@gmail.com
ご利用中のRedmineの種別：Redmine3.3.X
ご利用中のrubyの種別：ruby2.2以下
お問い合わせ内容：ANKOガントチャートの評価版を試してみたいです。

6redmine.tokyo 第13回勉強会 LT 1 2017.11.18

Outlook VBAからチケットの登録
Const REDMINE_API_KEY = "5730caf59969374XXXXXXXXXXXXXX289af29584d" 'システム管理者の権限
Const REDMINE_URL = "http://ankosoft.co.jp/"

各自の環境に合わせてください。

Sub redmineにチケットを登録()'受信トレー
Set 受信トレー = Application.GetNamespace("MAPI").Folders(1).Folders.Item(2)For Each itms In 受信トレー.Items '受信トレーにあるメールを検索
If itms.Class = 43 Then ' olMail:43
If itms.Subject = "ANKO ガントチャートお問い合わせ" Then
受信日時 = itms.ReceivedTime ' 受信日時
差出人 = itms.SenderName ' 差出人
メールタイトル = itms.Subject' タイトル
本文 = itms.Body' 本文
Debug.Print 本文'メール本文を改行で切り分ける
buf = Split(本文, vbCrLf)
For i = 0 To UBound(buf)'さらに「：」で切り分ける
buf2 = Split(buf(i), "：")
If i = 2 Then
会社名 = buf2(1)カスタムフィールド = "<custom_field id='67'><value>" & 会社名 & "</value></custom_field>"
ElseIf i = 3 Then
電話 = buf2(1)カスタムフィールド = カスタムフィールド & "<custom_field id='69'><value>" & 電話 & "</value></custom_field>"
ElseIf i = 4 Then
名前 = buf2(1)カスタムフィールド = カスタムフィールド & "<custom_field id='68'><value>" & 名前 & "</value></custom_field>"
ElseIf i = 5 Then7
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

メール = buf2(1)カスタムフィールド = カスタムフィールド & "<custom_field id='70'><value>" & メール & "</value></custom_field>"
ElseIf i = 6 Then
Redmineの種別 = buf2(1)カスタムフィールド = カスタムフィールド & "<custom_field id='103'><value>" & Redmineの種別 & "</value></custom_field>"
msg2 = myRepMsg(会社名, 名前, 受信日時)
With itms.ReplyAll.BodyFormat = olFormatPlain.Body = msg2 & vbCrLf & .Body'.Send.Save'.Recipients.Remove ("sales@ankosoft.co.jp")'.To = Replace(.To, "sales@ankosoft.co.jp", "")Debug.Print .To
End With'Redmineの種別が２か３で保存先フォルダーが分かれる。フォルダーを新規で作成し、メールをそのフォルダーへ移動する
If Redmineの種別 Like "Redmine2*" Then
Set myDestFolder = 受信トレー.Folders(7).Folders(2).Folders(2).Folders(1).Folders.Add(Format(受信日時, "yymmdd") & "_" & 会社名)
ElseIf Redmineの種別 Like "Redmine3*" Then
Set myDestFolder = 受信トレー.Folders(7).Folders(2).Folders(2).Folders(2).Folders.Add(Format(受信日時, "yymmdd") & "__" & 会社名)
End If'メールをフォルダーへ移動
itms.Move myDestFolder
ElseIf i = 7 Then
rubyバージョン = buf2(1)ElseIf i = 8 Then
お問い合わせ内容 = buf2(1)ElseIf i >= 9 Then
お問い合わせ内容 = お問い合わせ内容 + buf(i)End IfNext i
カスタムフィールド = "<custom_fields type='array'>" & カスタムフィールド & "</custom_fields>"
Dim ReqStatus'メールから取得した情報を元に、Redmineに登録する
ReqStatus = PostIssue1(会社名, お問い合わせ内容 & "(" & rubyバージョン & ")", カスタムフィールド, 55, 426)
If ReqStatus <> False Then
MsgBox "登録成功"
Else
MsgBox "登録失敗"
End IfEnd IfEnd IfNextEnd Sub

8redmine.tokyo 第13回勉強会 LT 1 2017.11.18

Redmineにチケットを登録するサブルーチン
Function PostIssue1(Subject, Body As String, カスタムフィールド, PROJECT_ID, assigned)
Dim xhr
Dim RequestURL As String
Dim RequestBody As String
Dim bPmary() As Byte
RequestURL = REDMINE_URL & "/issues.xml?format=xml&key=" & REDMINE_API_KEY
Set xhr = CreateObject("Microsoft.XMLHTTP")
xhr.Open "POST", RequestURL, False

xhr.SetRequestHeader "Content-Type", "text/xml"
RequestBody = "<?xml version=" & Chr(34) & "1.0" & Chr(34) & "encoding=" & Chr(34) & "UTF-8" & Chr(34) & "?>"'プロジェクトIDとタイトルは必須
RequestBody = RequestBody & "<issue>"RequestBody = RequestBody & "<project_id>" & PROJECT_ID & "</project_id>"
RequestBody = RequestBody & "<subject>" & Subject & "</subject>"
RequestBody = RequestBody & カスタムフィールド
RequestBody = RequestBody & "<assigned_to_id>" & assigned & "</assigned_to_id>" '担当者
RequestBody = RequestBody & "</issue>"
xhr.Send (RequestBody)
If xhr.Status = 201 Then
PostIssue1 = TrueElse
PostIssue1 = False
End IfEnd Function

9
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

Redmineの無機質な入力画面

10
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

Redmineの無機質な入力画面• どこに入力したらいいのか分かりずらい• 入力項目のカテゴリー化ができない• 入力項目が多すぎる• 単色の入力フォーム
11
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

Redmineの無機質な入力画面• どこに入力したらいいのか分かりずらい• 入力が楽しくない• 入力項目のカテゴリー化ができない• 入力がめんどくさい、苦痛• 入力項目が多すぎる• 単色の入力フォーム
12
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

入力フォームの改善

13入力フォームの改善

14
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

現状の課題点 カスタムフィールドを増やすと可読性、入力性が低下する

29項目

改善点 ステータスごとに必要なフィールドのみを表示

14項目
新規顧客入力画面

課題点 他のPJと共有しているためCFの位置が論理的ではない
目の動きが「N」になり可動性が低下

改善点 CFのカテゴリー化、カラーリング、2列を1列にレイアウト変更

可読性の向上入力フォームの改善• 背景色を付けて、入力項目をカテゴリー化• ステータスごとに必要な入力項目を表示• 半自動入力支援機能

19
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

非表示にしたいフィールド設定

ワークフローを設定
ー＞読み取り設定にすることで編集時、非表示になる

20
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

編集画面以外でも非表示にしたい
項目多い..

入力されていない項目は表示する必要がないのでは？

編集画面はワークフロー設定で項目すっきり
21
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

非表示にして可読性向上
ノーマル表示カテゴリー化入力済みフィールドのみ表示
22

課題点 項目が多いと一目で内容の確認困難

入力されていない項目も見える改善点 CFのカテゴリー化、カラーリング、2列を1列にレイアウト変更、未入力項目を非表示

不必要な情報を非表示にし可読性の向上
購入ステータスで新規ステータスには無かった付加情報が追加

Redmineカスタマイズをしたい！
IPO(INPUT - PROCESS - OUTPUT)別の難易度• IとOですでに存在する情報を加工するには、JS、htmlタグによりかなりの部分対応可能• IとOで既存にない情報を追加したり、PはRuby、Rails、DBの知識が必要
25
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

最後にRedmineで顧客管理や障害管理を効率よくするためには自動化、他のシステムとの連携が効果的です。
時間の関係で今回ご紹介できなかった便利な使い方の事例が豊富にありますので、関心がある方は、お気軽に声をかけてください。

26
redmine.tokyo 第13回勉強会 LT 1 2017.11.18

最後にANKO ガントチャート50%オフ
2017年12月31日まで
http://www.ankosoft.co.jp/anko_gantt_chart/からお申し込みください。
株式会社Ankosoft
山崎 進
http://www.ankosoft.co.jp
sales@ankosoft.co.jp
27
redmine.tokyo 第13回勉強会 LT 1 2017.11.18