Chatworkの指定したルームにメッセージを一斉送信する方法 | 独学プログラマーHiroのパーツボックスblog

[ExcelVBA]Chatworkの指定したルームにメッセージを一斉送信する方法

Chatwork
スポンサーリンク

Chatworkのメッセージ送信で、グループチャット内メンバーの一部には関係がない情報、新たにグループを作るほどでもない場合や、同じ内容を多数のグループチャットや個別チャットに送りたい場合があると思います。

本文をコピーして送りたいチャットに貼り付けて送信すればよいのですが、かなり手間がかかります。

今回はExcelVBAを使って、「ルーム情報の取得」と「選択したルームへのメッセージ送信」の2つの機能を有したプログラムを紹介します。

コードを公開していますので、手順に従ってエクセルファイルを用意した後、コードをコピーして貼り付ければすぐに使用できますので、ぜひご活用ください。

エクセルファイルの準備

エクセルにメッセージを送るためのシートを用意します。

エクセルシート設定見本画像

後で紹介するコードを全く変更しないのであれば上図と同じようにセルの結合をお願いします。

シート名を「SEND」に変更して、マクロを含むファイルの「.XLSM」として保存してください。

3つのボタンを設置する必要がありますので、ボタンの配置を説明します。

開発タブを選択して挿入ボタンを押します。コントロールの種類を選ぶウィンドウが表示されますので、ボタンを選択します。

ボタン配置手順の画像

選択した後は設置したいところの始点をクリックして対角にドラッグしてクリックを解除するとボタンを設置することができます。

マクロの登録ウィンドウが表示されますので、先ほど保存したファイル名を選択して新規作成します。

マクロの登録ウィンドウ画像

VBEが自動的に立ち上がり、標準モジュールに「ボタン1_Click」が自動的に追加されます。

ボタン1はメッセージの送信機能

ボタン2はメッセージ入力セルのクリア機能

ボタン3はルーム情報の取得機能

上記機能となっていますので、順番を間違えないように配置をお願いします。

ボタンの文字を編集したい場合は、ボタンの上で右クリックするとメニューが表示されますので、その中のテキストの編集を押します。

ボタンのテキスト編集説明画像

下図のようにシートが準備できましたらVBE側で実行するプログラムの準備に進んでください。

シートの設定後画像

プログラムコードの準備

シートの準備が正しくできていればVBEがこのような状態になっていると思います。

VBEモジュール1の画像

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 トークン

デスクトップアプリでは右上のユーザー名をクリックメニュー内の「サービス連携」をクリックします。

Chatworkのサービス連携メニュー画像

WEBブラウザが開きますので、APIトークンを選択して表示させます。

トークンをコピーしてメモ帳などで保存しておきます。

chatwork APIトークンの表示画面

アカウントの種類(ビジネスやエンタープライズプラン)によっては管理者の許可が必要になる場合がありますので、管理者に許可をいただいて下さい。

使用方法

  1. APIトークンをG5セルに入力します。
  2. ボタン3(ルームID取得)を押します。(ルーム名とルームIDが表示されます)
  3. 送信したいルームのA列セルに文字を入力します(1を推奨します)
  4. A1セルに送りたいメッセージを入力します。(開業したい場合にはaltキーを押しながらenterを押してください。)
  5. ルームの設定とメッセージに誤りがないか確認してボタン1(送信ボタン)を押すとchatworkにメッセージが送信されます。
仕様手順の画像

ボタン2はメッセージ入力セル(A1セル)の文字を削除するボタンですので、クリアしたい場合に押してください。

実際に送ってみた結果画像はこちら

実行時のエクセル画面画像
実行後のchatwork画面画像

最後に

今回はExcelVBAでアプリケーションを作成してみました。

WEBサービスのAPIを利用した場合、json形式でデータが取得できることが多いです。

ExcelVBAではjson形式のデータを簡単に扱うには別途プログラムをダウンロードしてインストールする必要がありますが、今回は文字列操作とChrW関数でなんとかなりました。

pythonではデフォルトの設定でjson形式データを簡単に扱うことができますので、同じ機能をpythonで作った場合の記事執筆も検討しようと思います。

今回の記事が参考になったら、ほかの人にも共有をお願いします。

Chatworkについての記事やExcelVBAの記事がほかにもありますので、興味があればぜひ読んでみてください。

コメント

タイトルとURLをコピーしました