YouTube video and channel transcripts to Google Sheets
One sheet row per video with the full transcript, title, channel, date and language, plus a column for your own LLM summary. Uses YouTube Transcript & Subtitles Scraper.
This workflow runs YouTube Transcripts Scraper (arcadium/youtube-transcripts) for a list of YouTube links (videos, Shorts, channels or playlists) and appends one row per video to a Google Sheet: the full transcript text with title, channel, publish date, length, caption language and word count. The sheet has an empty summary column for an optional LLM step that you add yourself.
Manual trigger → Apify: Run actor and get dataset → Code: one row per transcript → Google Sheets: Append row
File: workflow.json (n8n workflow export format, with sticky notes that repeat the setup steps).
What you need
| Credential | Where | Placeholder in the file |
|---|---|---|
| Apify API token | Apify Console → Settings → API & Integrations | REPLACE_WITH_YOUR_APIFY_CREDENTIAL_ID (credential type Apify API) |
| Google Sheets | n8n's Google Sheets OAuth2 credential | REPLACE_WITH_YOUR_GOOGLE_SHEETS_CREDENTIAL_ID |
| A spreadsheet | Your Google Drive | REPLACE_WITH_YOUR_SPREADSHEET_ID in the sheet URL |
The Apify node is Apify's official n8n node, package @apify/n8n-nodes-apify (checked against version 0.9.0, node version 2, operation Run actor and get dataset). On n8n Cloud search for "Apify" in the nodes panel. On self-hosted n8n: Settings → Community nodes → Install → @apify/n8n-nodes-apify.
Import
- Create a Google Sheet with a tab named Transcripts and this header row (the node maps columns by name):
videoId | title | channel | publishDate | durationSeconds | language | autoCaptions | wordCount | url | transcript | truncated | summary | scrapedAt
- n8n → Workflows → Import from File →
workflow.json. - Get transcripts: pick your Apify credential and edit the JSON input:
urls: video links (watch?v=,youtu.be, Shorts), bare video IDs, channel links (https://www.youtube.com/@handle) or playlist links.maxVideosPerSource: how many transcripts to take from each channel or playlist (5 in the template). Direct video links are not limited by it.languages: caption languages in order of preference;enalso matchesen-USanden-GB.captionType:any(creator captions first, auto-generated as fallback),manualorauto.- Optional:
publishedAfter/publishedBefore(YYYY-MM-DD) to limit channel videos by date. - Append to Google Sheets: pick your credential and paste your sheet URL.
- Click Execute workflow and check the sheet. To run it on a schedule, replace the manual trigger with a Schedule Trigger and set
publishedAfterso a run takes only recent uploads.
Optional: summarize with an LLM
No LLM is configured in the template. To fill the summary column, add an LLM node (for example Basic LLM Chain with your own chat model credential) between Transcripts to rows and Append to Google Sheets, with a prompt such as Summarize this transcript in 5 bullet points: {{ $json.transcript }}, then set summary from its output with an Edit Fields node. The LLM provider bills that step separately.
Cost per run
Pay per event. Prices are the actor's Store pricing at the time of writing (Free plan; paid Apify plans pay less). The live price is on the Store page.
| Event | Price | In this template |
|---|---|---|
| Transcript | $0.00248 ($2.48 per 1,000) | 1 video + up to 5 channel videos = at most $0.015 |
| Videos without captions, private, age-restricted or missing videos, repeats | free |
Plus Apify's small start event per run. The node caps a run at $0.50 (maxTotalChargeUsd).
What to expect
- A video without captions (or private, age-restricted, not found) comes back as a free row with
rowType: "error"and is skipped by Transcripts to rows. - A Google Sheets cell holds at most 50,000 characters. Transcripts longer than 49,000 characters are cut and the row gets
truncated = true; for full texts of long videos write to a database or a file instead. autoCaptions = truemeans the text comes from YouTube's speech recognition, not from the creator's captions.- Running the workflow again appends the same videos again. Delete old rows or use
publishedAfterfor repeated runs.