On a schedule
Turn ideas in a sheet into approved LinkedIn posts
Each day the next idea in your sheet is written up, sent to you for approval, then published and marked done with its link.
- Runs
- On a schedule
- Apps
- Google Sheets, LinkedIn
- AI
- Yes, uses the built-in AI allowance
- Access
- Sheets edit; LinkedIn w_member_social
Send this to your assistant
Create a ClickRuntime automation: every weekday at 8, take the next idea from my LinkedIn Ideas sheet, write a post, email it to me with an approve link, and when I approve, publish it and write the post URL into the row.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A founder jots LinkedIn ideas into a sheet whenever something comes up: a lesson from a customer call, a hiring mistake, a product decision. The list is long; the posts are few, because turning a note into a good post takes half an hour.
Each weekday morning the next idea arrives as a finished draft by email. One click publishes it, and the row is updated with the link, so the founder posts regularly without giving up their mornings.
What you get out of it
Ideas become posts
Notes in a sheet turn into finished drafts, one a day.
You approve every post
Nothing goes out until you click approve.
Progress in the sheet
Each row shows whether it's been posted and links to it.
Add an image when you want
Put an image link in the row and it's attached to the post.
How it works
What happens, step by step
Every weekday morning, ClickRuntime reads the next unused idea from your sheet.
AI writes a LinkedIn post from it, and the draft is saved.
You get an email with the draft and an approve link.
When you approve, the post is published to LinkedIn and the row is updated with its link.
Before it runs live
- Connect your Google Sheets account and pick the spreadsheets it may use
- Connect LinkedIn
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
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Slack
- Combine it with other Google Sheets and LinkedIn steps into one automation
Under the hood
The code that runs this automation
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, on_event, credentials, http, ai, state, notify
AUTHOR, SHEET_ID, LINK = "urn:li:person:abc123", "your-spreadsheet-id", "https://run.clickruntime.example/t/abc123"
def sheet(): return build("sheets", "v4", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False).spreadsheets().values()
@on_trigger
def run(event):
if state.get("pending"):
return {"waiting": True}
rows = sheet().get(spreadsheetId=SHEET_ID, range="Ideas!A2:B").execute().get("values", [])
row = next((i + 2 for i, r in enumerate(rows) if r and len(r) < 2), None)
if not row:
return {"ideas": 0}
draft = ai.generate(f"Write a LinkedIn post from this idea, first person, no hashtags spam: {rows[row - 2][0]}", max_output_tokens=500).text
state.set("pending", {"row": row, "text": draft})
notify.email_me("LinkedIn draft to approve", f"{draft}\n\nApprove: {LINK}?approve=1")
return {"drafted": row}
@on_event
def approve(event):
p = state.get("pending")
r = http.post("https://api.linkedin.com/rest/posts", headers={"Authorization": f"Bearer {credentials.connection('linkedin', 'work')}", "LinkedIn-Version": "202409"},
json={"author": AUTHOR, "commentary": p["text"], "visibility": "PUBLIC", "lifecycleState": "PUBLISHED", "distribution": {"feedDistribution": "MAIN_FEED"}})
url = f"https://www.linkedin.com/feed/update/{r.headers.get('x-restli-id')}"
sheet().update(spreadsheetId=SHEET_ID, range=f"Ideas!B{p['row']}", valueInputOption="RAW", body={"values": [[url]]}).execute()
state.delete("pending")
return {"posted": url}FAQ
Common questions
What should an idea look like?
What if I don't approve a draft?
Can I skip an idea?
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
Post trending topics to LinkedIn and log them in a sheet
Trending topics in your field become LinkedIn posts, and every post is logged in your sheet with its link.
See how it worksDraft LinkedIn posts inspired by high-performing ones you collect
Posts you save to a sheet because they did well are studied, and new drafts in your own voice are added to the sheet, with one published each week.
See how it worksShare new articles on LinkedIn, tracked in a sheet
Each new article from your blog or a news feed becomes a LinkedIn post, and your sheet makes sure nothing is posted twice.
See how it worksKeep exploring
Set up “Turn ideas in a sheet into approved LinkedIn posts” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.