実用GAS(自分の)CASE5:フォームを利用して日報を書いてもらい必要な部分のみSlackに反映させる

利用用途

日報を書いてもらいつつ、残したい。土日も業務があるので、通知があればそれを元にSlack見ればフォームまでいかなくても中身がみれるようにした。必要な部分のみ と書いている理由としてはこのスクリプトを元にフォームで毎日の検温や体調報告のフォームを作り 体調報告のフォームではslackには名前だけ反映させるようにした。CASE6で書く

1,slackへ投稿するのに必要なコード

コード

function sendToSlack(fallback, fields, channel) {
 const url = "ここにwebhookのURL"
 const data = {
   "channel" : channel,
   "username" : "日報更新されたよ Bot",  // 1: bot 名
   "attachments" : [{
     "fallback" : fallback,
     "text" : "<!subteam^AAAAAAA|testgroup>日報です。",
     "fields": fields,
     "color": "good",  // 3: 左線の色
   }],
   "icon_emoji" : ":envelope_with_arrow:"  // 2: アイコン画像
 };
 const payload = JSON.stringify(data);
 const options = {
   "method" : "POST",
   "contentType" : "application/json",
   "payload" : payload,
   "muteHttpExceptions": true,
 };
 const response = UrlFetchApp.fetch(url, options);
 Logger.log(response)
}

画像

画像1

①webhool のURL ②slackのグループID(不要ならいらない)③グループ名(不要ならいらないまたは@個人でもOK)

⑧行目だけ書き出すとこんな感じ

"text" : "<!subteam^AAAAAAAAA|testgroup>日報です。",

この取得方法についてはURL参照

2,slackに投稿するコード


function responseToText(itemResponse) {
 switch (itemResponse.getItem().getType()) {
   case FormApp.ItemType.CHECKBOX:
     return itemResponse.getResponse().join("\n");
     break;
   case FormApp.ItemType.GRID:
     const gridResponses = itemResponse.getResponse();
     return itemResponse.getItem().asGridItem().getRows().map(function(rowName, index) {
       Logger.log(rowName);
       return rowName + ": " + gridResponses[index];
     }).join("\n");
     break;
   case FormApp.ItemType.CHECKBOX_GRID:
     const checkboxGridResponses = itemResponse.getResponse()
     return itemResponse.getItem().asCheckboxGridItem().getRows().map(function(rowName, index) {
       Logger.log(rowName);
       return rowName + ": " + checkboxGridResponses[index];
     }).join("\n");
     break;
   default:
     return itemResponse.getResponse();
 }
}

function onFormSubmit(e){
 const itemResponses = e.response.getItemResponses();

 const fallback = itemResponses.map(function(itemResponse) {
   return itemResponse.getItem().getTitle() + ": " + itemResponse.getResponse();
 }).join("\n");

 const fields = itemResponses.map(function(itemResponse) {
   const value = responseToText(itemResponse);
   return {
     "title": itemResponse.getItem().getTitle(),
     "value": value,
     "short": value.length < 30,  // 左右2列で表示
   }
 });

 sendToSlack(fallback, fields, "#通知したいチャンネル名");
}

今見るともっとシンプルに出来る気がする。。。

3、slackに投稿される内容


画像2




この記事が気に入ったらサポートをしてみませんか?