無料版Slackの90日前の履歴が見れなくなる問題をGoogleスプレッドシートに移動することで解決

# 背景

2022年9月より、Slack初の有料版（プロプラン）の値上げと、フリープランはメッセージ履歴が90日間に制限されます。
月額料金はこれまでの1ユーザーあたり960円から1,050円に値上げされるみたいです。
問題は、後者のフリープランの制限。これまでフリープランでは、メッセージ数10,000件、ストレージ容量5GBという制限でしたが、今後は**過去90日間のメッセージ履歴とファイルストレージを無制限**に変更するみたいです。

# 対策

90日が経過しても、有料プランへアップグレードすれば、全履歴にアクセス可能となるそうですが、**Googleスプレッドシートにメッセージの履歴を移せば解決できそうなので、やってみました。**（友人がやっていたので、挑戦してみました。）

# ツール

- Googleスプレッドシート
- Slack（一般ユーザーでOK）

# YouTubeで解説

前編：https://youtu.be/jsJe1djPzw8
後編：https://youtu.be/pPz0yafO8UE

前編では、Webhookを使って動かすGoogleスプレッドシートに移動するところまで。
後編では、よくある質問と、発展系として今後はノーコードで（スプレッドシートだけで）管理する方法まで解説しています。

# 手順

## 1. slack側の設定

「設定と管理」の「アプリを管理する」から「Outgoing Webhook」を検索して追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/040a70ba-22ab-be78-0bcc-707ae169fe2a.png)
## 2. Googleスプレッドシート側の設定
「拡張機能」から「Apps Script」を開いて、下記コードをコピペします。

```コード.js
function doPost(e) {
    const SHEET = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('**シート名**')
    const TOKEN = '**Outgoing Webhook のトークン**'
    if (TOKEN == e.parameter.token){
        const DATE = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm')
        const USER = e.parameter.user_name
        const TEXT = e.parameter.text
        const DATA = [DATE, USER, TEXT]
        SHEET.appendRow(DATA)
    }
    return
}
```

## 3. デプロイ

エディタの中の「デプロイ」から「新しいデプロイ」で、ウェブアプリのURL発行します。
発行されたURLは、Outgoing Webhookの設定に追加してください。

## 4. ノーコードで（スプレッドシートだけで）管理

新しく、「スラックのトークン」というシートをGoogleスプレッドシートに追加してください。
それから、A列をチャンネル名、B列をトークンにして、それぞれ割り振られているチャンネル名とトークンをご記入してください。
![スクリーンショット 2022-10-23 18.59.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/ed4172b3-8a4d-c2e5-7c85-ee1b5cc51bdf.png)

そうしましたら、下記のプログラムに変更します。

```コード.js
function doPost(e) {
  const SHEET = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1')
  const SHEET_TOKEN = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('スラックのトークン')
  const SHEET_TOKEN_VALUES = SHEET_TOKEN.getDataRange().getValues()
  console.log(SHEET_TOKEN_VALUES)
  
  for (i in SHEET_TOKEN_VALUES) {
    if (i == 0) {
      continue;
    }
    if (SHEET_TOKEN_VALUES[i][1] == e.parameter.token){
      const DATE = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm')
      const USER = e.parameter.user_name
      const TEXT = e.parameter.text
      const CHANNEL = SHEET_TOKEN_VALUES[i][0]
      const DATA = [DATE, USER, TEXT, CHANNEL]
      SHEET.appendRow(DATA)
    }
  }
}
```

プログラムを書き換えたら、もう一度スクリプトエディタからデプロイし直します。
「デプロイ」から「デプロイを管理」を選択して、鉛筆マークをクリックして「新バージョン」としてデプロイしてください。

わからなければ、YouTube動画の後編で解説もしていますので、ご参考にしてください。
https://youtu.be/pPz0yafO8UE

これで、今後Webhookを発行した後は、スプレッドシートの「スラックのトークン」というシートのA列にチャンネル名、B列にトークンを追加するだけです。

いかがでしたでしょうか？
Webhookを発行したら、保存するのをお忘れずに！

# おまけ(LINEに送信)

LINEにもメッセージ通知を送信する関数を、おまけとして。

https://notify-bot.line.me/

```line.js
function sendToLine(message){
  const LINE_NORTIFY_TOKEN = "**発行したトークン**"

  const OPTIONS =
   {
     "method"  : "post",
     "headers" : {"Authorization" : "Bearer "+ LINE_NORTIFY_TOKEN},
     "payload" : "message=" + message
   };
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify", OPTIONS);
}
```

# 参考文献

[Slack初の値上げ。月960円→1050円に](https://www.watch.impress.co.jp/docs/news/1425656.html)
[Slackに投稿したメッセージを自動でスプレッドシートに書き込む方法をまとめました](https://moniblo.com/slack-to-spreadsheet)
[無料版Slackが9/1より90日前投稿が見れなくなるので、メッセージ保存ツールを個人開発してみた](https://qiita.com/Tyamamoto1007/items/bddff523e86016696ad2)