Skip to content

Instantly share code, notes, and snippets.

@yosida95
Created December 2, 2012 00:55
Show Gist options
  • Save yosida95/4186224 to your computer and use it in GitHub Desktop.
Save yosida95/4186224 to your computer and use it in GitHub Desktop.
Task Reminder with Google Apps Script
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