GASとslackでヘルプデスクフォームを作った話(Googleフォーム版 コード編)

GASとslackでヘルプデスクフォームを作った話(Googleフォーム版 準備編)の続きです。

コード全体

コメントアウトで説明を入れています。

function onFormSubmit(e){
  FormApp.getActiveForm() //フォームを取得
  
  //スクリプトのプロパティからトークンやIDを取得
  var bot_token = PropertiesService.getScriptProperties().getProperty('bot_token') //slackアプリ OAuth & PermissionsのBot User OAuth Access Token
  var channel_id = PropertiesService.getScriptProperties().getProperty('channel_id') //#helpdeskのチャンネルID
  var gss_id = PropertiesService.getScriptProperties().getProperty('gss_id') //スプレッドシートのID
  var sup_mem1 = PropertiesService.getScriptProperties().getProperty('sup_mem1') //サポートメンバー1のslackUserID
  //メンバー数に応じて、必要があれば追加してください。(スクリプトプロパティも)
  //var sup_mem2 = PropertiesService.getScriptProperties().getProperty('sup_mem2'); //サポートメンバー2のslackUserID
  
  var time = e.response.getTimestamp() //投稿日時をフォームから取得
  
  var email = e.response.getRespondentEmail() //メールアドレスの回答を取得
  var form_items = e.response.getItemResponses() // 質問内容と回答が格納されています。
  var q1 = form_items[0].getResponse() // 氏名の回答を取得
  var q2 = form_items[1].getResponse() // 緊急度の回答を取得
  var q3 = form_items[2].getResponse() // 詳細の回答を取得
  
  //メールアドレスからslackUserIDを取得
  var user_id = findUserByEmails(email,bot_token)
  
  //スプレッドシートへ記録
  var sheet_name = "helplist" //スプレッドシートのシート名
  var spread_sheet = SpreadsheetApp.openById(gss_id)
  var no = spread_sheet.getSheetByName(sheet_name).getLastRow() //最終行から管理Noを決定
  spread_sheet.getSheetByName(sheet_name).appendRow( //最終行へ記入
    [no,time,email,user_id,q1,q2,q3]
  )
  
  //送信者のslackユーザーを招待、メンションの準備をする。居ない場合はメールアドレス
  if (user_id == "null"){
    var applicant = email
    } else {
      var applicant = "<@" + user_id + ">" //送信者へメンションする書式
      var created_invite = createInvite(user_id,bot_token,channel_id) //チャンネルへ招待
      var response = UrlFetchApp.fetch("https://slack.com/api/conversations.invite", created_invite);
    }
  
  //チャンネルへ投稿
  var message_data = "<@" + sup_mem1 + ">" // サポートメンバー増があれば必要に応じて追加<@" + sup_mem2 + ">"
  + "\n" + applicant + " から問い合わせがありました。"
  + "\n\n*No*\n" + no
  + "\n\n*氏名*\n" + q1
  + "\n\n*緊急度*\n" + q2
  + "\n\n*問い合わせ内容*\n" + q3
  var created_message = createMessage(message_data,bot_token,channel_id)
  var response = UrlFetchApp.fetch("https://slack.com/api/chat.postMessage", created_message);
  
}
//---------------------------------------メールアドレスからslackIDを取得
function findUserByEmails(email,bot_token){
  var url="https://slack.com/api/users.lookupByEmail"  
  var payload = {
    "token" : bot_token,
    "email" : email
  }
  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)
  
  if (json_data["ok"]){
    var user_id = String(json_data["user"]["id"])
    } else {
      var user_id = "null"
      }
  
  return user_id
}
//---------------------------------------postMessage作成
function createMessage(message_data,bot_token,channel_id){
  var payload = {
    "token" : bot_token,
    "channel" : channel_id,
    "text" : message_data
  }
  var options = {
    "method" : "POST",
    "payload" : payload,
    "headers": {
      "contentType": "x-www-form-urlencoded",
    }
  }
  return options;
}
//---------------------------------------invite作成
function createInvite(user_id,bot_token,channel_id){
  var payload = {
    "token" : bot_token,
    "channel" : channel_id,
    "users" : user_id
  }
  var options = {
    "method" : "POST",
    "payload" : payload,
    "headers": {
      "contentType": "x-www-form-urlencoded",
    }
  }
  return options;
}

スクリプトプロパティの設定

ファイル」→「プロジェクトプロパティ

f:id:simple-josys:20200429221414p:plain


スクリプトのプロパティ」に準備編で作成したトークンやIDをセットします。


sup_mem1
 サポートメンバーのslackユーザーID(メンション通知用)
 ※ユーザーIDの調べ方は別途ググってくださいm(_ _)m
gss_id
 スプレッドシートのID
bot_token
 slackアプリのOAuth & Permissions → Bot User OAuth Access Token
channel_id
 slackのヘルプデスク用チャンネルのID

f:id:simple-josys:20200429222508p:plain:w500

権限のチェック

GASの権限をチェックしたいので、一度実行します。

f:id:simple-josys:20200429233810p:plain:w500


この画面が出た場合、権限が不足している場合があるので許可します。
フォームからpostされるはずのデータが無いので、許可後は必ずエラーが出ます。
f:id:simple-josys:20200429225326p:plain

実行テスト

slackユーザーが居る場合(メンション)

投稿内容

f:id:simple-josys:20200429234052p:plain:w300


slack通知画面

f:id:simple-josys:20200429235319p:plain

slackユーザーが居ない場合(メールアドレス表記)

f:id:simple-josys:20200429234459p:plain:w300


slack通知画面

f:id:simple-josys:20200429235610p:plain

終わりに

GASもslackアプリもまだまだ初心者なので、解釈が間違っている部分や効率化できる部分があると思います。
ここが間違っている、こうした方がもっと良い、といった点があればコメントいただけると嬉しいです!

修正

2020/10/16
channelsAPIが廃止予定のため、channels.invite→conversations.inviteへ変更

2021/8/11
function findUserByEmailsの手法を変更(users.list API → users.lookupByEmail API)