社内Slackパワプロ化計画

この記事は、[ハンズラボ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/handslab) 4日目の記事です :snowman:

## 自己紹介

ハンズラボ2年目でPOSチームに所属しています!!

最近読んだ漫画はブルーロック
最近ハマっているゲームは APEX と パワプロ2020

去年に引き続き アドベントカレンダー に参加しました！
[*去年のやつ*](https://qiita.com/bakuwarorin/items/714b6ba302a9f4c5b355)

## はじまり

>記事ネタを考えていたある日、別のチームが今日のコンディションを毎朝聞き取りしていることを知った。

![スクリーンショット 2020-12-01 19.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137649/312868bb-b315-f00d-c8c3-77fda616c8cb.png)

> リアクションを確認しないと人がわからないため、Slackステータスに反映すればパッと見でわかるようになるなと思った。
> （多くの人がやってくれればパワプロみたいになるなとも思った）

なので今回は特定のリアクションを押した時にステータスに反映させてみます。（2年連続Slackステータスネタ:rolling_eyes:）

## gas

スプレッドシートはシンプルに以下のようにしました。
ユーザーIDはなんとなく隠しておきました。

![スクリーンショット 2020-12-03 18.42.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137649/a0eca21d-0ac5-2c0b-05bc-6177777b3b58.png)

スプレッドシートの変更時にgasが実行されるようにトリガーを設定

![スクリーンショット 2020-12-03 19.04.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137649/94744844-6b62-206d-ad7c-ef8a300d039d.png)

実行されるものが↓で、シンプルにスプレッドシートの値を取得してステータス更新するだけです。

```javascript
const main = () => {
  
  // シートの最後の行の値を取得
  const sheet = SpreadsheetApp.getActiveSheet();
  const lastRow = sheet.getLastRow();
  
  // 絵文字
  const emoji = sheet.getRange("A" + lastRow).getValue();
  
  // ユーザー
  const rowB = sheet.getRange("B" + lastRow).getValue();
  const user = rowB.slice(2).slice(0, -1);  // 先頭二文字と末尾一文字を削除

  const TOKEN = SLACK_TOKEN;
  const USER_ID = user;

  const date = new Date();
  const unixTime = Math.floor(date.getTime() / 1000);

  const status = {
    "profile": {
      "status_emoji": emoji,
      "status_expiration": unixTime + 32400  // 9時間後
    }
  };

  const url = 'https://slack.com/api/users.profile.set';
  const options = {
    "method": 'POST',
    "headers": {
      "Authorization": "Bearer " + TOKEN,
      "X-Slack-User": USER_ID,
      "Content-Type": "application/json; charset=utf-8"
    },
    "payload": JSON.stringify(status)
  };

  UrlFetchApp.fetch(url, options);
};
```

Slackのトークンは機密っぽいのでプロジェクトのプロパティに設定しておきます。
※うまく動作しない不具合が発生しているようなので、その場合はベタ書きで:cry:
→ https://auto-worker.com/blog/?p=1708


![スクリーンショット 2020-12-02 12.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137649/a74a8f5d-6333-0da0-2038-fad3af1b16d8.png)

```javascript

const TOKEN = SLACK_TOKEN;
```

## Slack

ワークフローのトリガーは絵文字リアクションにします。
MAXが5個なのでちょうど良かったです。（休息不十分があるけど）

![スクリーンショット 2020-12-03 18.33.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137649/286ba122-aaa6-8b51-47f8-39b9b3bea851.png)

次のステップはスプレッドシートへの値の追加です。
変数を使って値を渡します。

![スクリーンショット 2020-12-03 18.39.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137649/a31bb665-4a3a-7ba4-12e7-36606b4e233d.png)

## お試し

あとはチャンネルでリアクションを押すだけです。

![スクリーンショット 2020-12-03 19.07.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137649/ca25529f-c26f-c4a5-8173-f2783f52f9d8.png)
![スクリーンショット 2020-12-03 19.07.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137649/fc77b27e-28eb-b243-b409-27482df985d7.png)

できた。

## 感想

### いまいちなところ

- ワークフローの変数に`リアクション押した日時`的なものが無いためスプレッドシートに記録するのは一手間必要そうな点
    - （gas実行時にスプレッドシートに時間を記入したら無限に実行されちゃうのかな？）
- ワークフローのみだと特定のチャンネルの全メッセージが対象になってしまうため、普通にリアクションしたい時にステータスが変更されちゃう点
    - **僕のtimesでのリアクションはお気をつけください！！！！**

### よかったところ

- ステータスの消滅?時間を9時間後にしてあるので、ステータスが消えたら退勤するって感じで使える点
    - 他人から見てもわかりやすいかも？（ちゃんと朝イチでやる前提）
- 使ってくれる人が増えるとSlackの画面が楽しそうな点
    - パワプロになる！！

### 改良したいところ

- リアクション探すの少しめんどくさいのでリアクション付きのメッセージを朝投稿されるようにしたい
- スプレッドシートに記録したのをみて健康管理したい

---

というわけでしばらく自分で使ってみたいと思います。おわり。