More than 1 year has passed since last update.

会社でSlackを使っているけども、勤怠連絡だけは未だにメールなんて会社は沢山あると思います。

ただでさえ具合が悪いのにいちいちメーラーを起動して、「ご迷惑おかけいたします。」や「申し訳ございません。」なんて書いていたら余計に具合が悪くなってしまいますので、ここはひとつSlackでコマンド風の発言をすると自動で定型文メールが送信されるようにしてみましょう。

今回の目標

Slackの任意のチャンネルで「kintai 寝坊 12時」と発言すると、それっぽい遅刻連絡メールが送信される。

Google App Scriptsの設定

Google App Scripts は、スクリプト実行者の Google Apps の各機能にアクセス可能な JavaScript ベースの Function as a Service のようなものです。

まずは適当にプロジェクトを作り、以下をコピペしましょう。

mail.gs
function send_kintai_mail(reason, eta) {
  var today = new Date();
  var today_str = (today.getMonth() + 1) + "/" + today.getDate()

  var to="all@example.com, boss@example.com"; // 送信先メールアドレス
  var from="me@example.com"; // 送信者メールアドレス
  var sender="田中 太朗"; // 送信者名
  var subject="勤怠 " + today_str + " 田中"; // 件名

  var sorry_texts = ["申し訳ございません。", "ご迷惑おかけいたします。"]
  var sorry = sorry_texts[Math.floor(Math.random() * sorry_texts.length)];

  var body="お疲れ様です。\n"
    + "\n"
    + reason + "のため、\n"
    + eta + "に出社させて頂きます。\n"
    + sorry + "\n"
    + "\n"
    + "以上、よろしくお願いいたします。";

  GmailApp.sendEmail(to, subject, body, {from: from, name: sender});
}

さて、これで遅刻メールを送る関数ができてしまいました。
この状態で一旦メール送信をテストしてみたいので、 to の部分を自分のアドレスにでも置き換えてから、同じファイルの中に次のような関数を追加してみましょう。

mail.gs
function doGet() {
  send_kintai_mail("寝坊", "12時");
}

プロジェクトを一旦保存してから、 [実行] -> [doGet] をすると、メールボックス内にメールが届くはずです。
特に問題がなければ次はSlackと連動させるために、このプロジェクトをウェブアプリケーションとして公開しましょう。

[公開] -> [ウェブアプリケーションとして導入] から、このプロジェクトの関数を実行できるHTTPSエンドポイントを作成することができます。
[アプリケーションにアクセスできるユーザー] を [全員(匿名ユーザーも含む)] にした上で、[導入]を押すと、このプロジェクト内にアクセス可能な HTTPSエンドポイントが発行されます。

さて、このエンドポイントは、GET でアクセスされると doGet が呼ばれ、 POST でアクセスされると doPost が呼ばれます。Slack の Outgoing WebHooks は POST でリクエストが行われるので、リクエストを受け取れるように doPost 関数を作成します。

mail.gs
function doPost(e) {
  // テスト用のダミーパラメータです、実際にこのような内容が引数に渡ってきます。
  if (!e) {
    e = {
      parameter : {
        token : 'token',
        team_id : "T0001",
        channel_id : "C12345678910",
        channel_name : "test",
        timestamp : "1355517523.000005",
        user_id : "U2147483697",
        user_name : "Steve",
        text : "kintai 寝坊 12時",
        trigger_word : "kintai "
      }
    };
  };

  if (e['parameter']['text'].match(/^kintai\s(\w+)\s(\w+)$/)) {
    params = e['parameter']['text'].match(/^kintai\s(\w+)\s(\w+)$/);
    send_kintai_mail(params[1], params[2]);
  };
}

Slackの設定(Outgoing WebHooks)

Outgoing WebHooks を作成しましょう。

項目 設定値 備考
Channel このコマンドを実行したいチャンネル
Trigger Word kintai 末尾に半角スペースを1つ
URL Google App Script のウェブアプリケーションURL
Token 任意
適当

この状態で保存をして、Channel に設定したチャンネル内で「kintai 遅刻 12時」と発言すると、自動的にメールが飛ぶはずです。よかったですね。

おまけ: いたずら防止

この状態だと、そのチャンネル内で誰がその発言をしてもあなたの遅刻連絡としてメールが飛んでしまいます。

いたずら防止のために自分しかいないプライベートチャンネル内に設置する、といった方策もありますが、Slack の POSTパラメータ内に含まれている user_id を検証に用いるのが一番よいでしょう。

自身のユーザIDを取得して、それを doPost の起動条件に組み込んでしまえば大丈夫です。

こんな感じ
  if (e['parameter']['user_id'] == 'U01234567'
    && e['parameter']['text'].match(/^kintai\s(\w+)\s(\w+)$/)) {

    params = e['parameter']['text'].match(/^kintai\s(\w+)\s(\w+)$/);
    send_kintai_mail(params[1], params[2]);
  }

おわりに

HTTPアクセスでの実行ができたり、Google Apps の各機能に手軽にアクセスできる Google App Scripts は個人ユースの範囲であれば最強のFaaSではないかなと思います。AWS Lambda も流行ってはいますが、Google App Scripts ほど手軽ではないので、身近で小さな領域から活用してみてはいかがでしょうか。