This is a fully functional, Serverless IT Service Management (ITSM) solution designed for Small and Mid-sized Businesses (SMBs).
Built entirely within the Google Workspace ecosystem, it provides a centralized portal for employees to submit issues and a structured backend for IT staff to manage tickets, track SLAs, and automate email notifications—all without incurring additional software costs (like Jira or ServiceNow).
The system follows a headless architecture pattern utilizing low-code tools:
- Frontend (Portal): Google Sites serves as the intranet entry point.
- Input (Submission): Google Forms collects structured data (Issue Type, Asset ID, Attachments).
- Database (Backend): Google Sheets acts as the real-time database.
- Automation (Logic): Google Apps Script handles business logic, state changes, and notifications.
- 🎨 Self-Service Portal: A user-friendly interface for employees to find FAQs and submit tickets.
- 🆔 Auto-Ticketing: Automatically generates unique Ticket IDs based on date and sequence (e.g.,
TCK26011901). - 📧 HTML Email Notifications:
- User: Receives confirmation when ticket is created, processing, or resolved.
- IT Admin: Receives alerts with asset details and direct attachment links.
- 🔄 State Machine Logic:
- Changing status to
In Progresstriggers a specific user notification. - Changing status to
Donecloses the loop and records the completion timestamp.
- Changing status to
- 📊 Idempotency: Prevents duplicate emails for the same status update using flag columns.
Centralized hub for ticket submission and knowledge base.

Professional email templates sent automatically via Apps Script triggers.

IT Staff view for managing status and tracking SLAs.

The core automation is handled by src/Backend_Logic.js.
When a form is submitted, the script:
- Calculates a unique ID based on the current date.
- Parses form data (including Drive attachments).
- Sends a formatted HTML email to the IT Support Team.
The script listens for edits in the Status column to trigger downstream actions:
function onEdit(e) {
// Logic to detect status change to "Done"
if(status === "Done" && prevStatus !== "Done" && !isNotified) {
// Send Resolution Email with HTML Template
MailApp.sendEmail({
to: userEmail,
subject: `Ticket Resolved: ${ticketID}`,
htmlBody: getHtmlTemplate_Resolved(ticketID)
});
// Mark as notified to prevent duplicate actions (Idempotency)
sheet.getRange(row, COLS.NOTIFY_DONE).setValue("Yes");
}
}