On a schedule
Post upcoming deadlines from a sheet to Teams
Each morning your Teams channel lists every item in your tracker due in the next two days, with the person responsible.
- Runs
- On a schedule
- Apps
- Google Sheets, Microsoft Teams
- AI
- Not needed
- Access
- Sheets read; ChannelMessage.Send
Send this to your assistant
Create a ClickRuntime automation: every weekday at 8:30am, post to our Teams channel every row in my Reviews sheet due in the next 2 days, with the assignee.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A compliance team at a mid-sized accounting firm tracks contract reviews, policy renewals and audit tasks in a shared Google Sheet. The sheet is accurate, but people only look at it when reminded, and the reminder usually comes from a manager the day something is already late.
A short list of what is due soon, posted where the team talks every day, makes the sheet work without anyone chasing. Compliance teams, project coordinators, editors and office managers use it to keep deadlines visible without moving their tracker to a new tool.
What you get out of it
Deadlines are seen before they are missed
Two days' notice gives the owner time to finish or ask for help. Fewer items slip quietly past their date.
No one has to chase
Managers no longer send individual reminders each morning. The channel post does it, and it is the same for everyone, so it never feels personal.
Keep the tracker you already use
The team continues working in the Google Sheet they know. There is no migration to a task tool and no new place to update.
Clear ownership
Each item is listed with the person responsible. Anyone can see at a glance who is handling what, which helps when someone is out of office.
How it works
What happens, step by step
Every weekday morning, ClickRuntime reads the rows in your Reviews sheet.
It keeps the open items with a due date between today and two days from now.
It posts one message to your Teams channel listing each item, its due date and who it is assigned to.
Before it runs live
- Connect your Google Sheets account and pick the spreadsheets it may use
- Connect Microsoft Teams
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Google Sheets and Microsoft Teams steps into one automation
Under the hood
The code that runs this automation
from datetime import date, timedelta
from dateutil import parser
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, credentials, http
SHEET_ID, TEAM_ID, CHANNEL_ID = "your-spreadsheet-id", "your-team-id", "your-channel-id"
@on_trigger
def run(event):
sheets = build("sheets", "v4", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False)
head, *rows = sheets.spreadsheets().values().get(spreadsheetId=SHEET_ID, range="Reviews!A1:Z").execute()["values"]
today, due = date.today(), []
for row in rows:
r = dict(zip(head, row))
try:
d = parser.parse(r.get("Due date", ""), dayfirst=True).date()
except (ValueError, OverflowError):
continue
if today <= d <= today + timedelta(days=2) and r.get("Status", "").lower() not in ("done", "complete"):
due.append(f"<li><b>{r.get('Item', '')}</b>: due {d:%a %d %b}, {r.get('Assignee', 'unassigned')}</li>")
if due:
http.post(f"https://graph.microsoft.com/v1.0/teams/{TEAM_ID}/channels/{CHANNEL_ID}/messages",
headers={"Authorization": f"Bearer {credentials.connection('microsoft', 'work')}"},
json={"body": {"contentType": "html", "content": "Due in the next 2 days:<ul>" + "".join(due) + "</ul>"}}).raise_for_status()
return {"due": len(due)}
FAQ
Common questions
What date format should the sheet use?
Are finished items left out?
Does it post on days when nothing is due?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Scan email links, log results and alert Teams on bad ones
Links in new emails are checked with VirusTotal, every result is logged in your Security sheet, and malicious ones are flagged in Teams.
See how it worksTurn sheet briefs into AI drafts reviewed in Teams
Add a brief to your sheet and an AI draft is written into the row and posted to your Teams channel for review.
See how it worksKnow the moment your website goes down
Your team hears in Slack when the site stops responding or slows down, and again when it's back.
See how it worksKeep exploring
Set up “Post upcoming deadlines from a sheet to Teams” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.