Skip to content

Instantly share code, notes, and snippets.

@coder0107git
Forked from yosida95/gist:4186224
Last active August 19, 2023 22:25
Show Gist options
  • Save coder0107git/5841f959ab13013d452ffde9788f6b09 to your computer and use it in GitHub Desktop.
Save coder0107git/5841f959ab13013d452ffde9788f6b09 to your computer and use it in GitHub Desktop.
Task Reminder with Google Apps Script
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