appscript.dev
Blog Sheets Docs

How I built an AI content pipeline in Sheets

Idea to published Northwind post, semi-automated — keyword in column A, published draft in column F.

By Awadesh Madhogaria · Published Jul 28, 2025

Northwind’s blog was always the thing that slipped. Writing posts was never urgent, so it never happened — and the half-finished drafts that did exist lived in six different places, scattered across Docs and chats.

The blog stalled for boring, structural reasons rather than a lack of effort. Every post started from a blank page, which is the slowest possible start. There was no visible answer to “where is this post”, so nothing ever got finished. The fix was not more discipline — it was a pipeline I could actually see.

So I did not build a tool that writes posts for me. I built an assembly line: a single Sheet where an idea moves left to right, one row per post, until it is published.

How the pipeline works

The whole process lives in one Sheet, with each column filled by a different script:

ColMeaning
AKeyword
BAI-generated outline
CHuman-edited outline
DAI-generated draft
EHuman-edited final
FPublished URL

The row moves left to right, and you can always see exactly how far it has got. I drop a keyword into column A; a script reads it and writes an AI-generated outline into column B. I edit that outline by hand into column C — fixing angle, order, and emphasis. A second script reads column C and writes a full AI draft into column D, which I then edit into the finished post in column E. When it goes live, the published URL lands in column F. A glance down the columns tells me which posts are stuck and where, so an idea can no longer quietly die. (The AI steps are powered by the approach in Generate a full content brief from a keyword.)

Why it is semi-automated on purpose

I deliberately did not chase full automation. LLMs produce roughly 80% drafts, and pushing a model the rest of the way — prompting, re-prompting, correcting — costs more time than simply editing the last 20% by hand. So the human steps in columns B/C and D/E are not a compromise. They are where the quality comes from: the AI proposes, I shape.

The fragile bit is the split between columns C and D. If I edit column C after the draft script has already run, the draft in column D does not refresh itself. If I rebuilt the pipeline, I would add a “stale” flag that lights up when an upstream column changes after a downstream one was generated. For now, I just watch the row dates.

Was it worth it

Plainly, yes:

  • The blog actually ships now — every post has a visible home and a clear next step.
  • No more blank pages: every post starts from an outline, not from nothing.
  • Idea to published draft is one Sheet, six columns, and two scripts.

A content pipeline does not need to write for you. It needs to make the work visible, so that the slow, structural reasons a blog stalls simply stop applying.