Publication d'offres d'emploi sur plusieurs sites de recrutement depuis Google Sheets avec BrowserAct
Ceci est unHRworkflow d'automatisation du domainecontenant 20 nœuds.Utilise principalement des nœuds comme If, Code, Slack, GoogleSheets, ManualTrigger. Automatisation des publications d'offres d'emploi multiplateformes avec Google Sheets et BrowserAct
- •Token Bot Slack ou URL Webhook
- •Informations d'identification Google Sheets API
Nœuds utilisés (20)
Catégorie
{
"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": "Lors du clic sur 'Exécuter le workflow'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-592,
-48
],
"parameters": {},
"typeVersion": 1
},
{
"id": "6e59bf13-7e4a-49c1-9fc5-7ef9bd9d7793",
"name": "Obtenir une/des ligne(s) dans la feuille",
"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": "Exécuter une tâche de workflow",
"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": "Obtenir les détails d'une tâche de workflow",
"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": "Mettre à jour une ligne dans la feuille",
"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": "Code 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": "Déclencheur Google Sheets",
"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": "Note autocollante - Introduction",
"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": "Note autocollante - Mode d'emploi",
"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": "Note autocollante - Besoin d'aide",
"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": "Note autocollante - Entrées & Déclencheurs",
"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": "Note autocollante - Cœur de l'automatisation",
"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": "Note autocollante - Boucle de retour",
"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": "Note autocollante",
"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": "Note autocollante1",
"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": "Note autocollante2",
"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": "Envoyer un message",
"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": "Envoyer un message1",
"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
}
]
]
}
}
}Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Avancé - Ressources Humaines
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
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.
Partager ce workflow