Last active
March 7, 2018 05:41
-
-
Save walkingmask/d5cb1c1149f80e8db7de5fd641df5857 to your computer and use it in GitHub Desktop.
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
// Google Calendar Line Bot | |
// Main | |
// Post処理するやつ | |
function doPost(e) { | |
var json = JSON.parse(e.postData.contents); | |
var message = json.events[0].message.text; | |
if (message != null) { | |
commandProcessor(json, message); | |
} | |
} | |
// コマンド処理するやつ | |
function commandProcessor(data, command) { | |
switch (command) { | |
case "foods:": | |
reply(data, getFoods()); | |
break; | |
} | |
} | |
// Utils | |
// スプレッドシートにエラー吐くやつ | |
function spreadsheetLog(text) { | |
if (!spreadsheetLog.sheet) { | |
var id = PropertiesService.getScriptProperties().getProperty('SPREADSHEET'); | |
if (id == null) { | |
throw new Error("Without registration of spreadsheet id, I can't do anything..."); | |
} | |
var spreadsheet = SpreadsheetApp.openById(id); | |
spreadsheetLog.sheet = spreadsheet.getActiveSheet(); | |
Logger.log('The log sheet has been set up.'); | |
} | |
spreadsheetLog.sheet.appendRow([new Date(), text]); | |
Logger.log(text); | |
} | |
// ScriptPropertyからkeyを使ってvalueを取り出すやつ | |
function getProp(key) { | |
if (!getProp.prop) { | |
getProp.prop = PropertiesService.getScriptProperties(); | |
} | |
var value = getProp.prop.getProperty(key); | |
if (value == null) { | |
spreadsheetLog("There is no property "+key+"."); | |
throw new Error(); | |
} | |
return value; | |
} | |
// 時間をフォーマットするやつ | |
function formatTime(time) { | |
return ('00' + time).slice(-2); | |
} | |
// 今日の日付を取得して適当にフォーマットするやつ | |
function getFormatedTodaysDate() { | |
var today = new Date(); | |
var weekday = ["日", "月", "火", "水", "木", "金", "土"]; | |
var year = today.getFullYear(); | |
var month = ('0' + (today.getMonth() + 1)).slice(-2); | |
var day = ('0' + today.getDate()).slice(-2); | |
var weekday = weekday[today.getDay()]; | |
return year+'/'+month+'/'+day+' ('+weekday+')'; | |
} | |
// 天気と日付を取得するやつ | |
function getTodaysInfo() { | |
var today = getFormatedTodaysDate(); | |
var response = UrlFetchApp.fetch('http://wttr.in/'+getProp('REGION')+'?0&T&Q&m&lang=ja'); | |
var myRegexp = /<pre>([\n]|.)*<\/pre>/i; | |
var info = myRegexp.exec(response.getContentText())[0].split('\n'); | |
var weather = info[1].replace(/[ \\/]/g, ''); | |
var temperature = info[2].match(/\d+ °C/i); | |
return today+'\n天気: '+weather+'\n温度: '+temperature+'\n'; | |
} | |
// Line Bot | |
// 台詞とかの定義 | |
var script = { | |
'GOOD_MORNING': 'おはようございます☀', | |
'GOOD_LUCK': '今日もぼちぼち頑張ってください👍', | |
'SEVEN_DAYS_SCHEDULES': 'この7日間の予定😇', | |
'NEW_SCHEDULES': '新しく追加された予定😱', | |
'NO_SCHEDULES': 'しばらく予定はありませんね😪', | |
'SCHEDULE_MARK': '✅', | |
'NEW_SCHEDULE_MARK': '⏩', | |
}; | |
// 送信するやつ | |
function push(to, text) { | |
var url = getProp('PUSH_API'); | |
var headers = { | |
'Content-Type' : 'application/json; charset=UTF-8', | |
'Authorization': 'Bearer '+getProp('CHANNEL_ACCESS_TOKEN'), | |
}; | |
var postData = { | |
'to' : to, | |
'messages': [ | |
{ | |
'type': 'text', | |
'text': text, | |
} | |
] | |
}; | |
var options = { | |
'method' : 'POST', | |
'headers' : headers, | |
'payload' : JSON.stringify(postData) | |
}; | |
UrlFetchApp.fetch(url, options); | |
} | |
// 返信するやつ | |
function reply(data, text) { | |
var url = getProp('REPLY_API'); | |
var headers = { | |
'Content-Type' : 'application/json; charset=UTF-8', | |
'Authorization': 'Bearer '+getProp('CHANNEL_ACCESS_TOKEN'), | |
}; | |
var postData = { | |
'replyToken' : data.events[0].replyToken, | |
'messages' : [ | |
{ | |
'type': 'text', | |
'text': text, | |
} | |
] | |
}; | |
var options = { | |
'method' : 'POST', | |
'headers' : headers, | |
'payload' : JSON.stringify(postData) | |
}; | |
return UrlFetchApp.fetch(url, options); | |
} | |
// スケジュールをpushするやつ | |
function pushSchedules() { | |
var text = script['GOOD_MORNING']+'\n\n'; | |
text += getTodaysInfo()+'\n'; | |
text += getAndFormatSchedules()+'\n'; | |
text += script['GOOD_LUCK']+'\n'; | |
push(getProp('GROUP_ID'), text); | |
} | |
// Calendar Handler | |
// Googleカレンダー取得するやつ | |
function getCalendars() { | |
if (!getCalendars.calendars) { | |
var calendars_infos = JSON.parse(getProp('CALENDARS_INFOS')); | |
for (var i=0; i < calendars_infos.length; i++) { | |
var calendar_info = calendars_infos[i]; | |
var calendar = CalendarApp.getCalendarById(calendar_info.id); | |
calendars_infos[i]['calendar'] = calendar; | |
} | |
getCalendars.calendars = calendars_infos; | |
Logger.log('Got the calendars.'); | |
} | |
return getCalendars.calendars; | |
} | |
// この先7日間のスケジュールを取得するやつ | |
function getSchedulesInNext7Days() { | |
var today = new Date(); | |
var seven_days_later = new Date(today.getFullYear(), today.getMonth(), today.getDate()+7); | |
var calendars = getCalendars(); | |
var schedules = []; | |
for (var i=0; i < calendars.length; i++) { | |
var calendar = calendars[i]; | |
var events = calendar['calendar'].getEvents(today, seven_days_later); | |
var _schedules = []; | |
for (var j=0; j < events.length; j++) { | |
_schedules.push(events[j]); | |
} | |
schedules.push({'name':calendar['name'], 'schedules':_schedules}); | |
} | |
return schedules; | |
} | |
// この先90日間のスケジュールの中で、この24時間に作成されたスケジュールを取得するやつ | |
function getNewAddedSchedulesInNext90Days() { | |
var today = new Date(); | |
var ninety_days_later = new Date(today.getFullYear(), today.getMonth(), today.getDate()+90); | |
var twenty_four_earlier = new Date(today.getFullYear(), today.getMonth(), today.getDate(), today.getHours()-24); | |
var calendars = getCalendars(); | |
var schedules = []; | |
for (var i=0; i < calendars.length; i++) { | |
var calendar = calendars[i]; | |
var events = calendar['calendar'].getEvents(today, ninety_days_later); | |
var _schedules = []; | |
for (var j=0; j < events.length; j++) { | |
// 24 時間前の時刻より後に作成されていれば保存 | |
if (events[j].getDateCreated() > twenty_four_earlier) { | |
_schedules.push(events[j]); | |
} | |
} | |
schedules.push({'name': calendar['name'], 'schedules': _schedules}); | |
} | |
return schedules; | |
} | |
// スケジュールを取得してフォーマットするやつ | |
function getAndFormatSchedules() { | |
var formated_schedules = ''; | |
// この先 7 日分のスケジュール | |
var schedules_in_next_seven_days = getSchedulesInNext7Days(); | |
var formated_schedules_in_next_seven_days = ''; | |
for (var i=0; i < schedules_in_next_seven_days.length; i++) { | |
var schedules = schedules_in_next_seven_days[i]; | |
if (schedules.schedules.length > 0) { | |
formated_schedules_in_next_seven_days += '\n['+schedules.name+']\n'; | |
for (var j=0; j < schedules.schedules.length; j++) { | |
schedule = schedules.schedules[j]; | |
formated_schedules_in_next_seven_days += formatSchedule(schedule, script['SCHEDULE_MARK']); | |
} | |
} | |
} | |
if (formated_schedules_in_next_seven_days.length > 0) { | |
formated_schedules += script['SEVEN_DAYS_SCHEDULES']+'\n'; | |
formated_schedules += formated_schedules_in_next_seven_days; | |
} | |
// この 24 時間に作成されたスケジュール | |
var schedules_new_added = getNewAddedSchedulesInNext90Days(); | |
var formated_schedules_new_added = ''; | |
for (var i=0; i < schedules_new_added.length; i++) { | |
var schedules = schedules_new_added[i]; | |
if (schedules.schedules.length > 0) { | |
formated_schedules_new_added += '\n['+schedules.name+']\n'; | |
for (var j=0; j < schedules.schedules.length; j++) { | |
schedule = schedules.schedules[j]; | |
formated_schedules_new_added += formatSchedule(schedule, script['NEW_SCHEDULE_MARK']); | |
} | |
} | |
} | |
if (formated_schedules_new_added.length > 0) { | |
if (formated_schedules.length > 0) { | |
formated_schedules += '\n'; | |
} | |
formated_schedules += script['NEW_SCHEDULES']+'\n'; | |
formated_schedules += formated_schedules_new_added; | |
} | |
if (formated_schedules.length == 0) { | |
formated_schedules += script['NO_SCHEDULES']+'\n'; | |
} | |
return formated_schedules; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Referenced URLs
GAS
LINE Messaging API
JS