漫画の新刊を買い忘れないためにしている施策

# はじめに

漫画を紙媒体で買って集めるのが好きです。

新刊発売当日に購入できればベストですが、都合が悪くてすぐ買いに行けないこともあります。悲しいことに最近物忘れが進行してきたこともあって、ちょっと日が経つと「あれ、これ買ったっけ」になってしまいます。

そこで、以下のような仕組みを作りました。

- 新刊発売日を外部サービスから取得
  - 利用サービス: [新刊.net](http://sinkan.net/)
  - 予定表を自分のカレンダーに連携できる
- 発売当日になったらSlack通知
  - GoogleAppsScriptで外部カレンダーの情報を取得してSlackに投稿
- 発売当日になったらTrelloにカードを追加
  - 購入したらカードをアーカイブして完了

また、SlackチームやTrelloボードには妻も入っているため、片方が買いそびれた漫画をもう片方が買って帰ることもできます。

# ざっくりまとめるとこんな感じ

わざわざ絵にするほどでもないけど。

![](https://qiita-image-store.s3.amazonaws.com/0/104653/c91aba1a-8a4d-2aea-8e59-38b8a457b8b8.png)

# 構築
## 予定表の連携

- http://sinkan.net/ にアカウントを登録します。
- 買っている漫画を登録します。
- 予定表の[iCal形式]を選択し、自分のGoogleカレンダーに連携します。

## 発売当日になったらSlack通知

公式の[GoogleCalendar連携アプリ](https://slack.com/apps/A0F8149ED-google-calendar)では、外部カレンダーのデータを取得することができません。
そこで、GoogleAppsScriptを使って外部カレンダーの予定を取得し、Slackに通知するスクリプトを書きます。

```javascript:GoogleAppsScript
function main() {
  var today = new Date();

  var cal = CalendarApp.getCalendarById("...@import.calendar.google.com");
  var events = cal.getEventsForDay(today);
  if(events.length > 0) {
    var text = "【" + Utilities.formatDate(today, "JST", "yyyy/MM/dd") + "発売の新刊】";
    events.forEach(function(event) {
      var title = event.getTitle();
      text += "\r\n";
      text += title;
    });
    Logger.log(text);
    postToSlack(text);
  }
}

function postToSlack(text) {
  const webhookUrl = "https://hooks.slack.com/services/...";

  var options = {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : JSON.stringify({
      "text" : text
    }),
  };
  
  Logger.log(UrlFetchApp.fetch(webhookUrl, options));
}
```

予め作成しておいたWebフックに送信します（アイコンや名前も適当に設定済み）。
こんな感じに通知されます（何もない日は通知されません）。
<img alt="" src="https://qiita-image-store.s3.amazonaws.com/0/104653/38ece92d-70dc-e33a-d9dc-3591ee590a7a.png">

## 通知と同時にタスク登録

買ったかどうかを忘れないために、Trelloにカードを追加します。
Slack通知と同時に実行されるよう、処理を追加します。

```javascript:GoogleAppsScript
function main() {
  ...
    events.forEach(function(event) {
      var title = event.getTitle();
      ...

      // Trelloにカードを追加
      const listId = "...";
      createTrelloCard(listId, title, "");
    });
  ...
}

function createTrelloCard(listId, name, desc) {
  const key = "...";
  const token = "...";
  
  var url = "https://api.trello.com/1/cards/?key=" + key + "&token=" + token;
  var options = {
    "method" : "post",
    "muteHttpExceptions" : true,
    "payload" : {
      "name"      : name,
      "desc"      : desc,
      "idList"    : listId,
    }
  };
  
  Logger.log(UrlFetchApp.fetch(url, options));
}
```

- TrelloAPIのキーとトークンは、別途準備しておきます。
  - 参考にさせていただきました！ →[Trello API を叩いてカードを作成する方法（curl利用）](https://qiita.com/isseium/items/8eebac5b79ff6ed1a180)
- カード追加先のリストIDも別途curl等で取得しておきます。

こんな感じに追加されます。
<img alt="" src="https://qiita-image-store.s3.amazonaws.com/0/104653/721b8300-7481-1eb5-68c3-98f2b554b609.png">


# おわりに

GoogleAppsScript、最近触り始めたのですが楽しいですね。
各種Googleサービスと他サービスとをお手軽に連携できるので、もっと色々作ってみたくなりました。

# ちなみに

[Trello Alerts](https://my.slack.com/apps/A0F814C4R-trello-alerts)を使うとこんな感じになります。

![](https://qiita-image-store.s3.amazonaws.com/0/104653/6b6d8bc2-8765-dbd1-916f-c2498d3d12b7.png)

Slack通知部分のプログラムをまるごとカットできるので、こっちでも良いと思います。
今回は、私自身がGoogleAppsScriptをできるだけ書きたかったので使いませんでした。