Last active
March 18, 2019 12:54
-
-
Save AWtnb/e5a8b6303170a7f52f6e5566cbb7810a to your computer and use it in GitHub Desktop.
manage exercise with slack and google sheet
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
今日のトレーニングを slack で確認してカレンダーに登録 | |
*/ | |
/////////////////////////////////////////////////////// | |
// グローバル変数 | |
/////////////////////////////////////////////////////// | |
// シート | |
var SHEET_ID = PropertiesService.getScriptProperties().getProperty("SHEET_ID"); | |
var sht = SpreadsheetApp.openById(SHEET_ID).getSheets(); | |
// token | |
var WEBHOOK_URL = PropertiesService.getScriptProperties().getProperty("WEBHOOK_URL"); | |
// カレンダー | |
var CALENDAR_ID = PropertiesService.getScriptProperties().getProperty("CALENDAR_ID"); | |
var clndr = CalendarApp.getCalendarById(CALENDAR_ID); | |
/////////////////////////////////////////////////////// | |
// slack に投稿する関数 | |
/////////////////////////////////////////////////////// | |
// slack にメッセージを投稿する関数 | |
function send2slack(text, block, webhook_url) { | |
var payload = { | |
"channel": "#bots", | |
"text": text, | |
"blocks": block | |
} | |
var options = { | |
"method" : "POST", | |
"payload": JSON.stringify(payload) | |
} | |
UrlFetchApp.fetch(webhook_url, options); | |
} | |
// block の選択肢を作成する関数 | |
function makeOption (opt) { | |
return { | |
"text": { | |
"type": "plain_text", | |
"text": opt | |
}, | |
"value": opt | |
} | |
} | |
// block のボタンを作成する関数 | |
function makeButton (btn, val) { | |
return { | |
"type": "button", | |
"text": { | |
"type": "plain_text", | |
"text": btn, | |
"emoji": true | |
}, | |
"value": val | |
} | |
} | |
/////////////////////////////////////////////////////// | |
// interactive message | |
/////////////////////////////////////////////////////// | |
// シートからメニューを取得して slack に投稿する関数 | |
function askOnSlack () { | |
// メニュー作成 | |
var maxRow = sht[0].getLastRow(); | |
var optArray = []; | |
for (r=1;r<=maxRow;r++) { | |
var menu = sht[0].getRange(r, 1).getValue(); | |
optArray.push(makeOption(menu)); | |
} | |
optArray.push(makeOption("今日は休み")); | |
// slack に投稿 | |
var text = "今日のメニューは?"; | |
var block = [ | |
{ | |
"type": "section", | |
"text": { | |
"type": "mrkdwn", | |
"text": text | |
}, | |
"accessory": { | |
"type": "static_select", | |
"placeholder": { | |
"type": "plain_text", | |
"text": "メニュー" | |
}, | |
"options": optArray | |
} | |
} | |
]; | |
send2slack(text, block, WEBHOOK_URL); | |
} | |
// slack で今日の成果を確認する関数 | |
function checkOnSlack () { | |
var maxRow = sht[1].getLastRow(); | |
var menu = sht[1].getRange(maxRow, 2).getValue(); | |
if (menu == "今日は休み") { | |
return | |
} | |
var blocks = [ | |
{ | |
"type": "section", | |
"text": { | |
"type": "mrkdwn", | |
"text": menu + "できた?" | |
} | |
}, | |
{ | |
"type": "actions", | |
"elements": [ | |
makeButton("できた", "done"), | |
makeButton("できなかった", "not"), | |
makeButton("できなかったけれど1万歩以上歩いた", "walking") | |
] | |
} | |
]; | |
send2slack((menu + "できた?"), blocks, WEBHOOK_URL); | |
} | |
/////////////////////////////////////////////////////// | |
// POST への処理 | |
/////////////////////////////////////////////////////// | |
// メッセージへの反応を受け取って返答する関数 | |
function doPost (e) { | |
var payload = JSON.parse(e.parameter.payload); | |
var response_url = payload.response_url; | |
var response_type = payload.actions[0].type; | |
if (response_type == "static_select") { | |
// 今日の目標がメニューから選択された場合 | |
var selected = payload.actions[0].selected_option.value; | |
// シートへのログを残す | |
sht[1].appendRow([new Date, selected]); | |
if (selected == "今日は休み") { | |
var msg = selected; | |
} | |
else { | |
var msg = "今日の目標: *" + selected + "*" | |
} | |
} | |
else { | |
// 今日の成果がボタンで回答された場合 | |
var selected = payload.actions[0].value; | |
// メニュー取得 | |
var logDate = sht[1].getRange(sht[1].getLastRow(), 1).getValue(); | |
var logMenu = sht[1].getRange(sht[1].getLastRow(), 2).getValue(); | |
// 運動できた場合は記録用シートの最終行をカレンダーに登録 | |
if (selected == "done") { | |
clndr.createAllDayEvent(logMenu, new Date(logDate)); | |
var msg = ":tada: 今日の成果: *" + logMenu + "*"; | |
} | |
else if (selected == "walking") { | |
clndr.createAllDayEvent("👟ウォーキング1万歩以上", new Date(logDate)); | |
var msg = ":tada: 今日の成果: *👟ウォーキング1万歩以上*"; | |
} | |
else { | |
var msg = ":sob: 今日は運動できなかった…" | |
} | |
} | |
// slack に投稿 | |
var block = [ | |
{ | |
"type": "section", | |
"text": { | |
"type": "mrkdwn", | |
"text": msg | |
} | |
} | |
]; | |
send2slack(msg, block, response_url); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment