// ========================================== // CONFIGURATION & MASTER DATA // ========================================== const MASTER_ROSTER = [ // Claire Hanrahan { fn: 'Samantha', ln: 'B.', cm: 'claire.hanrahan@ahschools.us' }, { fn: 'Mia', ln: 'B.', cm: 'claire.hanrahan@ahschools.us' }, { fn: 'Dominic', ln: 'G.', cm: 'claire.hanrahan@ahschools.us' }, { fn: 'Mikayla', ln: 'S.', cm: 'claire.hanrahan@ahschools.us' }, { fn: 'Jeremiah', ln: 'T.', cm: 'claire.hanrahan@ahschools.us' }, { fn: 'Milo', ln: 'K.', cm: 'claire.hanrahan@ahschools.us' }, { fn: 'William', ln: 'S.', cm: 'claire.hanrahan@ahschools.us' }, // Emily Catterton { fn: 'Kyle', ln: 'B.', cm: 'emily.catterton@ahschools.us' }, { fn: 'Sarah', ln: 'K.', cm: 'emily.catterton@ahschools.us' }, { fn: 'Jack', ln: 'P.', cm: 'emily.catterton@ahschools.us' }, { fn: 'Hannah', ln: 'B.', cm: 'emily.catterton@ahschools.us' }, { fn: 'Demetrius', ln: 'C.', cm: 'emily.catterton@ahschools.us' }, { fn: 'Ethan', ln: 'W.', cm: 'emily.catterton@ahschools.us' }, { fn: 'Neveah', ln: 'M-T.', cm: 'emily.catterton@ahschools.us' }, { fn: 'Josh', ln: 'M.', cm: 'emily.catterton@ahschools.us' }, // Trent Hanson { fn: 'Adrian', ln: 'N.', cm: 'trent.hanson@ahschools.us' }, { fn: 'Chance', ln: 'S.', cm: 'trent.hanson@ahschools.us' }, { fn: 'Mohamed', ln: 'W.', cm: 'trent.hanson@ahschools.us' }, { fn: 'Dominic', ln: 'P.', cm: 'trent.hanson@ahschools.us' }, { fn: 'Kanhchana', ln: 'I.', cm: 'trent.hanson@ahschools.us' }, { fn: 'Johnny', ln: 'X.', cm: 'trent.hanson@ahschools.us' }, // Ryan Roth { fn: 'Carter', ln: 'R.', cm: 'ryan.roth@ahschools.us' }, { fn: 'Naomi', ln: 'B.', cm: 'ryan.roth@ahschools.us' }, { fn: 'Ashton', ln: 'B.', cm: 'ryan.roth@ahschools.us' }, { fn: 'Sophie', ln: 'T.', cm: 'ryan.roth@ahschools.us' }, { fn: 'Alvin', ln: 'Z.', cm: 'ryan.roth@ahschools.us' }, // Tamara Onnen { fn: 'Tony', ln: 'R-A.', cm: 'tamara.onnen@ahschools.us' }, { fn: 'Steven', ln: 'G.', cm: 'tamara.onnen@ahschools.us' }, { fn: 'Alex', ln: 'C.', cm: 'tamara.onnen@ahschools.us' }, { fn: 'Alondra', ln: 'O.', cm: 'tamara.onnen@ahschools.us' }, { fn: 'Devon', ln: 'J.', cm: 'tamara.onnen@ahschools.us' }, { fn: 'Latrell', ln: 'J.', cm: 'tamara.onnen@ahschools.us' }, { fn: 'Elise', ln: 'K.', cm: 'tamara.onnen@ahschools.us' }, // Karlyn Pranke { fn: 'Brennen', ln: 'J.', cm: 'karlyn.pranke@ahschools.us' }, { fn: 'Hailey', ln: 'B.', cm: 'karlyn.pranke@ahschools.us' }, { fn: 'Lima', ln: 'P.', cm: 'karlyn.pranke@ahschools.us' }, { fn: 'Johnathon', ln: 'X.', cm: 'karlyn.pranke@ahschools.us' }, { fn: 'Terrica', ln: 'T.', cm: 'karlyn.pranke@ahschools.us' }, { fn: 'Jalon', ln: 'C.', cm: 'karlyn.pranke@ahschools.us' }, { fn: 'Michael', ln: 'G.', cm: 'karlyn.pranke@ahschools.us' }, // Nicole Ruid { fn: 'Bilaal', ln: 'A.', cm: 'nicole.ruid@ahschools.us' }, { fn: 'Zahur', ln: 'A.', cm: 'nicole.ruid@ahschools.us' }, { fn: 'Gavin', ln: 'C.', cm: 'nicole.ruid@ahschools.us' }, { fn: 'Windy', ln: 'L.', cm: 'nicole.ruid@ahschools.us' }, { fn: 'Ariella', ln: 'S.', cm: 'nicole.ruid@ahschools.us' }, { fn: 'Bella', ln: 'K.', cm: 'nicole.ruid@ahschools.us' }, { fn: 'Chloe', ln: 'B.', cm: 'nicole.ruid@ahschools.us' }, // Kelley Stowell { fn: 'Samuel', ln: 'B.', cm: 'kelley.stowell@ahschools.us' }, { fn: 'Ariyanna', ln: 'R.', cm: 'kelley.stowell@ahschools.us' }, { fn: 'Kaitlyn', ln: 'H.', cm: 'kelley.stowell@ahschools.us' }, { fn: 'Gabriel', ln: 'M.', cm: 'kelley.stowell@ahschools.us' }, { fn: 'Masha', ln: 'G.', cm: 'kelley.stowell@ahschools.us' }, { fn: 'James', ln: 'K.', cm: 'kelley.stowell@ahschools.us' }, { fn: 'Nasar', ln: 'M.', cm: 'kelley.stowell@ahschools.us' }, // Ryan Erlandson { fn: 'Chance', ln: 'K.', cm: 'ryan.erlandson@ahschools.us' }, { fn: 'Angel', ln: 'L.', cm: 'ryan.erlandson@ahschools.us' }, { fn: 'Davian', ln: 'N.', cm: 'ryan.erlandson@ahschools.us' }, { fn: 'Madison', ln: 'R.', cm: 'ryan.erlandson@ahschools.us' }, { fn: 'Ismeal', ln: 'S.', cm: 'ryan.erlandson@ahschools.us' }, { fn: 'Max', ln: 'S.', cm: 'ryan.erlandson@ahschools.us' }, { fn: 'Owen', ln: 'P.', cm: 'ryan.erlandson@ahschools.us' }, // Carol Lewis { fn: 'Jack', ln: 'N.', cm: 'carol.lewis@ahschools.us' }, { fn: 'Myles', ln: 'G.', cm: 'carol.lewis@ahschools.us' }, { fn: 'Lucas', ln: 'P.', cm: 'carol.lewis@ahschools.us' }, { fn: 'Ebin', ln: 'M.', cm: 'carol.lewis@ahschools.us' }, { fn: 'Emma', ln: 'G.', cm: 'carol.lewis@ahschools.us' }, { fn: 'Jonah', ln: 'W.', cm: 'carol.lewis@ahschools.us' }, { fn: 'Abdullahi', ln: 'O.', cm: 'carol.lewis@ahschools.us' } ]; // Fallback email if a student match is not found const ADMIN_FALLBACK_EMAIL = 'admin@ahschools.us'; // ========================================== // TRIGGER & INITIAL SETUP // ========================================== /** * Run this function once manually to automatically install the Form Submit trigger. */ function createFormSubmitTrigger() { const form = FormApp.getActiveForm(); // Clear any existing triggers to avoid duplicates const triggers = ScriptApp.getUserTriggers(form); triggers.forEach(trigger => ScriptApp.deleteTrigger(trigger)); // Build new trigger ScriptApp.newTrigger('onFormSubmit') .forForm(form) .onFormSubmit() .create(); Logger.log('Successfully created form submission trigger.'); } // ========================================== // EVENT HANDLER // ========================================== function onFormSubmit(e) { try { const itemResponses = e.response.getItemResponses(); let studentFirstName = ''; let studentLastName = ''; let incidentDetails = []; // Parse Form Responses for (let i = 0; i < itemResponses.length; i++) { const response = itemResponses[i]; const title = response.getItem().getTitle().toLowerCase().trim(); const value = response.getResponse(); if (title.includes('first name') || title.includes('student first')) { studentFirstName = value.toString().trim(); } else if (title.includes('last name') || title.includes('student last')) { studentLastName = value.toString().trim(); } else { const formattedVal = Array.isArray(value) ? value.join(', ') : value; incidentDetails.push(`${response.getItem().getTitle()}: ${formattedVal}`); } } // Match Student to Case Manager const matchedStudent = findStudent(studentFirstName, studentLastName); if (matchedStudent) { sendEmailNotification(matchedStudent.cm, `${matchedStudent.fn} ${matchedStudent.ln}`, incidentDetails); } else { Logger.log(`No matching Case Manager found for: ${studentFirstName} ${studentLastName}`); sendEmailNotification( ADMIN_FALLBACK_EMAIL, `${studentFirstName} ${studentLastName} (Unmatched)`, incidentDetails ); } } catch (err) { Logger.log(`Error processing form submission: ${err.message}`); } } // ========================================== // HELPER FUNCTIONS // ========================================== function findStudent(firstName, lastName) { if (!firstName || !lastName) return null; const cleanFN = firstName.toLowerCase().trim(); const cleanLN = lastName.toLowerCase().trim().replace('.', ''); return MASTER_ROSTER.find(student => { const rosterFN = student.fn.toLowerCase().trim(); const rosterLN = student.ln.toLowerCase().trim().replace('.', ''); return rosterFN === cleanFN && rosterLN.startsWith(cleanLN.charAt(0)); }); } function sendEmailNotification(recipientEmail, studentName, incidentDetails) { const subject = `Behavior Incident Report: ${studentName}`; const htmlBody = `

Behavior Incident Notification

A new incident report has been submitted for a student on your caseload.

Student: ${studentName}


Report Details:

${incidentDetails.join('

')}


This is an automated notification from the Behavior Reporting System.

`; GmailApp.sendEmail(recipientEmail, subject, '', { htmlBody: htmlBody }); }