API codes
Use google apps script to deploy the API
This commit is contained in:
parent
061e77f1c9
commit
905b4ce70c
1 changed files with 129 additions and 0 deletions
129
project_dashboard/API Codes
Normal file
129
project_dashboard/API Codes
Normal file
|
|
@ -0,0 +1,129 @@
|
||||||
|
function doGet() {
|
||||||
|
const data = {
|
||||||
|
lastUpdated: new Date().toLocaleString(),
|
||||||
|
inProgressProjects: getInProgressProjects(),
|
||||||
|
projectStats: getProjectStats(),
|
||||||
|
announcements: getAnnouncements(),
|
||||||
|
calendar: getCalendarData()
|
||||||
|
};
|
||||||
|
|
||||||
|
return ContentService.createTextOutput(JSON.stringify(data))
|
||||||
|
.setMimeType(ContentService.MimeType.JSON);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PAGE 1: Unique In-Progress Projects
|
||||||
|
*/
|
||||||
|
function getInProgressProjects() {
|
||||||
|
const ss = SpreadsheetApp.getActiveSpreadsheet();
|
||||||
|
const sheets = ss.getSheets();
|
||||||
|
const seenProjects = new Set();
|
||||||
|
const results = [];
|
||||||
|
|
||||||
|
sheets.forEach(sheet => {
|
||||||
|
if (sheet.getName() === "Announcements") return;
|
||||||
|
const rows = sheet.getDataRange().getValues();
|
||||||
|
const dataRows = rows.slice(1);
|
||||||
|
|
||||||
|
dataRows.forEach(row => {
|
||||||
|
const name = row[2];
|
||||||
|
const isComplete = row[6] !== "";
|
||||||
|
// Filter: In Progress AND Unique Name
|
||||||
|
if (!isComplete && name && !seenProjects.has(name)) {
|
||||||
|
seenProjects.add(name);
|
||||||
|
results.push({
|
||||||
|
type: row[1],
|
||||||
|
name: name,
|
||||||
|
owner: row[4],
|
||||||
|
due: formatDate(row[5])
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PAGE 2: Status Aggregation (Due, Completed, Overdue)
|
||||||
|
*/
|
||||||
|
function getProjectStats() {
|
||||||
|
const ss = SpreadsheetApp.getActiveSpreadsheet();
|
||||||
|
const sheets = ss.getSheets();
|
||||||
|
const stats = { completed: [], overdue: [], dueSoon: [] };
|
||||||
|
const today = new Date();
|
||||||
|
|
||||||
|
sheets.forEach(sheet => {
|
||||||
|
if (sheet.getName() === "Announcements") return;
|
||||||
|
const rows = sheet.getDataRange().getValues().slice(1);
|
||||||
|
|
||||||
|
rows.forEach(row => {
|
||||||
|
const dueDate = new Date(row[5]);
|
||||||
|
const completionDate = row[6];
|
||||||
|
const project = { name: row[2], owner: row[4], date: formatDate(row[5]) };
|
||||||
|
|
||||||
|
if (completionDate !== "") {
|
||||||
|
stats.completed.push(project);
|
||||||
|
} else if (dueDate < today) {
|
||||||
|
stats.overdue.push(project);
|
||||||
|
} else {
|
||||||
|
stats.dueSoon.push(project);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return stats;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PAGE 3: Announcements
|
||||||
|
* Sheet structure: [Date, Title, Content]
|
||||||
|
*/
|
||||||
|
function getAnnouncements() {
|
||||||
|
const ss = SpreadsheetApp.getActiveSpreadsheet();
|
||||||
|
const allSheets = ss.getSheets();
|
||||||
|
let sheet = null;
|
||||||
|
|
||||||
|
// This loop looks through every tab to find the right one
|
||||||
|
for (let i = 0; i < allSheets.length; i++) {
|
||||||
|
let name = allSheets[i].getName().toLowerCase().trim(); // Convert to lowercase and remove spaces
|
||||||
|
if (name === "announcements" || name === "announcement") {
|
||||||
|
sheet = allSheets[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If even the "smart search" fails
|
||||||
|
if (!sheet) {
|
||||||
|
return [{ title: "ERROR", content: "Could not find a tab named 'Announcements' in your Google Sheet." }];
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = sheet.getDataRange().getValues();
|
||||||
|
if (rows.length < 2) return [];
|
||||||
|
|
||||||
|
return rows.slice(1).map(r => ({
|
||||||
|
date: r[0] ? formatDate(r[0]) : "",
|
||||||
|
title: r[1] || "No Title",
|
||||||
|
content: r[2] || "No Content"
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PAGE 4: Google Calendar (Events & Birthdays)
|
||||||
|
*/
|
||||||
|
function getCalendarData() {
|
||||||
|
const now = new Date();
|
||||||
|
const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);
|
||||||
|
const endOfMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0);
|
||||||
|
|
||||||
|
// Gets events from your primary calendar
|
||||||
|
const events = CalendarApp.getDefaultCalendar().getEvents(startOfMonth, endOfMonth);
|
||||||
|
|
||||||
|
return events.map(e => ({
|
||||||
|
title: e.getTitle(),
|
||||||
|
start: Utilities.formatDate(e.getStartTime(), Session.getScriptTimeZone(), "MMM dd"),
|
||||||
|
isBirthday: e.getTitle().toLowerCase().includes("birthday")
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatDate(date) {
|
||||||
|
return (date instanceof Date) ? Utilities.formatDate(date, Session.getScriptTimeZone(), "MMM dd") : date;
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue