qualva の回答を slack に自動通知する方法

qualvaでCVした回答をslackに自動通知したいと思って公式のドキュメントを調べたのですが、slackとの連携はサポートしておらず...

https://qualva.com/

なんとか出来ないかと試行錯誤したところ、
下記の方法でうまく行ったので自分用のメモも兼ねてまとめておきます。

# 全体の流れ
1. qualvaで回答をGメールに自動通知
1. Gメールのフィルタ機能で特定のラベルを付与
1. [GAS（Google App Script）](https://workspace.google.co.jp/intl/ja/products/apps-script/)で通知メールを取得しslackに通知

最後に、GAS上で一定時間ごとに自動処理するようにすれば完成

# qualvaで回答をGメールに自動通知するように設定
qualvaの管理画面にて、メール通知先を設定します。
![qualva.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918480/77bf688e-c4d0-4453-8ac0-59ba3ef91118.jpeg)

最終的にslackへ通知したいシナリオを選択し、
「設定」 → 「メール通知」 と進み、「レポート配信」欄にGメールを記入します。
※複数のアドレスに通知したい場合は、「,」で区切ると設定できるようです。

これでqualva側の設定は完了。

# Gメールのフィルタ機能で特定のラベルを付与

最終的にGASで通知プログラムを組むのですが、
そのときにqualvaのデータかどうかを判別しやすいようにあらかじめ特定のラベルを付与しておくのがおすすめです。

まず、Gメール側で新しいラベルを作成します。

![スクリーンショット 2021-09-21 21.42.23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918480/479fede2-091f-7049-b27f-d5c8c38251b5.jpeg)

![スクリーンショット 2021-09-21 21.44.27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918480/c6bdfa29-bfb6-9208-dc01-f65325fd0047.jpeg)

今回は「qualva」という名前でラベルを作成しました。

![スクリーンショット 2021-09-21 21.45.29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918480/c4e64127-5c55-7ddf-1af5-74d108d22b40.jpeg)

「フィルタとブロック中のアドレス」タブに移動し、
「新しいフィルタを作成」します。

![スクリーンショット 2021-09-21 21.48.27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918480/dc013c7c-2012-eaf6-7fe3-cb78f4c5cfc5.jpeg)

通知メールの送信元は no-reply@qualva.io になるので、
From欄に設定し「フィルタを作成」をクリック。

![スクリーンショット 2021-09-21 21.50.03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918480/af620d2a-ae69-9d43-43d5-db32611b629b.jpeg)

+ 受信トレイにはいれない
+ 未読のままにする（=既読にする、にチェックをいれない）
+ 先に作成したラベル「qualva」をつける

の条件でフィルタを作成してください。

※厳密には既読にしてしまってもいいです。
ただし、未読のままラベルを付けるようにするとGASで通知処理をするときに
**未読であれば通知する、既読であれば通知済みのため除外**、と処理を分岐させることができるのでおすすめ。

これでGメール側の準備が整いました。

# GASで通知メールを取得しslackに通知

最後に、実際に通知するプログラムを記述していきます。

・・・がその前に、slackへの通知をしたことがない人向けに「slackへの通知」ってどうやってやるのかがわからない人は下記を参照してください。

## slackへの通知するための基本知識（ざっとまとめ）

実際に指定のチャンネルへメッセージを投稿させるには、slackのIncoming Webhookというものを使います。

具体的には以下の流れ。

1. slackでアプリを作成
1. Incoming Webhookを有効化
1. Incoming Webhookを設定
1. 発行されたURLを用いて、適宜POSTする

https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8

https://qiita.com/kshibata101/items/0e13c420080a993c5d16

Incoming Webhookの設定方法については記事を参照していただいた上で、
どうPOSTするのかはコードを見て頂いたほうが早いと思います。

## GASで通知するプログラムを書いていく

### スクリプトを用意

qualvaから通知メールを受け取るGメールのアカウントで、適当なスプレッドシートを作成します。
名前・中身はなんでもいいです。
（スプレッドシート本体は使いません）

![スクリーンショット 2021-09-21 22.15.02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918480/aeb395e7-1ac7-61ac-ca70-603bd1f8f501.jpeg)

メニューバー「ツール」の中にある「スクリプトエディタ」を選択。

※複数のGoogleアカウントでログインをしているときは、スクリプトエディタが開けない場合があります。
そのときは、使いたいアカウント以外をすべてログアウトすると次に進めます。

エディタ内に以下を記述。

```JavaScript
function myFunction()
{
  //slack側で用意したIncoming WebhookのURL
  var webhook = 'XXXXXXXXX';

  //ラベル指定で、未読メールを取得
  var label = "qualva";
  var start = 0;
  var max = 500;
  var threads = GmailApp.search('label:' + label + ' is:unread', start, max);

  //取得したスレッドごとに処理
  threads.forEach(function(thread){
    //スレッド内のメールを取得
    var messages = thread.getMessages();

    //取得したメールごとに処理
    messages.forEach(function(message) {
      //本文取得
      var body = message.getPlainBody();

      //本文そのまま送信するのではなく、手を加えたいときはここで処理

      //jsonデータ作成
      var jsonData = {
        'text': body
      };
      var payload = JSON.stringify(jsonData);

      var options = {
        "method" : "post",
        "contentType" : "application/json",
        "payload" : payload
      };

      //送信
      UrlFetchApp.fetch(webhook, options);
    });

    //スレッドを既読にする
    thread.markRead();
  });
}
```

最後にスレッドを既読にしておくことで、重複送信が起こらないようにしています。

### テストしたいとき

![スクリーンショット 2021-09-21 22.31.07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918480/2860e948-231f-8876-f0d4-edd107e0018e.jpeg)

エディタ上にある「実行」ボタンをクリックすると処理されます。

![スクリーンショット 2021-09-21 22.34.49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918480/aa2cd06b-a51a-f3cf-0f5a-0627f1edb5f7.jpeg)

※初めて実行する際にアクセス権限の確認が必要

## 最後に定期実行するように設定

このままだと、わざわざGAS側で「実行」を押さないとslackへ通知がされないので、
最後に定期実行するように設定しておく。

![スクリーンショット 2021-09-21 22.39.15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918480/b64f7db5-0702-eda0-ed5a-0c6a8cd970e4.jpeg)

サイドメニューの「トリガー」 → 「トリガーを追加」と進みます。

![スクリーンショット 2021-09-21 22.42.04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918480/d0d7771b-5441-7093-0cfe-a8efbe73d76b.jpeg)

実行する関数を正しく設定した上で、イベントのソースを**「時間主導型」**にし、どのくらいの間隔で実行するかを設定します。

今回は30分ごとに実行するようにしました。

# まとめ

qualvaが直接slackと連携してくれないので困りましたが、
GメールとGASを経由することで、自動通知してくれるようになりました。

もしうまく行かないなどあれば、コメントなどでお知らせいただければ幸いです。