Files
swarm-master/swarm-common/n8n-workflows/QRCCdHNXZUHc2Oz4.json
T
2026-06-04 13:26:50 -07:00

363 lines
14 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"updatedAt": "2026-05-14T00:01:24.692Z",
"createdAt": "2026-03-18T20:17:45.262Z",
"id": "QRCCdHNXZUHc2Oz4",
"name": "Calendar to Obsidian Notes",
"description": null,
"active": true,
"isArchived": false,
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"id": "schedule-trigger",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1,
"position": [
240,
304
]
},
{
"parameters": {
"operation": "getAll",
"calendar": {
"__rl": true,
"value": "william.valentin.info@gmail.com",
"mode": "list",
"cachedResultName": "Perso"
},
"limit": 20,
"options": {
"timeMin": "={{ new Date().toISOString() }}",
"timeMax": "={{ new Date(Date.now() + 7*24*60*60*1000).toISOString() }}",
"singleEvents": true,
"orderBy": "startTime"
}
},
"id": "get-events",
"name": "Get Upcoming Events",
"type": "n8n-nodes-base.googleCalendar",
"typeVersion": 1,
"position": [
464,
304
],
"credentials": {
"googleCalendarOAuth2Api": {
"id": "458fY4bs1z49OTeZ",
"name": "Google Calendar account"
}
},
"continueOnFail": true,
"alwaysOutputData": true
},
{
"parameters": {
"jsCode": "const event = $input.item.json || {};\nconst now = new Date();\nconst today = now.toISOString().slice(0, 10);\nconst hasUsableEvent = event.start && (event.summary || event.id || event.htmlLink);\nif (event.error || event.message || !hasUsableEvent) {\n const detail = String(event.error?.message || event.message || event.error || 'Google Calendar returned no usable event; credentials may need reauthorization.').replace(/`/g, \"'\").slice(0, 1000);\n const content = `---\ntitle: \"Google Calendar sync needs attention\"\narea: notes\ntags: [calendar, automation, degraded]\ncreated: ${today}\nupdated: ${today}\nstatus: needs-reauth\n---\n\n# Google Calendar sync needs attention\n\nThe n8n Calendar to Obsidian workflow could not read Google Calendar events.\n\nLikely cause: expired Google OAuth credentials in n8n.\n\nAction: reauthorize the Google Calendar credential used by workflow QRCCdHNXZUHc2Oz4, then run the workflow manually.\n\nLast observed detail:\n\n> ${detail}\n`;\n return [{ json: { path: `Notes/Calendar Sync Status/${today} Google Calendar Needs Reauth.md`, content, title: 'Google Calendar sync needs attention', date: today, degraded: true } }];\n}\nconst event = $input.item.json;\nconst startRaw = event.start?.dateTime || event.start?.date || \"\";\nconst date = startRaw.split(\"T\")[0];\nconst title = (event.summary || \"Untitled Event\").replace(/[\\/\\\\?%*:|\"<>]/g, \"-\").substring(0, 80);\nconst location = event.location || \"\";\nconst description = event.description || \"\";\nconst attendees = (event.attendees || []).map(a => a.email).join(\", \");\nconst endRaw = event.end?.dateTime || event.end?.date || \"\";\nconst startTime = startRaw.includes(\"T\") ? startRaw.split(\"T\")[1].substring(0,5) : \"All day\";\nconst endTime = endRaw.includes(\"T\") ? endRaw.split(\"T\")[1].substring(0,5) : \"\";\nconst timeStr = endTime ? `${startTime} ${endTime}` : startTime;\nconst frontmatter = `---\\ntitle: \"${title}\"\\narea: notes\\ntags: [calendar, event]\\ncreated: ${date}\\nupdated: ${date}\\nstatus: active\\nevent_date: ${date}\\nevent_time: \"${timeStr}\"\\n---`;\nconst content = `${frontmatter}\\n\\n# ${title}\\n\\n**Date:** ${date}\\n**Time:** ${timeStr}\\n${location ? `**Location:** ${location}\\n` : \"\"}${attendees ? `**Attendees:** ${attendees}\\n` : \"\"}\\n## Description\\n\\n${description || \"_No description_\"}\\n\\n## Notes\\n\\n_Add notes here_\\n`;\nreturn [{ json: { path: `Notes/${date} ${title}.md`, content, title, date, timeStr } }];"
},
"id": "format-note",
"name": "Format Event Note",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
688,
304
]
},
{
"parameters": {
"method": "PUT",
"url": "=http://192.168.153.130:27123/vault/{{ encodeURIComponent($json.path).replace(/%2F/g, \"/\") }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"contentType": "raw",
"rawContentType": "text/markdown",
"body": "={{ $json.content }}",
"options": {
"response": {
"response": {
"neverError": true
}
}
}
},
"id": "write-to-vault",
"name": "Write to Vault",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
912,
304
],
"credentials": {
"httpHeaderAuth": {
"id": "465Swz2b71O2KRAK",
"name": "Obsidian Local REST API"
}
}
}
],
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Get Upcoming Events",
"type": "main",
"index": 0
}
]
]
},
"Get Upcoming Events": {
"main": [
[
{
"node": "Format Event Note",
"type": "main",
"index": 0
}
]
]
},
"Format Event Note": {
"main": [
[
{
"node": "Write to Vault",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"callerPolicy": "workflowsFromSameOwner",
"availableInMCP": false
},
"staticData": {
"node:Schedule Trigger": {
"recurrenceRules": [
6
]
}
},
"meta": null,
"pinData": {},
"versionId": "40b22838-7ce4-4632-b186-b78ccda438c4",
"activeVersionId": "40b22838-7ce4-4632-b186-b78ccda438c4",
"versionCounter": 1636,
"triggerCount": 1,
"shared": [
{
"updatedAt": "2026-03-18T20:17:45.264Z",
"createdAt": "2026-03-18T20:17:45.264Z",
"role": "workflow:owner",
"workflowId": "QRCCdHNXZUHc2Oz4",
"projectId": "WGdp8QunI1tHpjXa",
"project": {
"updatedAt": "2026-03-11T21:08:10.005Z",
"createdAt": "2026-03-11T21:05:11.541Z",
"id": "WGdp8QunI1tHpjXa",
"name": "will will <will@wills-portal.com>",
"type": "personal",
"icon": null,
"description": null,
"creatorId": "5ad50ead-6e6a-4d12-ab5b-e5db15835bb5"
}
}
],
"tags": [
{
"updatedAt": "2026-03-19T04:40:29.915Z",
"createdAt": "2026-03-19T04:40:29.915Z",
"id": "GLr9Awuvw8uO7ZRP",
"name": "calendar"
},
{
"updatedAt": "2026-03-19T04:40:29.892Z",
"createdAt": "2026-03-19T04:40:29.892Z",
"id": "VfqIkUpiu2YMBSHw",
"name": "obsidian-sync"
}
],
"activeVersion": {
"updatedAt": "2026-05-14T00:01:24.693Z",
"createdAt": "2026-05-14T00:01:24.693Z",
"versionId": "40b22838-7ce4-4632-b186-b78ccda438c4",
"workflowId": "QRCCdHNXZUHc2Oz4",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"id": "schedule-trigger",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1,
"position": [
240,
304
]
},
{
"parameters": {
"operation": "getAll",
"calendar": {
"__rl": true,
"value": "william.valentin.info@gmail.com",
"mode": "list",
"cachedResultName": "Perso"
},
"limit": 20,
"options": {
"timeMin": "={{ new Date().toISOString() }}",
"timeMax": "={{ new Date(Date.now() + 7*24*60*60*1000).toISOString() }}",
"singleEvents": true,
"orderBy": "startTime"
}
},
"id": "get-events",
"name": "Get Upcoming Events",
"type": "n8n-nodes-base.googleCalendar",
"typeVersion": 1,
"position": [
464,
304
],
"credentials": {
"googleCalendarOAuth2Api": {
"id": "458fY4bs1z49OTeZ",
"name": "Google Calendar account"
}
},
"continueOnFail": true,
"alwaysOutputData": true
},
{
"parameters": {
"jsCode": "const event = $input.item.json || {};\nconst now = new Date();\nconst today = now.toISOString().slice(0, 10);\nconst hasUsableEvent = event.start && (event.summary || event.id || event.htmlLink);\nif (event.error || event.message || !hasUsableEvent) {\n const detail = String(event.error?.message || event.message || event.error || 'Google Calendar returned no usable event; credentials may need reauthorization.').replace(/`/g, \"'\").slice(0, 1000);\n const content = `---\ntitle: \"Google Calendar sync needs attention\"\narea: notes\ntags: [calendar, automation, degraded]\ncreated: ${today}\nupdated: ${today}\nstatus: needs-reauth\n---\n\n# Google Calendar sync needs attention\n\nThe n8n Calendar to Obsidian workflow could not read Google Calendar events.\n\nLikely cause: expired Google OAuth credentials in n8n.\n\nAction: reauthorize the Google Calendar credential used by workflow QRCCdHNXZUHc2Oz4, then run the workflow manually.\n\nLast observed detail:\n\n> ${detail}\n`;\n return [{ json: { path: `Notes/Calendar Sync Status/${today} Google Calendar Needs Reauth.md`, content, title: 'Google Calendar sync needs attention', date: today, degraded: true } }];\n}\nconst event = $input.item.json;\nconst startRaw = event.start?.dateTime || event.start?.date || \"\";\nconst date = startRaw.split(\"T\")[0];\nconst title = (event.summary || \"Untitled Event\").replace(/[\\/\\\\?%*:|\"<>]/g, \"-\").substring(0, 80);\nconst location = event.location || \"\";\nconst description = event.description || \"\";\nconst attendees = (event.attendees || []).map(a => a.email).join(\", \");\nconst endRaw = event.end?.dateTime || event.end?.date || \"\";\nconst startTime = startRaw.includes(\"T\") ? startRaw.split(\"T\")[1].substring(0,5) : \"All day\";\nconst endTime = endRaw.includes(\"T\") ? endRaw.split(\"T\")[1].substring(0,5) : \"\";\nconst timeStr = endTime ? `${startTime} ${endTime}` : startTime;\nconst frontmatter = `---\\ntitle: \"${title}\"\\narea: notes\\ntags: [calendar, event]\\ncreated: ${date}\\nupdated: ${date}\\nstatus: active\\nevent_date: ${date}\\nevent_time: \"${timeStr}\"\\n---`;\nconst content = `${frontmatter}\\n\\n# ${title}\\n\\n**Date:** ${date}\\n**Time:** ${timeStr}\\n${location ? `**Location:** ${location}\\n` : \"\"}${attendees ? `**Attendees:** ${attendees}\\n` : \"\"}\\n## Description\\n\\n${description || \"_No description_\"}\\n\\n## Notes\\n\\n_Add notes here_\\n`;\nreturn [{ json: { path: `Notes/${date} ${title}.md`, content, title, date, timeStr } }];"
},
"id": "format-note",
"name": "Format Event Note",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
688,
304
]
},
{
"parameters": {
"method": "PUT",
"url": "=http://192.168.153.130:27123/vault/{{ encodeURIComponent($json.path).replace(/%2F/g, \"/\") }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"contentType": "raw",
"rawContentType": "text/markdown",
"body": "={{ $json.content }}",
"options": {
"response": {
"response": {
"neverError": true
}
}
}
},
"id": "write-to-vault",
"name": "Write to Vault",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
912,
304
],
"credentials": {
"httpHeaderAuth": {
"id": "465Swz2b71O2KRAK",
"name": "Obsidian Local REST API"
}
}
}
],
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Get Upcoming Events",
"type": "main",
"index": 0
}
]
]
},
"Get Upcoming Events": {
"main": [
[
{
"node": "Format Event Note",
"type": "main",
"index": 0
}
]
]
},
"Format Event Note": {
"main": [
[
{
"node": "Write to Vault",
"type": "main",
"index": 0
}
]
]
}
},
"authors": "will will",
"name": null,
"description": null,
"autosaved": false,
"workflowPublishHistory": [
{
"createdAt": "2026-05-14T00:01:24.723Z",
"id": 1466,
"workflowId": "QRCCdHNXZUHc2Oz4",
"versionId": "40b22838-7ce4-4632-b186-b78ccda438c4",
"event": "activated",
"userId": "5ad50ead-6e6a-4d12-ab5b-e5db15835bb5"
},
{
"createdAt": "2026-05-14T00:01:24.711Z",
"id": 1465,
"workflowId": "QRCCdHNXZUHc2Oz4",
"versionId": "40b22838-7ce4-4632-b186-b78ccda438c4",
"event": "deactivated",
"userId": "5ad50ead-6e6a-4d12-ab5b-e5db15835bb5"
}
]
}
}