Google Sheets to Google Drive, voiceovers ready
You’ve got scripts sitting neatly in Google Sheets, but the “simple” voiceover step turns into a grind. Copy text. Generate audio. Download. Rename. Upload. Then someone asks, “Which file matches row 38?”
This is where Sheets Drive voiceovers automation pays off. Marketing managers feel it when production stalls, agency teams feel it during client delivery, and solo creators feel it when batching content eats a whole afternoon.
This workflow turns spreadsheet scripts into named WAV files in Google Drive, then writes the Drive link back to the same sheet. You’ll see what it does, what you need, and how it runs end-to-end.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to Google Drive, voiceovers ready
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "Convert to File", pos: "b", h: 48 }
n2@{ icon: "mdi:cog", form: "rounded", label: "Read/Write Files from Disk", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Code1"]
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter", pos: "b", h: 48 }
n6@{ icon: "mdi:database", form: "rounded", label: "Getting Video Scripts", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request To Generate Voice"]
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extracting fileName", pos: "b", h: 48 }
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Running FFMPEG Local Code To.."]
n10@{ icon: "mdi:cog", form: "rounded", label: "Running FFMPEG Code", pos: "b", h: 48 }
n11@{ icon: "mdi:cog", form: "rounded", label: "Writing File Output Onto Disk", pos: "b", h: 48 }
n12@{ icon: "mdi:cog", form: "rounded", label: "Uploading Wav File", pos: "b", h: 48 }
n13@{ icon: "mdi:database", form: "rounded", label: "Uploading Google Drive Link ..", pos: "b", h: 48 }
n3 --> n7
n5 --> n4
n1 --> n2
n4 --> n3
n12 --> n13
n8 --> n9
n10 --> n11
n6 --> n5
n2 --> n8
n11 --> n12
n7 --> n1
n0 --> n6
n9 --> n10
n13 --> n4
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n5 decision
class n6,n13 database
class n7 api
class n3,n9 code
classDef customIcon fill:none,stroke:none
class n3,n7,n9 customIcon
The Problem: Turning Scripts Into Voiceovers Is Still Manual
Script generation is fast now. The bottleneck is everything after. Once your scripts are approved in Google Sheets, somebody still has to run text-to-speech, keep filenames consistent, convert audio to a usable format, and store it where the editor can actually find it. It’s not hard work. It’s error-prone work. A missed rename or a misplaced download turns into a Slack thread, a re-export, and another round of “which version is this?”
It adds up fast. Here’s where it breaks down in real life:
- You end up handling the same file three times: download, rename, and re-upload.
- Rows in the sheet get “done” without a clean link to the actual WAV, so editors chase assets.
- Audio formats come out inconsistent, which means extra conversion steps before editing can even start.
- Batching 20 scripts becomes a repetitive admin session instead of a quick production run.
The Solution: Google Sheets → AI Voice → WAV → Drive (With Links Back)
This n8n workflow reads your script rows from Google Sheets, finds the ones you haven’t processed yet, and generates a voiceover for each using the Google Gemini Text-to-Speech API. It creates a safe, consistent filename (so you don’t get weird characters or duplicate names), saves the raw audio to disk, and runs FFmpeg locally to convert it into a standard WAV file. Then it uploads that WAV to a chosen Google Drive folder. Finally, it updates the original Google Sheet with the Drive link and marks the row complete, so production and editing stay in sync.
The workflow starts with a manual run trigger when you’re ready to generate a batch. From there it iterates through unprocessed rows, generates audio, converts it to WAV, and uploads it to Drive. The sheet becomes the tracking system, which means handoff is painless.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you generate 25 ad scripts in a Google Sheet each week. Manually, you might spend about 5 minutes per script generating audio, renaming, converting, and uploading, which is roughly 2 hours of repetitive work. With this workflow, you kick off one run (about 5 minutes to sanity-check settings), then let it process the batch in the background while it generates and converts files. When it’s done, your Google Drive folder has 25 properly named WAVs, and the sheet has links for instant handoff.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store scripts and status fields.
- Google Drive to store finished WAV files.
- Google Gemini API key (get it from Google AI Studio / Gemini API console).
Skill level: Advanced. You’ll be self-hosting n8n, setting file paths, and installing FFmpeg on the same machine.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
You start the run when you’re ready. A manual trigger kicks things off, which is handy when you want to generate voiceovers in clean batches after approvals.
Your Google Sheet becomes the source of truth. n8n retrieves script rows, filters to the ones not marked complete, then processes them in batches so you don’t overwhelm your APIs or your machine.
Voice generation and conversion happen automatically. Each script is sent to the Gemini TTS endpoint (HTTP Request), the returned audio is saved to disk, and FFmpeg runs locally (Execute Command) to convert it into a standard WAV file.
Drive gets the finished assets, and Sheets gets the receipt. n8n uploads the WAV to your chosen Google Drive folder, then updates the original sheet with the Drive link and a completed flag so nobody has to guess.
You can easily modify the voice style and naming rules to match your workflow, then keep the same Sheet-to-Drive handoff. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Run Trigger
This workflow starts manually so you can run voice generation on demand.
- Add and open Manual Run Trigger.
- Leave the default settings (no parameters required).
- Connect Manual Run Trigger to Retrieve Script Rows.
Step 2: Connect Google Sheets
Pull scripts from a sheet and later write back the audio links.
- Open Retrieve Script Rows and set Document to
[YOUR_ID]and Sheet toText Overlays. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Script Rows.
- Open Update Sheet With Links and confirm Operation is
appendOrUpdate. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Update Sheet With Links.
Step 3: Set Up Filtering and Batching
This step processes only rows that haven’t been voiced yet and iterates them one by one.
- Open Filter Unprocessed and verify the condition uses
{{ $json['Voice Generated?'] }}notEqualsYes. - Open Batch Iterator and keep the default settings to iterate each row.
- Confirm Update Sheet With Links loops back to Batch Iterator so each row is processed sequentially.
Step 4: Set Up Voice Generation and Local Audio Processing
These nodes generate audio, store it locally, and prepare a WAV using FFmpeg.
- In Build Safe Filename, keep the provided JavaScript to generate
safeFilenamefromfull_script_textandrow_number. - Open Voice Synthesis API and set URL to
https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContentand Method toPOST. - Set JSON Body to the existing expression and keep the prompt:
Say this script in a neutral <INSERT YOUR DESIRED ACCENT HERE> professional accent at a face pace enthusiastically: {{ $json.full_script_text }}. - In Voice Synthesis API add the query parameter key with
[CONFIGURE_YOUR_API_KEY]. - Open Binary File Converter and set Operation to
toBinary, Source Property tocandidates[0].content.parts[0].inlineData.data, File Name to{{ $('Build Safe Filename').item.json.safeFilename }}.pcm, and Mime Type to{{ $json.candidates[0].content.parts[0].inlineData.mimeType }}. - Open Write PCM to Disk and set File Name to
/Users/INSERT_YOUR_LOCAL_STORAGE_HERE/{{ $('Build Safe Filename').item.json.safeFilename }}.pcmwith Operation =write. - In Capture File Path, add the assignment fileName =
{{ $json.fileName }}. - Keep the provided code in Prepare FFmpeg Command to build the command and derive
wavPath. - Open Execute FFmpeg Job and set Command to
{{ $json.command }}. - Open Read WAV From Disk and set File Selector to
{{ $('Prepare FFmpeg Command').item.json.wavPath }}.
Step 5: Configure Drive Upload and Sheet Updates
Upload the WAV file and write back the links and status.
- Open Upload WAV to Drive and set Name to
{{ $('Build Safe Filename').item.json.safeFilename }}.wav. - Set Drive to
My Driveand Folder to/ (Root folder)or your target folder. - Credential Required: Connect your googleDriveOAuth2Api credentials in Upload WAV to Drive.
- Open Update Sheet With Links and confirm the mapped values: Voice Link =
{{ $json.webViewLink }}, Google Drive ID ={{ $json.id }}, Voice Generated? =Yes, Computer File Name ={{ $('Read WAV From Disk').item.json.fileName }}, Google Drive Download Link ={{ $json.webContentLink }}.
Step 6: Test and Activate Your Workflow
Run a manual test to validate end-to-end voice generation and file uploads.
- Click Execute Workflow on Manual Run Trigger to process one batch of rows.
- Confirm a
.pcmand.wavfile are created in your local path and that Execute FFmpeg Job completes without errors. - Verify Upload WAV to Drive creates a file and Update Sheet With Links writes the URLs and sets Voice Generated? to
Yes. - When satisfied, toggle the workflow to Active for production use.
Common Gotchas
- Google Sheets credentials can expire or lack edit access. If updates stop writing back, check the n8n credential status and confirm the sheet is shared with the connected Google account.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- FFmpeg is non-negotiable here, and path issues are common. If the Execute Command node fails, verify FFmpeg is installed on the same server as n8n and that the n8n user has permission to run it and read/write the target folder.
Frequently Asked Questions
Plan on about 1 hour, mostly for self-hosting and FFmpeg setup.
No, but you will need to be comfortable copying API keys and editing a local file path. The workflow includes code nodes, yet you typically won’t rewrite them unless you want custom naming logic.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Google Gemini API usage, which is typically pennies per batch for short scripts.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes. You can change the voice and accent in the “Voice Synthesis API” HTTP Request body, and you can adjust naming rules in the “Build Safe Filename” code node. Common tweaks include adding a campaign name prefix, using a “Scene” column from the sheet, or generating separate folders per client in Google Drive.
Usually it’s an auth or permission issue. Reconnect the Google Drive credential in n8n, confirm the target folder still exists, and make sure the connected account can upload to it. If it fails only on larger batches, you may also be hitting API quotas, so slowing the batch size helps.
Dozens per run is normal, and hundreds are possible if your server is sized for it and you keep batch sizes reasonable.
For this specific job, yes, because Zapier and Make don’t comfortably run local FFmpeg commands or write/read local files. This workflow depends on self-hosted n8n so it can save audio to disk, convert it, then upload the WAV. That’s the whole point. If your process doesn’t require local conversion, a lighter tool can be fine for simple “Sheet row → API call” automations. But once you add file handling, batching, and reliable write-backs to Sheets, n8n is frankly the easier long-term setup. If you want help choosing the right approach, Talk to an automation expert.
Once this is running, your sheet turns into a clean production queue and Drive becomes the asset library. The workflow takes the repetitive parts off your plate so you can ship more creative, faster.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.