InTouch Hub · Blue Isle Software

Timesheet Reminder (Sheets-driven, selective)

Sheet-driven timesheet reminder. Reads a Roster + TimesheetLog Sheet, sends a reminder ONLY to people who haven't submitted this week's timesheet and ONLY on their working days. Pairs with the timesheet-collector skill (which writes TimesheetLog rows). Replaces the static workflow that pinged everyone every weekday regardless of submission state.

sheetsgmailtimesheethrreminderrosterweekly

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

  1. Credentials (Credentials view): - google-workspace — Google Workspace service-account JSON
  2. Runtime environment (Runtime Environments view): - python — auto-created on every install
  3. Pair with timesheet-collector skill (recommended, optional): - The skill processes employees' messaged-in hours and confirms back to them. Modify its output to append a row to TimesheetLog when a submission is complete, OR have a downstream task do that append.
  4. Sheet prep — Roster tab (3 cols, you maintain): A employee_name | B employee_email | C work_days work_days is a comma-separated list of three-letter day abbreviations the employee normally works: Mon,Tue,Wed,Thu,Fri for full-time, Tue,Thu for part-time, etc. Default if blank: weekdays only.
  5. 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_at week_start is the Monday of the week the timesheet covers. submitted_at is the timestamp the submission was logged. The workflow uses (B, C, non-empty E) to determine "has this person submitted for this week."
  6. 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
  7. Schedule weekdays at 8:45 AM (or one daily schedule — the script's work_days check filters off-days correctly).

Pipeline

  1. remindruntimeenv (python). Reads Roster!A2:C and TimesheetLog!A2:E. For each roster entry: skips if today isn't in their work_days, skips if they have a non-empty submitted_at for this week's Monday, otherwise sends a personalized reminder email and adds them to the digest. Prints a summary.
  2. notify-managermessage. 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

Companion artifacts

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.