Publicación de empleos en múltiples sitios de reclutamiento desde Google Sheets usando BrowserAct
Este es unHRflujo de automatización del dominio deautomatización que contiene 20 nodos.Utiliza principalmente nodos como If, Code, Slack, GoogleSheets, ManualTrigger. Uso de Google Sheets y BrowserAct para automatizar publicaciones de empleos multiplataforma
- •Bot Token de Slack o URL de Webhook
- •Credenciales de API de Google Sheets
Nodos utilizados (20)
Categoría
{
"id": "qMwMfHxAAddl6h5v",
"meta": {
"instanceId": "88804d8e264d231c18413147cc92e4245b20ae7b97d774bad847556f645c8192",
"templateCredsSetupCompleted": true
},
"name": "Post Jobs to Multiple Boards from Google Sheets using BrowerAct",
"tags": [],
"nodes": [
{
"id": "5f1b282a-3d24-47ba-975e-8b665bd685cb",
"name": "Al hacer clic en 'Ejecutar flujo de trabajo'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-592,
-48
],
"parameters": {},
"typeVersion": 1
},
{
"id": "6e59bf13-7e4a-49c1-9fc5-7ef9bd9d7793",
"name": "Obtener fila(s) en la hoja",
"type": "n8n-nodes-base.googleSheets",
"position": [
-400,
-48
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1104319058,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/18sw7io0yJOTDzvcknGmjBBqtK154CLk3k0FoWJZbfI0/edit#gid=1104319058",
"cachedResultName": "Job Example"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "18sw7io0yJOTDzvcknGmjBBqtK154CLk3k0FoWJZbfI0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/18sw7io0yJOTDzvcknGmjBBqtK154CLk3k0FoWJZbfI0/edit?usp=drivesdk",
"cachedResultName": "Test For BrowserAct"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "wAMAqU43zjVjlpuA",
"name": "Google Sheets account"
}
},
"typeVersion": 4.7
},
{
"id": "13fc2a7b-0c28-4f0c-b226-648bceca7536",
"name": "Ejecutar una tarea de flujo de trabajo",
"type": "n8n-nodes-browseract-workflows.browserAct",
"position": [
48,
-64
],
"parameters": {
"workflowId": "56841107053416567",
"inputParameters": {
"parameters": [
{
"name": "Target_Site",
"value": "={{ $json[\" Job_Board_URL\"] }}"
},
{
"name": "Job_Title",
"value": "={{ $json.Job_Title }}"
},
{
"name": "Job_Description",
"value": "={{ $json.Job_Description }}"
},
{
"name": "Phone_Number",
"value": "={{ $json.Phone_Number }}"
},
{
"name": "Address",
"value": "={{ $json.Address }}"
},
{
"name": "tags",
"value": "={{ $json.tags }}"
},
{
"name": "Company",
"value": "={{ $json.Company }}"
},
{
"name": "Login_Username",
"value": "={{ $json.Login_Username }}"
},
{
"name": "Login_Password",
"value": "={{ $json.Login_Password }}"
}
]
},
"additionalFields": {
"saveBrowserData": false
}
},
"credentials": {
"browserActApi": {
"id": "AzKMhR2eAlOjzDiJ",
"name": "BrowserAct account"
}
},
"typeVersion": 1
},
{
"id": "3741a23f-a304-445b-895d-4dd7dfcc7ccc",
"name": "Obtener detalles de una tarea de flujo de trabajo",
"type": "n8n-nodes-browseract-workflows.browserAct",
"onError": "continueErrorOutput",
"position": [
240,
-64
],
"parameters": {
"taskId": "={{ $json.id }}",
"operation": "getTask",
"waitForFinish": true
},
"credentials": {
"browserActApi": {
"id": "AzKMhR2eAlOjzDiJ",
"name": "BrowserAct account"
}
},
"typeVersion": 1
},
{
"id": "1d84240b-6345-4186-bf93-c31023b0bc13",
"name": "Actualizar fila en la hoja",
"type": "n8n-nodes-base.googleSheets",
"position": [
912,
-64
],
"parameters": {
"columns": {
"value": {
"Job_ID": "={{ $('Get row(s) in sheet').item.json.Job_ID }}",
"Status": "={{ $json.Status }}",
"Live_URL": "={{ $json.Url }}"
},
"schema": [
{
"id": "Job_ID",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Job_ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Posting_Status",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Posting_Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Job_Title",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Job_Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Job_Description",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Job_Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": " Job_Board_URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": " Job_Board_URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Login_Username",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Login_Username",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Login_Password",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Login_Password",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Phone_Number",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Phone_Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Address",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Live_URL",
"type": "string",
"display": true,
"required": false,
"displayName": "Live_URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "tags",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "tags",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Job_ID"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1104319058,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/18sw7io0yJOTDzvcknGmjBBqtK154CLk3k0FoWJZbfI0/edit#gid=1104319058",
"cachedResultName": "Job Example"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "18sw7io0yJOTDzvcknGmjBBqtK154CLk3k0FoWJZbfI0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/18sw7io0yJOTDzvcknGmjBBqtK154CLk3k0FoWJZbfI0/edit?usp=drivesdk",
"cachedResultName": "Test For BrowserAct"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "wAMAqU43zjVjlpuA",
"name": "Google Sheets account"
}
},
"typeVersion": 4.7
},
{
"id": "bcf633ed-6dd3-406b-9943-896fe11b0683",
"name": "Código en JavaScript",
"type": "n8n-nodes-base.code",
"position": [
704,
-64
],
"parameters": {
"jsCode": "// Get the JSON string using the exact path provided by the user.\nconst jsonString = $input.first().json.output.string;\n\nlet parsedData;\n\n// Check if the string exists before attempting to parse\nif (!jsonString) {\n // Return an empty array or throw an error if no string is found\n // Throwing an error is usually better to stop the workflow if data is missing.\n throw new Error(\"Input string is empty or missing at the specified path: $input.first().json.output.string\");\n}\n\ntry {\n // 1. Parse the JSON string into a JavaScript array of objects\n parsedData = JSON.parse(jsonString);\n} catch (error) {\n // Handle JSON parsing errors (e.g., if the string is malformed)\n throw new Error(`Failed to parse JSON string: ${error.message}`);\n}\n\n// 2. Ensure the parsed data is an array\nif (!Array.isArray(parsedData)) {\n throw new Error('Parsed data is not an array. It cannot be split into multiple items.');\n}\n\n// 3. Map the array of objects into the n8n item format { json: object }\n// Each element in this array will be treated as a new item by n8n, achieving the split.\nconst outputItems = parsedData.map(item => ({\n json: item,\n}));\n\n// 4. Return the new array of items\nreturn outputItems;"
},
"typeVersion": 2
},
{
"id": "2b987dff-8293-4723-9ea8-455727441cd2",
"name": "Si",
"type": "n8n-nodes-base.if",
"position": [
-224,
-48
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "a33df146-1505-417b-ba35-fc3c7823e244",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.Posting_Status }}",
"rightValue": "Ready to Post"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "34fccf50-7241-4f56-ac8c-8df73c017618",
"name": "Google Sheets Trigger",
"type": "n8n-nodes-base.googleSheetsTrigger",
"position": [
-400,
96
],
"parameters": {
"event": "rowUpdate",
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1104319058,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/18sw7io0yJOTDzvcknGmjBBqtK154CLk3k0FoWJZbfI0/edit#gid=1104319058",
"cachedResultName": "Job Example"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "18sw7io0yJOTDzvcknGmjBBqtK154CLk3k0FoWJZbfI0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/18sw7io0yJOTDzvcknGmjBBqtK154CLk3k0FoWJZbfI0/edit?usp=drivesdk",
"cachedResultName": "Test For BrowserAct"
}
},
"credentials": {
"googleSheetsTriggerOAuth2Api": {
"id": "r1f3Ap74oZQWWxYy",
"name": "Google Sheets Trigger account"
}
},
"typeVersion": 1
},
{
"id": "91723f53-45d3-45a8-b97c-1506acfb87ef",
"name": "Nota adhesiva - Introducción",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1136,
-384
],
"parameters": {
"width": 528,
"height": 450,
"content": "## Try It Out!\n### This powerful n8n template turns a Google Sheet into a control panel for automating job postings across multiple job boards.\n\n### How it works\n* The workflow can be triggered **manually** to post all pending jobs, or it runs **automatically** whenever you update a row in Google Sheets.\n* It reads job data directly from your Google Sheet.\n* An **If** node checks for a specific status, like 'Ready to Post', before proceeding.\n* A **BrowserAct** node then logs into the specified job board and automatically fills out and submits the job posting with the data from the sheet.\n* After the posting is successful, a **Code** node processes the result.\n* Finally, the workflow updates the original row in your Google Sheet with the live URL of the job post and a 'Posted' status.\n\n### Requirements\n* **BrowserAct** API account for automated posting.\n* **BrowserAct** n8n Community Node -> ([n8n Nodes BrowserAct](https://www.npmjs.com/package/n8n-nodes-browseract-workflows))\n* **Google Sheets** credentials.\n* A BrowserAct template named **“Automated Job Posting to Niche Job Site (Custom Site)”**.\n\n### Need Help?\nJoin the [Discord](https://discord.com/invite/UpnCKd7GaU) or Visit Our [Blog](https://www.browseract.com/blog)!\n"
},
"typeVersion": 1
},
{
"id": "a884ca62-a5b7-4115-9ef3-d04253d42862",
"name": "Nota adhesiva - Cómo usar",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1136,
80
],
"parameters": {
"width": 528,
"height": 228,
"content": "## How to use\n\n1. **Set up Credentials:** Add your credentials for **BrowserAct** and **Google Sheets** to the workflow.\n2. **Set up BrowserAct Template:** Ensure you Use the **“Automated Job Posting to Niche Job Site (Custom Site)”** template in your BrowserAct account.\n3. **Prepare Your Google Sheet:** Your sheet must contain columns for all the job data, like `Job_ID`, `Job_Title`, `Job_Description`, `Job_Board_URL`, `Login_Username`, `Login_Password`, and a `Posting_Status` column.\n4. **Trigger a Post:** To post a job, simply change the value in its `Posting_Status` column to **'Ready to Post'**. The Google Sheets Trigger will pick it up automatically.\n5. **Activate Workflow:** For full automation, activate the workflow. The Google Sheets trigger will then listen for changes."
},
"typeVersion": 1
},
{
"id": "5088b29a-d8e1-4b8d-9bdc-dfb676bb7c39",
"name": "Nota adhesiva - Necesita ayuda",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1136,
320
],
"parameters": {
"width": 528,
"height": 104,
"content": "### Need Help?\n* #### [How to Find Your BrowseAct API Key & Workflow ID](https://www.youtube.com/watch?v=pDjoZWEsZlE)\n* #### [How to Connect n8n to Browseract](https://www.youtube.com/watch?v=RoYMdJaRdcQ)\n* #### [How to Use & Customize BrowserAct Templates](https://www.youtube.com/watch?v=CPZHFUASncY)\n* #### [How to Use the BrowserAct N8N Community Node](https://youtu.be/j0Nlba2pRLU)\n"
},
"typeVersion": 1
},
{
"id": "b106ec53-560b-43ff-8b9e-8cfa9a8de7e9",
"name": "Nota adhesiva - Entrada y disparadores",
"type": "n8n-nodes-base.stickyNote",
"position": [
-464,
-288
],
"parameters": {
"color": 6,
"width": 416,
"height": 208,
"content": "### 🕹️ 1. Input & Trigger Control\n\nThis workflow has two ways to start:\n\n* **Google Sheets Trigger:** This is the primary method for real-time automation. It watches for row updates and will trigger the workflow for that specific row.\n* **Manual Trigger:** This path gets **all** rows from the sheet, and the `If` node then filters for any jobs that are 'Ready to Post'. This is useful for batch-posting multiple jobs at once.\n\nThe **If** node is the gatekeeper, ensuring only jobs you've approved get posted."
},
"typeVersion": 1
},
{
"id": "7303bb7d-d6b8-4348-959c-39879435b4df",
"name": "Nota adhesiva - Núcleo de automatización",
"type": "n8n-nodes-base.stickyNote",
"position": [
-16,
-288
],
"parameters": {
"color": 5,
"width": 400,
"height": 200,
"content": "### 🤖 2. The Automation Engine\n\nThese **BrowserAct** nodes are where the magic happens.\n\n* **Run a workflow task:** This node takes all the data from the filtered Google Sheet row (login details, job title, description, etc.) and sends it to your BrowserAct workflow to perform the automated posting.\n\n* **Get details...:** This node simply waits for the browser automation to complete before moving on."
},
"typeVersion": 1
},
{
"id": "73af619d-f874-4e1b-94e0-c0bf9177c434",
"name": "Nota adhesiva - Bucle de retroalimentación",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
-288
],
"parameters": {
"color": 3,
"width": 816,
"height": 200,
"content": "### 🔄 3. Feedback & Update & Send Alert\n\nThis final stage creates a critical feedback loop.\n\n* **Code Node:** This parses the results from the BrowserAct task to extract the final status and the URL of the live job posting.\n\n* **Update row in sheet:** This node updates the original Google Sheet row. It sets the `Status` to 'Posted' and adds the `Live_URL`. This prevents the workflow from accidentally re-posting the same job again.\n\n* **Slack Nodes:** Send Slack message, providing clear, actionable alerts to your team."
},
"typeVersion": 1
},
{
"id": "d6f5713e-e7e1-483c-b4cb-e00875706ce3",
"name": "Nota adhesiva",
"type": "n8n-nodes-base.stickyNote",
"position": [
-16,
-80
],
"parameters": {
"color": 5,
"width": 400,
"height": 176,
"content": ""
},
"typeVersion": 1
},
{
"id": "add8711a-864b-4b96-a0d1-97e4eb4af534",
"name": "Nota adhesiva1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-464,
-64
],
"parameters": {
"color": 6,
"width": 416,
"height": 304,
"content": ""
},
"typeVersion": 1
},
{
"id": "cd88ea7e-ce56-48ab-833d-8d8a67495b77",
"name": "Nota adhesiva2",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
-80
],
"parameters": {
"color": 3,
"width": 816,
"height": 288,
"content": ""
},
"typeVersion": 1
},
{
"id": "5bf223b4-2ce4-44a2-9125-cf64c2bbea7f",
"name": "Enviar un mensaje",
"type": "n8n-nodes-base.slack",
"position": [
1104,
-64
],
"webhookId": "01fb8ea5-9534-45f8-a069-7745ee2b8ec7",
"parameters": {
"text": "={{ $('Get row(s) in sheet').item.json.Job_ID }} added to Job List\nStatus : {{ $json.Status }}\n",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09KLV9DJSX",
"cachedResultName": "all-browseract-workflow-test"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"id": "5rQCkyObBqbHIbZA",
"name": "Slack account"
}
},
"typeVersion": 2.3
},
{
"id": "9ee840f8-ac5f-4183-8a69-4acfd98cb2af",
"name": "Si1",
"type": "n8n-nodes-base.if",
"position": [
512,
-64
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e2eb7caa-21f4-4095-8c78-19438adc085d",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.output.string }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "b6fe8efd-74b1-4f33-84a6-0e79062bdb23",
"name": "Enviar un mensaje1",
"type": "n8n-nodes-base.slack",
"position": [
704,
64
],
"webhookId": "01fb8ea5-9534-45f8-a069-7745ee2b8ec7",
"parameters": {
"text": "=Processing for Job ID {{ $('Get row(s) in sheet').item.json.Job_ID }} was skipped because an error occurred.\nStatus: Error. Please check the provided URL or data or Workflow for issues.",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09KLV9DJSX",
"cachedResultName": "all-browseract-workflow-test"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"id": "5rQCkyObBqbHIbZA",
"name": "Slack account"
}
},
"typeVersion": 2.3
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "f5e47078-51b9-494f-92d3-5216436e01c0",
"connections": {
"2b987dff-8293-4723-9ea8-455727441cd2": {
"main": [
[
{
"node": "13fc2a7b-0c28-4f0c-b226-648bceca7536",
"type": "main",
"index": 0
}
]
]
},
"9ee840f8-ac5f-4183-8a69-4acfd98cb2af": {
"main": [
[
{
"node": "bcf633ed-6dd3-406b-9943-896fe11b0683",
"type": "main",
"index": 0
}
],
[
{
"node": "b6fe8efd-74b1-4f33-84a6-0e79062bdb23",
"type": "main",
"index": 0
}
]
]
},
"bcf633ed-6dd3-406b-9943-896fe11b0683": {
"main": [
[
{
"node": "1d84240b-6345-4186-bf93-c31023b0bc13",
"type": "main",
"index": 0
}
]
]
},
"6e59bf13-7e4a-49c1-9fc5-7ef9bd9d7793": {
"main": [
[
{
"node": "2b987dff-8293-4723-9ea8-455727441cd2",
"type": "main",
"index": 0
}
]
]
},
"13fc2a7b-0c28-4f0c-b226-648bceca7536": {
"main": [
[
{
"node": "3741a23f-a304-445b-895d-4dd7dfcc7ccc",
"type": "main",
"index": 0
}
]
]
},
"1d84240b-6345-4186-bf93-c31023b0bc13": {
"main": [
[
{
"node": "5bf223b4-2ce4-44a2-9125-cf64c2bbea7f",
"type": "main",
"index": 0
}
]
]
},
"3741a23f-a304-445b-895d-4dd7dfcc7ccc": {
"main": [
[
{
"node": "9ee840f8-ac5f-4183-8a69-4acfd98cb2af",
"type": "main",
"index": 0
}
],
[
{
"node": "b6fe8efd-74b1-4f33-84a6-0e79062bdb23",
"type": "main",
"index": 0
}
]
]
},
"5f1b282a-3d24-47ba-975e-8b665bd685cb": {
"main": [
[
{
"node": "6e59bf13-7e4a-49c1-9fc5-7ef9bd9d7793",
"type": "main",
"index": 0
}
]
]
}
}
}¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Avanzado - Recursos Humanos
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
Madame AI Team | Kai
@madame-aiI’m a PhD in Physics turned AI enthusiast, passionate about uncovering how AI is transforming content creation, business, and daily life.
Compartir este flujo de trabajo