A lightweight, browser-based timesheet system built entirely with Google Apps Script. Designed for nonprofits or educational programs, it enables staff to log instructional and administrative hours, upload receipts, and receive automated confirmations.
- Distinct forms for Teaching Hours and Admin Hours
- Validations for required fields and logic (e.g. date cannot be in the future)
- Multiple entry rows using dynamic tables
- Upload receipts to Google Drive and generate public links
- Data logged to Google Sheets
- Confirmation email to employee and detailed notification to HR
- Toast notifications and responsive design
- Frontend: HTML, CSS, JavaScript (Vanilla)
- Backend: Google Apps Script (
Code.gs) - Storage:
- Google Sheets (timesheet logs and reference data)
- Google Drive (uploaded files)
- Email Delivery: Google Apps Script
MailApp
Timesheet-App/
├── Index.html # Main frontend interface
├── Code.gs # Backend Apps Script logic
├── README.md-
Initial Input
The user provides name and email to activate the form buttons. -
Form Filling
The user fills out date, hours, location, and reimbursement details. Dropdowns are populated from a linked Google Sheet. -
Attach Receipts
Uploaded files are saved to a Google Drive folder and shared. -
Submission
- Entry is appended to the corresponding Google Sheet tab
- Employee receives a confirmation email
- HR receives a detailed HTML summary with receipt links
The app is intended for deployment via Google Apps Script, ideally bound to a Google Sheet or published as a Web App.
- Open the Apps Script Editor.
- Click ⚙️ Project Settings → Add Script Properties:
| Key | Description |
|---|---|
DATA_SPREADSHEET_ID |
ID of sheet with Locations & Languages |
RESPONSES_SPREADSHEET_ID |
ID of sheet receiving timesheet entries |
RECEIPT_FOLDER_ID |
ID of Google Drive folder for receipt files |
HR_EMAIL |
Email address where HR notifications go |
- Create the required Google Sheets (Responses, Data).
- Paste
Code.gsinto the script editor of the Responses spreadsheet. - Add the HTML interface as a file named
Index. - Deploy as Web App → Choose "Anyone" or "Anyone in your org".
- Share the web app URL with staff via intranet or email.