LoginSignup
4
1

More than 1 year has passed since last update.

GASでSlackAPIを使ってDM送信してみた

Last updated at Posted at 2021-12-01

この記事はN・S高等学校 (1) Advent Calendar 2021 の2日目の記事です。

はじめまして。
学校法人角川ドワンゴ学園のプログラミングスクールN Code Laboのnaoki_sakanoといいます。
この記事を書いているときはN Code Labo横浜教室の教室長を担当しています。

N Code Labo(以下、Nラボ)が学校法人角川ドワンゴ学園が運営する小〜高校生向けのプログラミングスクールで、新宿・秋葉原・横浜・梅田(New!!)に教室があります。
また、Zoomを用いたネットコースもあり、Unityをはじめとした実践的なプログラミングのコンテンツを提供しています。

今回は、Nラボのコンテンツのお話ではなく(ダイレクトマーケティングになっちゃうし)、普段業務で使っているSlackのAPIを用いたGASスクリプトの紹介をします。

GASでSlackに定期的にDMを送るスクリプト

やっていることはGoogleスプレッドシートに記載のメールアドレスの方にSlackDMを送るスクリプトです。

ソースコードはこちらです。
https://github.com/NCodeLabo/Slack_Send_DirectMessage

開発の経緯

実は、これに類するものはすでに存在しており、S高の吉村校長が作ってくださっています。
https://github.com/progedu/slack-dm-sender
機能としてはこれで十分なのですが、こちらはTypeScript製となっています。
Nラボ内での用途として、毎週定期実行したいという欲求があり、スプレッドシートも扱うので、
それならGASで作った方が楽じゃん、というノリでGASで開発をはじめました。

余談:全然関係ないけど、興味沸いたのでTypeScriptはじめました。何か年内に完成したら記事書きます。

大まかな機能

実装した機能は
- メールアドレスからSlackのユーザーIDを返す
- ユーザーIDからメンション用の名前を返す
- 複数にグループDMする場合、グループDMのIDを返す
- 取得したユーザーID、グループDMのIDに対して、指定したメッセージを送信する
の4つです。

これらを作るために、はじめてTypeScriptを読みました。

DMを送るとき送信者を2種類から選択することになります。
1. 送信者を自分にする
2. 送信者をbotにする

今回はやりとりの簡易化を目的としていますので送信者を自分にする方法にしています。

Slackで個人を特定する方法

twitterでもSlackでも @naoki_sakano と書くことでメンションを飛ばすことができます。
メンション自体は記法さえ守ればつけることはできますが、この書き方でDMを開くことは出来ません。
SlackAPIを用いてDMを送る場合、普段見ることが出来ないUserIDを取得する必要があります。

ユーザーIDの例:"W012A3CDE"

UserIDの取得には名前や表示名を用いることが出来ますが、いずれもユーザーごとに変更が出来てしまいますので、安定して利用することができません。

そのため、基本的にユーザーが自由に変更することの出来ないメールアドレスを用いて検索することにします。
メールアドレスが一番安全なんです。はい。

UserIDを取得する

メールアドレスからユーザーIDを取得するためにusers.lookupByEmailを使います。

lookupByEmail
function lookupByEmail(email) {
    let id = "";
    const options = {
        "method": "GET",
        "contentType": "application/x-www-form-urlencoded",
        "payload": {
            "token": TOKEN,
            "email": email
        }
    };
    const url = 'https://slack.com/api/users.lookupByEmail';
    const response = UrlFetchApp.fetch(url, options);
    const res = JSON.parse(response);

    try {
        id = res.user.id
    } catch (e) {
        console.log("lookupByEmailでエラーが発生しました\n\【id】" + id + "\n【email】" + email + "\n【エラー文】" + e);
    }
    return id;
}

グループDM用のIDを取得する

3人以上のグループDMを送る場合、グループDM用IDが必要になります。
そのためconversations.openを使って、グループDMのIDを取得します。

conversationsOpen
function conversationsOpen(users) {
    let id = "";
    const options = {
        "method": "GET",
        "contentType": "application/x-www-form-urlencoded",
        "payload": {
            "token": TOKEN,
            "users": users
        }
    };
    const url = 'https://slack.com/api/conversations.open';
    const response = UrlFetchApp.fetch(url, options);
    const res = JSON.parse(response);

    try {
        id = res.channel.id;
    } catch (e) {
        console.log("conversationsOpenでエラーが発生しました\n\【id】" + id + "\n【users】" + users + "\n【エラー文】" + e);

    }
    return id;
}

使っててどうか

毎週必ず定文で送る業務が基本的に気にする必要がなくなりました。
毎週Nラボの講師の先生方に今週の授業予定を共有しているのに使っているのですが、これを使い始めたおかげで追加・削除漏れなどにも気がつけるようになりました。
これをちょっといじると、例えばフォーム入力が終わっていないユーザーにのみDM送信しつづけたり、定期的に送るものを自動化することができるようになります。
GASはトリガーの設定が容易で、毎週月曜日のAM9時に送信なんてことも楽に出来ます。

Slackを用いた定期連絡の必要がある方など、よかったら使ってあげてください。

最後に宣伝を。。。

N Code Laboは小〜高校生向けのプログラミングスクールで、多分子供向けプログラミングスクールでは珍しいオブジェクト指向も"しっかり"学ぶことができるプログラミングスクールです。

通学する教室では無料体験授業を、ネットコースでは水曜と土曜に説明会を実施していますので、よかったら一度覗いてみてください。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1