Created
December 2, 2012 00:55
-
-
Save yosida95/4186224 to your computer and use it in GitHub Desktop.
Task Reminder with Google Apps Script
This file contains hidden or 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
var USERS_SHEET_NAME = 'users', | |
TASKS_SHEET_NAME = 'tasks', | |
SPREADSHEET_URI = 'スプレッドシートのURI'; | |
var getEmailByNickname = (function(){ | |
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); | |
var usersSheet = spreadsheet.getSheetByName(USERS_SHEET_NAME); | |
var userEmailTable = {}; | |
for(var i = 2; i <= usersSheet.getLastRow(); ++i){ | |
userEmailTable[usersSheet.getRange(i, 1).getValue()] = usersSheet.getRange(i, 2).getValue(); | |
} | |
return function (nickname){ | |
return userEmailTable[nickname]; | |
}; | |
})(); | |
var getAllUserNicknames = function(){ | |
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); | |
var usersSheet = spreadsheet.getSheetByName(USERS_SHEET_NAME); | |
var users = []; | |
for(var i = 2; i <= usersSheet.getLastRow(); ++i){ | |
var nickname = usersSheet.getRange(i, 1).getValue(); | |
if((nickname in users) === false){ | |
users.push(nickname); | |
} | |
} | |
return users; | |
}; | |
var getTasks = function(){ | |
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); | |
var tasksSheet = spreadsheet.getSheetByName(TASKS_SHEET_NAME); | |
var tasks = {}; | |
for(var i = 2; i <= tasksSheet.getLastRow(); ++i){ | |
var task = { | |
name: tasksSheet.getRange(i, 1).getValue(), | |
limit: new Date(Date.parse(tasksSheet.getRange(i, 2).getValue())), | |
charge: tasksSheet.getRange(i, 3).getValue(), | |
progress: tasksSheet.getRange(i, 4).getValue() | |
}; | |
if(task.progress >= 100){ | |
continue; | |
} | |
if(task.charge in tasks){ | |
tasks[task.charge].push(task); | |
}else{ | |
tasks[task.charge] = [task]; | |
} | |
} | |
return tasks; | |
}; | |
var getTaskState = function(task) { // 1:超過, 2:今日まで, 3:進行中 | |
var today = new Date(); | |
today.setHours(0); | |
today.setMinutes(0); | |
today.setSeconds(0); | |
today.setMilliseconds(0); | |
if(task.limit.getTime() < today.getTime()){ | |
return 1; | |
}else if(task.limit.getTime() === today.getTime()){ | |
return 2; | |
}else{ | |
return 3; | |
} | |
}; | |
var getFormatedDate = function(date){ | |
return date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate(); | |
}; | |
var getFormatedTask = function(task, embed_nickname){ | |
if(embed_nickname === true){ | |
return task.name + ' [担当:' + task.charge + '][期日:' + getFormatedDate(task.limit) + '][進捗:' + task.progress + '%]\n'; | |
}else{ | |
return task.name + ' [期日:' + getFormatedDate(task.limit) + '][進捗:' + task.progress + '%]\n'; | |
} | |
}; | |
function sendTaskReminderMail2Inviduas(){ | |
var tasks = getTasks(); | |
for(var charge in tasks){ | |
var overdue = '', | |
today = '', | |
fight = ''; | |
for(var i = 0; i < tasks[charge].length; ++i){ | |
var task = tasks[charge][i]; | |
if(!task){ | |
continue; | |
} | |
switch(getTaskState(task)){ | |
case 1: | |
overdue += getFormatedTask(task); | |
break; | |
case 2: | |
today += getFormatedTask(task); | |
break; | |
case 3: | |
fight += getFormatedTask(task); | |
break; | |
} | |
} | |
var body = 'タスクリマインダーメール\n' | |
+ 'タスクの追加や進捗状況の変更は' + SPREADSHEET_URI + 'から行なってください。\n' | |
+ '\n==========期限切れ==========\n' | |
+ overdue | |
+ '\n==========今日まで==========\n' | |
+ today | |
+ '\n==========頑張って==========\n' | |
+ fight; | |
sendEmail( | |
getEmailByNickname(charge), | |
'タスクリマインダー for ' + charge, | |
body | |
); | |
} | |
}; | |
function sendTaskReminderMail2All(){ | |
var tasks = getTasks(), | |
overdue = '', | |
today = '', | |
fight = ''; | |
for(var charge in tasks){ | |
for(var i = 0; i < tasks[charge].length; ++i){ | |
var task = tasks[charge][i]; | |
if(!task){ | |
continue; | |
} | |
switch(getTaskState(task)){ | |
case 1: | |
overdue += getFormatedTask(task, true); | |
break; | |
case 2: | |
today += getFormatedTask(task, true); | |
break; | |
case 3: | |
fight += getFormatedTask(task, true); | |
break; | |
} | |
} | |
} | |
var body = 'タスクリマインダーメール\n' | |
+ 'タスクの追加や進捗状況の変更は' + SPREADSHEET_URI + 'から行なってください。\n' | |
+ '\n==========期限切れ==========\n' | |
+ overdue | |
+ '\n==========今日まで==========\n' | |
+ today | |
+ '\n==========頑張って==========\n' | |
+ fight; | |
var nicknames = getAllUserNicknames(); | |
for(var i = 0; i < nicknames.length; ++i){ | |
sendEmail( | |
getEmailByNickname(nicknames[i]), | |
'タスクリマインダー', | |
body | |
); | |
} | |
}; | |
var sendEmail = function(recipient, title, body){ | |
MailApp.sendEmail(recipient, '[自動送信メール]' + title, body); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment