ChatworkAPIとGASで新着メッセージを随時メールに送る


# はじめに
chatworkを常用していないけど、
chatworkを利用してやり取りすることがあります。

またそのやり取りを適宜メールに送ってほしいという要望もあったので、その要望に応えました。

最近はローカルサーバ立てるよりも、GAS(Google App Script)を利用しています。
GAS経由で動かすと以下のメリットがあり、おすすめです。

- サーバ設定の必要がない
- 無料
- 保守の必要もない

# 手順
## ChatworkAPIの利用申請を行う
ChatworkAPIはまだプレビュー版のため、限定公開されています。
APIを利用するには利用申請が必要です。

以下のリンクから、利用申請して利用可能になるのを待ちます。
https://www.chatwork.com/service/packages/chatwork/subpackages/api/apply_beta.php

## ChatworkAPIのトークンを取得する
APIが利用可能になったら、動作設定ウィンドウに「API発行」のタブが追加されます。
ここでトークンを発行します。
![chatwork_a.png](https://qiita-image-store.s3.amazonaws.com/0/14275/2786bad0-042b-847d-1b74-7973367d0f84.png "chatwork_a.png")
↓
<img src="https://qiita-image-store.s3.amazonaws.com/0/14275/c029221c-ca6e-f656-f536-3f36a1109234.png" alt="chatwork_b" width="300" />

## 通知したいチャットルームのIDを取得する
チャットを表示した際のURLの「rid」以降がチャットルームIDです。
![chatwork_c.png](https://qiita-image-store.s3.amazonaws.com/0/14275/b67e27ac-3e3a-a33d-abff-a564f68d5144.png "chatwork_c.png")

## Google App Scriptを作成する

1. [GoogleDrive](http://drive.google.com/)にログインし、新規にスプレッドシートを作成 ※
2. スプレッドシートの画面で「ツール > スクリプトエディタ」を選択
3. スクリプトエディタが起動

※ GASをスタンドアロンで作成することもできるのですが、今後のスプレッドシートからの読み込みや書き込みを行う可能性があるのでスプレッドシートから作成します。

## スクリプトの作成

先程取得したAPIトークンと、チャットルームのID、送信先メールアドレスを指定します。
checkChatworkMessagesを実行し、メッセージがあればメールが届くことを確認します。

```
function checkChatworkMessages() {
  var token = '<ChatworkAPIトークン>';
  var roomId = '<room id>';
  
  // API docのLink
  // http://developer.chatwork.com/ja/endpoint_rooms.html#POST-rooms-room_id-messages
  
  // デバッグ時はURLにforce=1パラメタを追加 → 強制で最新の100件を取得
  var data = UrlFetchApp.fetch('https://api.chatwork.com/v1/rooms/' + roomId + '/messages', {
                               headers: {
                               'X-ChatWorkToken': token
                               },
                               method: 'get',
                               });

    //  Logger.log(data);
  
  // 新しいメッセージがなければ終了
  if (data == "") {
    Logger.log('Not exist unread messages.');
    return;
  }
  
  var json=JSON.parse(data);
  var mailBody = ''; // メール本文
  for (var i = 0; i < json.length; i++) {
    mailBody += json[i]["body"] + "\n" + json[i]["account"]["name"] + "\n" + getFormattedDate(json[i]["send_time"]) + "\n\n";
  }
  
  if (mailBody !== '') {
    sendMail(mailBody);
  }
}

// メールを送信
// @param string メール本文を指定
// @return void
function sendMail(body) {
  // 送信対象者をコンマ区切りで記載
  var recipients = "tomoya.amachi@gmail,tomoya.dummy@gmail.com";
  var subject;
  
  subject = "Chatwork通知メール";
  MailApp.sendEmail(recipients.split(','), subject, body, {
    noReply: true
  });
}


// UnixTimestampをフォーマットして返す
// @param int Unixtimeを指定
// @return 10月10日10:30:23
function getFormattedDate(sendTime) {
  var sendDate = new Date(sendTime*1000);  
  var month = sendDate.getMonth() + 1; // getMonthは 0~11で値が返る
  var date = sendDate.getDate();  
  var hours = sendDate.getHours();  
  var minutes = "0" + sendDate.getMinutes();  
  var seconds = "0" + sendDate.getSeconds(); 
  return month + '月' + date + '日' + hours + ':' + minutes.substr(-2) + ':' + seconds.substr(-2);
}
```


## トリガーの設定

最後に、作成したスクリプトが定期的に実行されるよう、トリガーの設定を行います。
![gas_a.png](https://qiita-image-store.s3.amazonaws.com/0/14275/bb26985a-2d9a-195c-72df-d7bb6cc184ea.png "gas_a.png")

「リソース > 現在のプロジェクトのトリガー > 今すぐ追加」を選択し、
checkChatworkMessagesを1分おきに動作させるように設定後、保存します。

![gas_b.png](https://qiita-image-store.s3.amazonaws.com/0/14275/1bac3ff9-7a9c-0a18-b91f-a58b89852c73.png "gas_b.png")


## 動作確認
対象のルームに新しい書き込みを行い、
指定したメールアドレスにメールを送られることを確認してください。

# 最後に
割と簡単に実装できたので、今後はスプレッドシートにルームIDと送信メールアドレスを指定したら、自動で各ルームをチェックしてくれるスクリプトをつくるかもしれません。
それも簡単につくれるので、ちょっと時間が空いて、必要になったら作ろうと思います。


ちなみに、[メールはすべてSlackに転送している](https://get.slack.help/hc/en-us/articles/206819278-Send-emails-to-Slack)ので、基本的にはSlackを見ていれば大丈夫なようにはなってます。

さらに、[Franz](http://meetfranz.com/)(※各種メッセージサービス/メールをまとめてくれるサービス。めっちゃ便利)を利用し、
Slackチャネルだけ常時表示し、必要であれば他のメッセージサービスなどのタブを表示するようにしています。

とても作業がしやすいので、おすすめです。