timesheet-reminder-sheets
Reads a Roster Sheet and a TimesheetLog Sheet, sends a personalized reminder email only to people who haven't submitted this week's hours AND are scheduled to work today. Pairs naturally with the existing timesheet-collector skill, which writes submission rows to the TimesheetLog as employees reply with their hours.
Why this exists
The original timesheet-reminder hub workflow sends the same static "submit your timesheet" message to one contact every weekday morning, regardless of:
- Whether the person has already submitted (annoying)
- Whether today is even one of their working days (wrong)
- Who specifically should be reminded (it's one contact, not the team)
This variant fixes all three. The Roster Sheet lists who-works-what-days; the TimesheetLog Sheet tracks who's submitted; the workflow intersects them. Part-timers don't get reminded on their off days. People who already submitted don't get reminded again. The manager gets a summary of who DID get reminded so they can follow up if patterns emerge.
Setup
- Credentials (Credentials view):
-
google-workspace— Google Workspace service-account JSON - Runtime environment (Runtime Environments view):
-
python— auto-created on every install - Pair with
timesheet-collectorskill (recommended, optional): - The skill processes employees' messaged-in hours and confirms back to them. Modify its output to append a row toTimesheetLogwhen a submission is complete, OR have a downstream task do that append. - Sheet prep — Roster tab (3 cols, you maintain):
A employee_name | B employee_email | C work_dayswork_daysis a comma-separated list of three-letter day abbreviations the employee normally works:Mon,Tue,Wed,Thu,Frifor full-time,Tue,Thufor part-time, etc. Default if blank: weekdays only. - Sheet prep — TimesheetLog tab (5+ cols, populated by timesheet-collector or manually):
A employee_name | B employee_email | C week_start | D total_hours | E submitted_atweek_startis the Monday of the week the timesheet covers.submitted_atis the timestamp the submission was logged. The workflow uses (B, C, non-empty E) to determine "has this person submitted for this week." - Edit
workflow.yaml— replace the three placeholders: -<<TIMESHEET_SHEET_ID>>— the spreadsheet containing both tabs -<<COMPANY_NAME>>— used in the email signature -<<MANAGER_PUBLISHER>>— user for the daily "who got reminded" summary - Schedule weekdays at 8:45 AM (or one daily schedule — the script's work_days check filters off-days correctly).
Pipeline
- remind —
runtimeenv(python). ReadsRoster!A2:CandTimesheetLog!A2:E. For each roster entry: skips if today isn't in theirwork_days, skips if they have a non-emptysubmitted_atfor this week's Monday, otherwise sends a personalized reminder email and adds them to the digest. Prints a summary. - notify-manager —
message. Pipes the summary to the manager user so HR/operations see, every day, who didn't submit yet.
Sample reminder email
Subject: Reminder: submit your timesheet for the week of 2026-05-11
Hi Sarah,
This is a friendly reminder to submit your timesheet for the week
of 2026-05-11. Reply to the timesheet-collector with your hours
when you have a moment.
— Acme Manufacturing
Sample manager summary
TIMESHEET REMINDERS — 2026-05-13 (Wed)
Week of: 2026-05-11
Reminded 2:
- Sarah K.
- Mike T.
Not scheduled today (3): Alex P., Jamie L., Pat R.
Customization
- Working-day defaults — change the default
"Mon,Tue,Wed,Thu,Fri"in the script if your shop has a different baseline (e.g., 4-10s onMon,Tue,Wed,Thu). - Multiple time zones — if remote employees are in different timezones, add a 4th Roster column for
timezoneand adjusttodayper employee. The script currently uses the InTouch server's local date. - Escalation to manager — after N reminders to the same employee for the same week, also CC their manager. Add a
reminder_countper (email, week_start) in a separate tab. - Different message via SMS/Slack — replace the
gog gmail sendcall with asubprocess.run(["gog", ...])to message the employee via whatever channel their contact profile is set up on, OR call a different InTouchmessagetask with their contact name. For per-employee channel routing, store the channel in the Roster.
Companion artifacts
timesheet-collectorskill — processes employees' submitted hours from any messaging channel. Have its output append a row to TimesheetLog so this workflow knows who submitted.shop-status-digestmech-eng workflow — could be extended to count "pending timesheets" in the morning digest.
Verified
gog sheets get returning a 2D array of strings, row padding logic, weekday math, and gmail send all verified against the bundled gog v0.19.0 (2026-06-01) for flag/command syntax; re-verify output shapes on first run.
Source
See workflow.yaml.