Skip to content

Instantly share code, notes, and snippets.

@AWtnb
Last active March 18, 2019 12:54
Show Gist options
  • Save AWtnb/e5a8b6303170a7f52f6e5566cbb7810a to your computer and use it in GitHub Desktop.
Save AWtnb/e5a8b6303170a7f52f6e5566cbb7810a to your computer and use it in GitHub Desktop.
manage exercise with slack and google sheet
/*
今日のトレーニングを 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