実用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)
}
画像
①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に投稿される内容
この記事が気に入ったらサポートをしてみませんか?