Chatworkのメッセージ送信で、グループチャット内メンバーの一部には関係がない情報、新たにグループを作るほどでもない場合や、同じ内容を多数のグループチャットや個別チャットに送りたい場合があると思います。
本文をコピーして送りたいチャットに貼り付けて送信すればよいのですが、かなり手間がかかります。
今回はExcelVBAを使って、「ルーム情報の取得」と「選択したルームへのメッセージ送信」の2つの機能を有したプログラムを紹介します。
コードを公開していますので、手順に従ってエクセルファイルを用意した後、コードをコピーして貼り付ければすぐに使用できますので、ぜひご活用ください。
エクセルファイルの準備
エクセルにメッセージを送るためのシートを用意します。
後で紹介するコードを全く変更しないのであれば上図と同じようにセルの結合をお願いします。
シート名を「SEND」に変更して、マクロを含むファイルの「.XLSM」として保存してください。
3つのボタンを設置する必要がありますので、ボタンの配置を説明します。
開発タブを選択して挿入ボタンを押します。コントロールの種類を選ぶウィンドウが表示されますので、ボタンを選択します。
選択した後は設置したいところの始点をクリックして対角にドラッグしてクリックを解除するとボタンを設置することができます。
マクロの登録ウィンドウが表示されますので、先ほど保存したファイル名を選択して新規作成します。
VBEが自動的に立ち上がり、標準モジュールに「ボタン1_Click」が自動的に追加されます。
ボタン1はメッセージの送信機能
ボタン2はメッセージ入力セルのクリア機能
ボタン3はルーム情報の取得機能
上記機能となっていますので、順番を間違えないように配置をお願いします。
ボタンの文字を編集したい場合は、ボタンの上で右クリックするとメニューが表示されますので、その中のテキストの編集を押します。
下図のようにシートが準備できましたらVBE側で実行するプログラムの準備に進んでください。
プログラムコードの準備
シートの準備が正しくできていればVBEがこのような状態になっていると思います。
Sub ボタン1_Click()の行から最終行まで削除して、下記のコードをコピーして貼り付けてください。
Sub ボタン1_Click()
'チェックされたルームに同一メッセージを送信する
Dim API_TOKEN As String
Dim ROOM_ID As String
Dim BODY_STR As String
Dim MROW As Long
API_TOKEN = Worksheets("SEND").Range("G5").Value
If API_TOKEN <> "" Then
BODY_STR = Worksheets("SEND").Range("A1").Value
If BODY_STR <> "" Then
MROW = 6
Do Until Worksheets("SEND").Cells(MROW, 3).Value = ""
If Worksheets("SEND").Cells(MROW, 1).Value <> "" Then
ROOM_ID = Worksheets("SEND").Cells(MROW, 3).Value
Call CHATWORK_SEND_MSG(API_TOKEN, ROOM_ID, BODY_STR)
End If
MROW = MROW + 1
Loop
Else
MsgBox "送信本文が空白なので処理をキャンセルします"
End If
Else
MsgBox "APIトークンが空白なので処理をキャンセルします"
End If
End Sub
Sub ボタン2_Click()
Worksheets("SEND").Range("A1").Value = ""
End Sub
Sub ボタン3_Click()
'ルーム名とルームIDを取得する
Dim API_TOKEN As String
Dim httpReq As XMLHTTP60
Set httpReq = New XMLHTTP60
Dim STR_RES As String
Dim STR_LEFT, STR_RIGHT As String
Dim ROOMROW As Long
Dim ROOMID, ROOMNAME, ROOMNAME_STR As String
Dim STR_V As Variant
ROOMROW = 6
Do Until Worksheets("SEND").Cells(ROOMROW, 3).Value = ""
Worksheets("SEND").Range("A" & ROOMROW & ":C" & ROOMROW).Clear
ROOMROW = ROOMROW + 1
Loop
API_TOKEN = Worksheets("SEND").Range("G5").Value
If API_TOKEN <> "" Then
With httpReq
.Open "GET", "https://api.chatwork.com/v2/rooms"
.setRequestHeader "X-ChatWorkToken", API_TOKEN
.Send
'レスポンス待機
Do While .readyState < 4
DoEvents
Loop
If .Status = "200" Then
STR_RES = .responseText
ROOMROW = 6
'ROOMIDとROOM名を抜き出す
Do Until InStr(STR_RES, "room_id") = 0
ROOMID = ""
ROOMNAME = ""
STR_LEFT = Left(STR_RES, InStr(STR_RES, "}")) 'ROOMの情報を1個取り出し
STR_RIGHT = Mid(STR_RES, InStr(STR_RES, "}") + 2, Len(STR_RES) - InStr(STR_RES, "}") - 1) '残りの情報を格納
ROOMID = Mid(STR_LEFT, InStr(STR_LEFT, ":") + 1, InStr(STR_LEFT, ",") - InStr(STR_LEFT, ":") - 1) 'ROOMIDを抜き出す
STR_LEFT = Mid(STR_LEFT, InStr(STR_LEFT, ",") + 1, Len(STR_LEFT) - InStr(STR_LEFT, ",") - 1)
ROOMNAME_STR = Mid(STR_LEFT, InStr(STR_LEFT, ":") + 1, InStr(STR_LEFT, ",") - InStr(STR_LEFT, ":") - 1) 'ROOM名の文字列を抜き出す
ROOMNAME_STR = Replace(ROOMNAME_STR, """", "") 'ダブルクォーテーション除去
If InStr(ROOMNAME_STR, "\u") > 1 Then '先頭のエスケープシーケンスじゃない文字列対応
ROOMNAME = Left(ROOMNAME_STR, InStr(ROOMNAME_STR, "\u") - 1)
ROOMNAME_STR = Mid(ROOMNAME_STR, InStr(ROOMNAME_STR, "\u"), Len(ROOMNAME_STR) - InStr(ROOMNAME_STR, "\u") + 1)
End If
STR_V = Split(ROOMNAME_STR, "\u") 'UNICODEエスケープシーケンスを通常の文字列に変換
For N = 1 To UBound(STR_V)
If Len(STR_V(N)) = 4 Then
ROOMNAME = ROOMNAME & ChrW(Val("&H" & STR_V(N)))
Else 'エスケープシーケンスと通常の文字が混在している場合の処理
ROOMNAME = ROOMNAME & ChrW(Val("&H" & Left(STR_V(N), 4))) & Mid(STR_V(N), 5, Len(STR_V(N)) - 4)
End If
Next
Worksheets("SEND").Cells(ROOMROW, 2).Value = ROOMNAME
Worksheets("SEND").Cells(ROOMROW, 3).Value = ROOMID
ROOMROW = ROOMROW + 1
STR_RES = STR_RIGHT
Loop
Worksheets("SEND").Range("A6:C" & ROOMROW - 1).HorizontalAlignment = xlCenter
Worksheets("SEND").Range("A6:C" & ROOMROW - 1).VerticalAlignment = xlCenter
Worksheets("SEND").Range("A6:C" & ROOMROW - 1).ShrinkToFit = True
Worksheets("SEND").Range("A6:C" & ROOMROW - 1).Borders.LineStyle = True
MsgBox "取得完了"
Else
MsgBox "データ取得エラー"
End If
End With
Else
MsgBox "APIトークンが空白です。処理をキャンセルします"
End If
Set httpReq = Nothing
End Sub
Sub CHATWORK_SEND_MSG(ByVal API_TOKEN As String, ByVal ROOM_ID As String, ByVal MSG_BODY As String)
Dim httpReq As XMLHTTP60
Set httpReq = New XMLHTTP60
With httpReq
.Open "POST", "https://api.chatwork.com/v2/rooms/" & ROOM_ID & "/messages"
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "X-ChatWorkToken", API_TOKEN
.Send "body=" + MSG_BODY
If .Status <> "200" Then
MsgBox "送信エラー:" & .Status
End If
End With
Set httpReq = Nothing
End Sub
コードの貼り付けが終わりましたら、参照設定で「Microsoft XML, v6.0」のチェックをONにします。
VBEウィンドウのツールタブを選択し、参照設定をクリックします。
参照設定ウィンドウが表示されますのでMicrosoft XML, v6.0のチェックをONにしてOKボタンをおします。(使用した履歴がない場合はABC順に並んでいるので、かなり下にあります。)
Ctrwork APIトークンの取得
ChatworkのAPIを使用する為、自分のアカウントのAPIトークンを取得します。
Chatwork API トークン
デスクトップアプリでは右上のユーザー名をクリックメニュー内の「サービス連携」をクリックします。
WEBブラウザが開きますので、APIトークンを選択して表示させます。
トークンをコピーしてメモ帳などで保存しておきます。
アカウントの種類(ビジネスやエンタープライズプラン)によっては管理者の許可が必要になる場合がありますので、管理者に許可をいただいて下さい。
使用方法
- APIトークンをG5セルに入力します。
- ボタン3(ルームID取得)を押します。(ルーム名とルームIDが表示されます)
- 送信したいルームのA列セルに文字を入力します(1を推奨します)
- A1セルに送りたいメッセージを入力します。(開業したい場合にはaltキーを押しながらenterを押してください。)
- ルームの設定とメッセージに誤りがないか確認してボタン1(送信ボタン)を押すとchatworkにメッセージが送信されます。
ボタン2はメッセージ入力セル(A1セル)の文字を削除するボタンですので、クリアしたい場合に押してください。
実際に送ってみた結果画像はこちら
最後に
今回はExcelVBAでアプリケーションを作成してみました。
WEBサービスのAPIを利用した場合、json形式でデータが取得できることが多いです。
ExcelVBAではjson形式のデータを簡単に扱うには別途プログラムをダウンロードしてインストールする必要がありますが、今回は文字列操作とChrW関数でなんとかなりました。
pythonではデフォルトの設定でjson形式データを簡単に扱うことができますので、同じ機能をpythonで作った場合の記事執筆も検討しようと思います。
今回の記事が参考になったら、ほかの人にも共有をお願いします。
Chatworkについての記事やExcelVBAの記事がほかにもありますので、興味があればぜひ読んでみてください。
コメント