Skip to content

Instantly share code, notes, and snippets.

@walkingmask
Last active March 7, 2018 05:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save walkingmask/d5cb1c1149f80e8db7de5fd641df5857 to your computer and use it in GitHub Desktop.
Save walkingmask/d5cb1c1149f80e8db7de5fd641df5857 to your computer and use it in GitHub Desktop.
// 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;
}