JavaScript
GoogleAppsScript
gas
chatwork
ChatworkAPI

chatwork で自分への TO を探せるようにする

chatwork で起こりがちな自分に送られてきた TO を探し出せなくなる問題を GAS をつかったハックでどうにかしてみましょう。

chatwork では自分への TO が探せない?

Slack なら沢山のチャンネルにはいっていても、自分へのメンションを検索することができます。
chatwork では同等の検索機能がないのです。なので、見失ってしまった TO メッセージを探すには、投稿されたメッセージを思い出してヒットしそうなキーワードで検索するか、チャットルームの過去メッセージを目力でクロールして探し出す必要があります。

温かみのある解決方法

  • TO に対して回答を保留したものは横着せずにタスク化する
  • TO に対して回答を保留したものは横着せずに未読にもどす

なかなか良さそうですね。
でも一言だけ言わせてください。
クソ面倒です。

自分への TO メッセージを引用して専用のチャットにまとめる

専用チャットに自分への TO メッセージを引用しておけば、あとから探すのはカンタンですね。
これを GAS で自動化してみようと思います。
まずは温かみのある手作業でプロセスを確認しておきましょう。

  1. 専用のチャットルームを作成しておく image.png
  2. 自分宛のメッセージがきたら「引用」と「リンク」メッセージを作成 image.png
  3. 作成したメッセージを専用のチャットルームに投稿する image.png

chatwork Webhook × Google Apps Script で自動化する

chatwork Webhook ってなんだろう?

Webhook ってなんだっていう方は 公式サイトの説明 をご一読ください。

TO, TOALL, 返信 が来たら、設定してある URL に送られたメッセージの情報を含めて送り付けるよ!
送り付けた先で好きなようにいろいろやっていいぜ!

っていう chatwork サーバー側の優しい仕組みです。

Webhook を含めたデータの流れを理解する

alt

実際に自動化してみよう

コードなんて実際に書いて、動かしてなんぼ。
実際にやってみましょう。
TO をあつめるチャットルームは事前に作っておいてください。

なんも準備できてないし、わからんって場合は先に
こちらの記事
をどうぞ。

  1. 新規で google スプレッドシートを作成する image.png
  2. 適当に名前を付ける
    image.png
  3. スクリプトエディタを開く
    image.png
  4. ライブラリを追加
    image.png
  5. コピペして TO をあつめるチャットルームIDとAPI_TOKENを設定

    /**
    * chatwork Webhook から TO メッセージ情報を受け取る
    * @param {Object} e - TO メッセージ情報 see. http://developer.chatwork.com/ja/webhook.html#eventType
    */
    function doPost(e) {
      // API_TOKEN を設定する
      var api_token = 'aaaaaaaaaaaaaaaaa';
      // TO メッセージを集めるチャットルームIDを設定する
      var postRoomId = 9999999;
    
      var json = JSON.parse(e.postData.contents);
      var message = json.webhook_event.body;
      var roomId = json.webhook_event.room_id;
      var fromAccountId = json.webhook_event.from_account_id;
      var messageId = json.webhook_event.message_id;
      var sendTime = json.webhook_event.send_time;
    
      if (roomId == postRoomId) {
        // 投稿専用チャットルームからのイベントは無視する
        return;
      }
    
      // 情報を整形して投稿する
      var client = createClient_(api_token);
      client.sendMessage(
        {
          room_id: postRoomId,
          body: Utilities.formatString("[qt][qtmeta aid=%s time=%s]%s[/qt]\nhttps://www.chatwork.com/#!rid%s-%s", fromAccountId, sendTime, message, roomId, messageId),
        }
      );
    }
    
    function createClient_(api_token)
    {
      return ChatWorkClient.factory(
        {
          'token': api_token,
        }
      );
    }
    
  6. ウェブアプリケーションとして導入
    image.png

  7. 「全員(匿名ユーザを含む)」で導入
    image.png

  8. 表示された URL をコピー
    image.png

  9. TO を集めたいアカウントに Webhook を設定する
    image.png

    image.png

    Webhook URL には「ウェブアプリケーションとして導入」で最後に表示されたURLをコピペ
    image.png

  10. 準備完了 🙌

動作確認

それでは、自分に TO がきたときの動作を確認してみましょう。

  • TO きた! image.png
  • 専用チャットに自動で投稿されてる! image.png

🙌
いろいろいじって、好きなように変えてみましょう。

自分宛のメッセージを検索する

この状態で自分宛のメッセージをためていけば、自分宛のメッセージで絞り込んだ検索もしやすくなります。

image.png

TO の迷子探しから解放されそうですね。

⚠️いろいろやるときの注意⚠️

今回の設定で Webhook で自分に TO があったら通知してくれるようにしています。
通知さえるメッセージの本文には、そのまま自分への TO が記述されています。
そのメッセージを API 経由でチャットルームに投稿するとどうなるでしょう?
その投稿メッセージにも TO が含まれていますから、Webhook が起動します。すると、また通知がとどいて GAS がそのメッセージをまた引用して投稿する...
つまり無限ループって怖くね?
そのためのガード条件が入っています。忘れると無限ループってこわくねってなります。

  if (roomId == postRoomId) {
    // 投稿専用チャットルームからのイベントは無視する
    return;
  }

うっかりして、やばい動きになったら、Webhook を無効化しましょう。
だいじょうぶ、だいじょうぶ、Webhook はぜんぜん怖くないから。
image.png

それではみなさんもよき chatwork × GASライフを!