メールアドレスでslackのユーザーIDを取得するGAS

約1年ぶりの更新です(;^ω^)
滞ってるにもかかわらず、毎日10人前後に見ていただけているようで恐縮です!
ありがとうございます!!

この記事はGASとslackでヘルプデスクフォームを作った話(Googleフォーム版 準備編)に関連した記事です。

メールアドレスを元にユーザー情報を取得する便利なAPIを見つけたのでご紹介です!

コード全体

bot作成やslackとGASの連携等は準備編コード編をご参照ください。

//検索したいメールアドレスと、botトークンを渡す
function findUserByEmails(email,bot_token){

  var url="https://slack.com/api/users.lookupByEmail" //APIのURL
  var payload = {
    "token" : bot_token, //botトークン ※記事上部の別記事参照
    "email" : email //検索したいメールアドレス
  }
  var options = {
    "method" : "GET",
    "payload" : payload,
    "headers": {
      "contentType": "x-www-form-urlencoded",
    }
  }
  
  var json_data = UrlFetchApp.fetch(url, options); //APIリクエスト実行と結果の格納
  json_data = JSON.parse(json_data) //結果はJSONデータで返されるのでデコード
  
  if (json_data["ok"]){ //boolean型でtrue or falseが格納されています
    var user_id = String(json_data["user"]["id"]) //trueの場合返答されたデータからユーザーIDを抽出
    } else {
      var user_id = "null" //falseの場合null(文字列)を格納
      }

  return user_id //ユーザーID(or null)を返却
}

使用API

users.lookupByEmail
メールアドレスを元にユーザー情報をリクエストするAPIです。

メールアドレスの以外にも

  • 表示名
  • 氏名
  • アイコンのURL
  • 役割・担当

等々

プロフィールで閲覧できるものは一通り取得できるようです。
(APIのページの「Typical success response」に詳細が書いてあります)

今まで使っていた手法

  1. users.listを使って、slack上のユーザーを全て取得
  2. 1件ずつメールアドレスが一致するかチェック
  3. 一致する場合ユーザーIDを格納する
  4. 一致しない場合null(文字列)を返す

いつからかユーザーが存在するにも関わらずユーザーIDが見つけられないというトラブルが起き始めたので対策を調べていたところ、users.lookupByEmailを見つけました。

素人考えですが、users.listで取得した結果を見ると4000文字程度あったのでどこかで文字数上限に引っかかったのかなーと考えてます。

今まで使っていた手法のコード(供養)

function findUserByEmails(email,bot_token){
  var url="https://slack.com/api/users.list"
  var payload = {
    "token" : bot_token,
  }
  var options = {
    "method" : "GET",
    "payload" : payload,
    "headers": {
      "contentType": "x-www-form-urlencoded",
    }
  }
  var json_data = UrlFetchApp.fetch(url, options);
  json_data = JSON.parse(json_data)
  for(i in json_data["members"]){
    if(String(json_data["members"][i]["profile"]["email"])==email){
      var user_id =String(json_data["members"][i]["id"])
      }
  }
  
  if(user_id == null){
    user_id = "null"
  }

  return user_id
}