akms道東

ITイベント,勉強会への参加記録や趣味のことが書いてあるブログです.

SpreadSheet から GAS を利用して Slack API で通知してみた

はじめに

こうすればSpreadSheetからSlackに通知ができたという、個人的な備忘録です。

SlackのAPIを利用する準備などはとくに書きません。

また個人的な忘備録なので、コピペですぐに動くものではありません。

GAS側でやったこと

SpreadSheetでSlackのユーザー名一覧を作成している状態で、GASでそれを取得して、文章も組み立てて通知という流れだった。

特定の何かを利用している人に対して通知したいなどがあっても先にシートを作成しておくことでこれを利用して対応できた。

GASのコード

  • 通知したいユーザーの情報があるスプレッドシートを引数に渡して、ユーザーを取得する
// ssはスプレッドシートの意味、引数にシートを受け取る
function getUsers(ss) {
  // getRangeの引数にSlackのユーザー名が入っているセルの範囲を指定する。例えば "A2:A"
  var r = ss.getRange("").getValues();
  // 値は2次元配列なのでmapでループを回して、popで値を取り出す
  var nr = r.map(function(x){
    return x.pop();
  });
  // 空の値を除くために最後にfilter(Boolean)を実施
  return nr.filter(Boolean);
}
  • ユーザー情報などを利用して通知に必要なリクエストを組み立てて通知する
function myFunction() {
  var ss = SpreadsheetApp.openByUrl("ここにユーザー情報のあるシートの共有リンクを入れる").getActiveSheet()
  var users = getUsers(ss);
  // channelはユーザー名を入れるので空にしておく
  var payload = {
    "token" : "YOUR_SLACK_API_TOKEN"
    "channel" : "",
    "text": "通知したいメッセージ"
  }
  var options = {
    "method" : "POST",
    "payload" : payload
  }
  // 通知したいユーザーの数だけループを回す
  for(i=0;i<users.length;i++){
    // ここで宛先を作る
    payload.channel = "@" + users[i];
    // メッセージの送信なので今回はchat.postMessageを利用した
    var response = UrlFetchApp.fetch("https://slack.com/api/chat.postMessage", options);
    // 誰に送ったか、送信に成功したか、わかるようにユーザー名と実行結果をログに出す
    Logger.log(users[i]);
    Logger.log(response);
  }
}

ハマったところ

  • Slackの個人宛の通知をしたい場合、スクリーンネームなどアプリではメンションが飛ぶ名前ではなく、username を調べて利用する必要がある
    • 上記が正しくない場合、通知が失敗するので、Slackの管理者などに username がわかるユーザーの一覧を事前に出力してもらう必要がある

おわりに

簡単にGASを利用したSpreadSheetからのSlackへの通知についてまとめた。

もう少しきれいな実装などもあると思うが、自分のGAS知識では現状こういった実装になった。