:::: MENU ::::

C.a.T!

CATch a TAIL!

Japanese sub culture and tech.

  • 2018/03/17
  • 0
develop

OutlookのメールからGitlab Issueを作成するマクロ

渦高く積まれるタスク。

Outlookをマクロでちょっと便利にする第二弾です。

次は、タスク管理との連携。タスク管理機能は、Outlookにあったりするのですが、例によって使い勝手が悪いです。まず、情報を追加していったりしづらいのが致命的。あと、他の人との共有もしづらいです。ということで、タスク管理はGitlab Issueにまとめています。ただ、タスクの依頼自体はメールでやってくることが多いんですよね。タスク投げてくる人たちおじいちゃんが多いんで。そんなわけで、メールをそのままGitlab Issueに投げつけたくなるわけです。

Gitlab Issueに登録する形式は、タイトルはメールサブジェクト、説明は頭に『サブジェクト / 受信時間 @ 送信者』を書いてメールを検索しやすくしておき、その後ろにメール本文をくっつける仕様にします。表示が崩れないように、メール本文はコードブロックにしてあげます。ちなみに、Gitlab Issueは、markdown形式で書けるので、markdownで投げつけます。

コードはこんな感じ。

Private Const GITLAB_URL = "http://example.com/api/v4/projects/project_id/"
Private Const GITLAB_TOKEN = "api_token"
Private Const GITLAB_ASSIGNEE = "user_id"

Sub CreateIssueFromMail()
  Dim xmlHttp As Object
  Dim url As String
  Dim strParam As String
  Dim objMail As MailItem
  Dim title As String
  Dim body As String
  Dim objSC As Object
  Dim js As Object
  Dim ret As String

  Set objMail = getCurrentMailItem()
  title = objMail.Subject
  body = title & " / " & CStr(objMail.ReceivedTime) & " @ " & objMail.SenderName & vbCrLf & vbCrLf & "```" & vbCrLf & objMail.body & vbCrLf & "```"
  Set objSC = CreateObject("ScriptControl")
  objSC.Language = "JavaScript"
  With objSC.CodeObject
    strParam = "title=" & . encodeURIComponent(title) & "&description=" & . encodeURIComponent(body) & "&assignee_ids[]=" & GITLAB_ASSIGNEE
  End With
  Set objSC = Nothing
  
  Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
  url = GITLAB_URL & "issues"
  
  With xmlHttp
    .Open "POST", url, False
    .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .SetRequestHeader "PRIVATE-TOKEN", GITLAB_TOKEN
    .Send (strParam)
    ret = .responseText
  End With
  Set xmlHttp = Nothing
End Sub

Private Function getCurrentMailItem() As MailItem
  If TypeName(Application.ActiveWindow) = "Inspector" Then
    Set getCurrentMailItem = ActiveInspector.CurrentItem
  Else
    Set getCurrentMailItem = ActiveExplorer.Selection(1)
  End If
End Function

GITLAB_URLは、投げつける先のプロジェクトのURL、GITLAB_TOKENはAPIトークン、GITLAB_ASSIGNEEはIssueをアサインするユーザのIDです。アサインまでしなくていいなら、strParam作ってる部分から関係するところ消してしまえばいいです。

ポイントは、URIエンコードして送るというところあたりでしょうか。VBScriptに標準で関数がなかったので、頑張れば実装できるのですが、サボってJavaScriptに渡してしまってエンコードしてます。まあ、個人的に使うだけなのでこの辺のこだわりは捨ててます。

わりと簡単なので、Gitlab使ってる方はぜひ。多分、Githubでもおんなじ感じで飛ばせるんだと思います。






Leave a comment