AutomationFlowsData & Sheets › Molehill.io Script to Video Automation

Molehill.io Script to Video Automation

molehill.io script to video automation. Uses googleSheets, chainLlm, lmChatOpenRouter, httpRequest. Scheduled trigger; 12 nodes.

Cron / scheduled trigger★★★★☆ complexityAI-powered12 nodesGoogle SheetsChain LlmOpenRouter ChatHTTP Request
Data & Sheets Trigger: Cron / scheduled Nodes: 12 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Chainllm → Google Sheets recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "molehill.io script to video automation",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -32,
        -128
      ],
      "id": "88815cf5-aef0-4a10-b176-86cd1083c7e0",
      "name": "Schedule Trigger"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -32,
        32
      ],
      "id": "3929019e-78fe-43fc-9ef1-0121e474a6e1",
      "name": "When clicking \u2018Execute workflow\u2019"
    },
    {
      "parameters": {
        "documentId": {},
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Sheet1",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ABn9Jx3EhuLGrGE0E7GTaR-OJY1QwfzxamD9qYA3bc0/edit#gid=0"
        },
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "Status",
              "lookupValue": "Pending"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        240,
        -48
      ],
      "id": "9a9f7237-00c3-4fb2-be6e-97a70473b246",
      "name": "Get row(s) in sheet",
      "credentials": {}
    },
    {
      "parameters": {
        "operation": "update",
        "documentId": {},
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Sheet1",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ABn9Jx3EhuLGrGE0E7GTaR-OJY1QwfzxamD9qYA3bc0/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "row_number": "={{ $json.row_number }}",
            "Status": "Processing"
          },
          "matchingColumns": [
            "row_number"
          ],
          "schema": [
            {
              "id": "Video Idea",
              "displayName": "Video Idea",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "displayName": "Status",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Video URL",
              "displayName": "Video URL",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "displayName": "row_number",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "number",
              "canBeUsedToMatch": true,
              "readOnly": true,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        448,
        -224
      ],
      "id": "1bb85596-7794-4ce9-be3d-bd842172c45a",
      "name": "Update row in sheet",
      "credentials": {}
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=You are a viral YouTube Shorts script writer. Create a short, punchy script (under 20 seconds when read aloud) for:\n\n{{ $json['Video Idea'] }}\n\nRequirements:\n- Hook the viewer in the first 3 seconds\n- Use simple, conversational language\n- Include emotional triggers (curiosity, surprise, humor)\n- End with a clear call-to-action\n- Format: [SCENE 1] [Description] [Voiceover]\n\nReturn only the script, nothing else.",
        "batching": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.7,
      "position": [
        448,
        -48
      ],
      "id": "91a35697-5563-41e2-8bd5-3a195224f07e",
      "name": "Basic LLM Chain"
    },
    {
      "parameters": {
        "model": "google/gemini-2.5-flash",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "typeVersion": 1,
      "position": [
        448,
        128
      ],
      "id": "25d202e9-ce8f-4511-97d1-98e5892c5349",
      "name": "OpenRouter Chat Model",
      "credentials": {}
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://queue.fal.run/fal-ai/kling-video/v2/master/text-to-video",
        "authentication": "",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"prompt\": \"Create a 5 second short form video with the following script:\\n\\n{{ $json.text.replaceAll('\\n','')}}\",\n  \"duration\": \"5\",\n  \"aspect_ratio\": \"9:16\"\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        752,
        -48
      ],
      "id": "f645a22b-c592-4f70-844b-4f548283ee52",
      "name": "Create Video",
      "credentials": {}
    },
    {
      "parameters": {
        "url": "=https://queue.fal.run/fal-ai/kling-video/requests/{{ $json.request_id }}/status",
        "authentication": "",
        "genericAuthType": "httpHeaderAuth",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        960,
        -48
      ],
      "id": "abc252e7-76eb-47d8-a84e-dbc66fa2211e",
      "name": "Check Status",
      "credentials": {}
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "c7cc41cc-71bb-4707-8ca6-c57c51776643",
              "leftValue": "={{ $json.status }}",
              "rightValue": "COMPLETED",
              "operator": {
                "type": "string",
                "operation": "equals",
                "name": "filter.operator.equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1168,
        -48
      ],
      "id": "1068414c-1c89-460c-ac86-caec01b236e6",
      "name": "If"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        1168,
        192
      ],
      "id": "7124f602-ca33-4099-93e7-b2d646c7add7",
      "name": "Wait"
    },
    {
      "parameters": {
        "url": "={{ $json.response_url }}",
        "authentication": "",
        "genericAuthType": "httpHeaderAuth",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        1376,
        -144
      ],
      "id": "017ca047-b162-426c-9474-04c8a85e6337",
      "name": "HTTP Request",
      "credentials": {}
    },
    {
      "parameters": {
        "operation": "update",
        "documentId": {},
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Sheet1",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ABn9Jx3EhuLGrGE0E7GTaR-OJY1QwfzxamD9qYA3bc0/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "row_number": "={{ $('Get row(s) in sheet').item.json.row_number }}",
            "Video URL": "={{ $json.video.url }}",
            "Status": "Completed"
          },
          "matchingColumns": [
            "row_number"
          ],
          "schema": [
            {
              "id": "Video Idea",
              "displayName": "Video Idea",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "displayName": "Status",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Video URL",
              "displayName": "Video URL",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "displayName": "row_number",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "number",
              "canBeUsedToMatch": true,
              "readOnly": true,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        1584,
        -144
      ],
      "id": "03c9a92a-bb9f-4588-b7c1-db91bcecd27c",
      "name": "Update Sheet with Video",
      "credentials": {}
    }
  ],
  "connections": {
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Get row(s) in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get row(s) in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get row(s) in sheet": {
      "main": [
        [
          {
            "node": "Update row in sheet",
            "type": "main",
            "index": 0
          },
          {
            "node": "Basic LLM Chain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update row in sheet": {
      "main": [
        []
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Basic LLM Chain": {
      "main": [
        [
          {
            "node": "Create Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Video": {
      "main": [
        [
          {
            "node": "Check Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Status": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Check Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Update Sheet with Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "9021e126-3cc0-47e5-91db-3e0aaae0a056",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "u53F5OQXPlf8J6kl",
  "tags": []
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

molehill.io script to video automation. Uses googleSheets, chainLlm, lmChatOpenRouter, httpRequest. Scheduled trigger; 12 nodes.

Source: https://gist.github.com/molehillio/41ce1f46cd0a008373b2a5641e49c532 — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

Lead Generating Web Scraper & CRM Automation. Uses httpRequest, airtable, googleSheets, gmail. Scheduled trigger; 38 nodes.

HTTP Request, Airtable, Google Sheets +4
Data & Sheets

Automates Singapore COE price tracking with AI forecasts and buy/wait recommendations. Weekly scraping collects LTA data, enriches with economic indicators, predicts 6-month trends, and alerts users v

HTTP Request, Google Sheets, Agent +4
Data & Sheets

Splitout Code. Uses httpRequest, splitOut, lmChatAnthropic, spotify. Scheduled trigger; 37 nodes.

HTTP Request, Anthropic Chat, Spotify +3
Data & Sheets

RSS feeds. Uses googleSheets, rssFeedRead, chainLlm, lmChatOpenRouter. Event-driven trigger; 28 nodes.

Google Sheets, RSS Feed Read, Chain Llm +2
Data & Sheets

This workflow demonstrates a simple way to run evals on a set of test cases stored in a Google Sheet.

Google Sheets, Output Parser Structured, Chain Llm +3