-
-
Save coder0107git/5841f959ab13013d452ffde9788f6b09 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
const USERS_SHEET_NAME = "users", | |
TASKS_SHEET_NAME = "tasks", | |
SPREADSHEET_URL = "https://docs.google.com/spreadsheets/d/abc123456/edit", /* TODO(Developer): Replace the spreadsheet ID */ | |
/* Use `SpreadsheetApp.getActiveSpreadsheet()` if the Apps Script was created from a Google Sheet. */ | |
spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL); | |
const getEmailByNickname = (() => { | |
const usersSheet = spreadsheet.getSheetByName(USERS_SHEET_NAME); | |
let userEmailTable = {}; | |
for (let i = 2; i <= usersSheet.getLastRow(); ++i) { | |
userEmailTable[usersSheet.getRange(i, 1).getValue()] = usersSheet.getRange(i, 2).getValue(); | |
} | |
return nickname => userEmailTable[nickname]; | |
})(); | |
function getAllUserNicknames() { | |
let usersSheet = spreadsheet.getSheetByName(USERS_SHEET_NAME); | |
let users = []; | |
for (let i = 2; i <= usersSheet.getLastRow(); ++i) { | |
let nickname = usersSheet.getRange(i, 1).getValue(); | |
if ((nickname in users) === false) { | |
users.push(nickname); | |
} | |
} | |
return users; | |
} | |
function getTasks() { | |
const tasksSheet = spreadsheet.getSheetByName(TASKS_SHEET_NAME); | |
let tasks = {}; | |
for (let i = 2; i <= tasksSheet.getLastRow(); ++i) { | |
const 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; | |
} | |
function getTaskState(task) { // 1: Overdue, 2: Due Today, 3: Not due yet | |
let today = new Date(); | |
today.setHours(0); | |
today.setMinutes(0); | |
today.setSeconds(0); | |
today.setMilliseconds(0); | |
// Overdue | |
if (task.limit.getTime() < today.getTime()) { | |
return 1; | |
} | |
// Due Today | |
if (task.limit.getTime() === today.getTime()) { | |
return 2; | |
} | |
// Not due yet | |
return 3; | |
} | |
function getFormatedDate(date) { | |
const months = [ | |
"January", | |
"Febuary", | |
"March", | |
"April", | |
"May", | |
"June", | |
"July", | |
"August", | |
"Sepetember", | |
"October", | |
"November", | |
"December" | |
]; | |
return `${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`; | |
} | |
function getFormatedTask(task, embed_nickname) { | |
if (embed_nickname === true) { | |
return `${task.name} [Assignment Name: ${task.charge}][Due Date: ${getFormatedDate(task.limit)}][Progress: ${task.progress}%]\n`; | |
} | |
return `${task.name} [Due Date: ${getFormatedDate(task.limit)}][Progress: ${task.progress}%]\n`; | |
} | |
function sendTaskReminderEmail2Individual() { | |
const tasks = getTasks(); | |
for (const recipient in tasks) { | |
let overdue = "", | |
today = "", | |
need2Do = ""; | |
for (let i = 0; i < tasks[recipient].length; ++i) { | |
let task = tasks[recipient][i]; | |
if (!task) { | |
continue; | |
} | |
switch (getTaskState(task)) { | |
case 1: | |
overdue += getFormatedTask(task); | |
break; | |
case 2: | |
today += getFormatedTask(task); | |
break; | |
case 3: | |
need2Do += getFormatedTask(task); | |
break; | |
} | |
} | |
const body = "Task Reminder\n" + | |
`Add tasks and change progress from ${SPREADSHEET_URL}.\n\n` + | |
`========= Overdue =========\n${overdue}\n` + | |
`======== Due Today ========\n${today}\n` + | |
`======== Need 2 Do ========\n${need2Do}`; | |
sendEmail( | |
getEmailByNickname(recipient), | |
`Task Reminder For ${recipient}`, | |
body | |
); | |
} | |
} | |
function sendTaskReminderMail2All() { // Everyone | |
let tasks = getTasks(), | |
overdue = "", | |
today = "", | |
need2Do = ""; | |
for (let charge in tasks) { | |
for (let i = 0; i < tasks[charge].length; ++i) { | |
let 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: | |
need2Do += getFormatedTask(task, true); | |
break; | |
} | |
} | |
} | |
const body = "Task Reminder\n" + | |
`Add tasks and change progress from ${SPREADSHEET_URL}.\n\n` + | |
`========= Overdue =========\n${overdue}\n` + | |
`======== Due Today ========\n${today}\n` + | |
`======== Need 2 Do ========\n${need2Do}`; | |
const nicknames = getAllUserNicknames(); | |
for (const nickname of nicknames) { | |
sendEmail( | |
getEmailByNickname(nickname), | |
"Task Reminder", | |
body | |
); | |
} | |
} | |
function sendEmail(recipient, title, body) { | |
MailApp.sendEmail(recipient, `[Automatic Email]${title}`, body); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment