Google sheet to Google calendar

Hello, I am an new and beginner on n8n.

I created workflow for get event from Google sheet to Google Calendar as below;

Google sheet :
Event Name | Description | Start Date | End Date | Start Time | End Time | Reminder Minutes

When I fill an reminder (before event 1 week) it is work ,so in the calendar added it
But I want to add more remainders ( before event 10 mins, 1 week), it cannot add them.

What shoule I do? :thinking: Colud you help me.

Thanks in advance :folded_hands:

*n8n version: Version 1.91.3 and run on desktop

You can uncheck Set default reminders and configure your own:

1 Like

thank you for your help.

I forgot inform that at the reminders.
When I have 2 events, the first remind 10, 1week and the second remind 30, so there are the problem with google calendar node.

I try to fix in this node but it is alway error.

Do both input jsons have data to fill in the reminder values in the Calendar node?

yes, Json have the data

Well, I don’t know what could be the reason. If you want to give me an example sheet values (which I can copy) and embed your workflow for me to copy and try myself, I can take a look.

Here is JSON workflow and I have to hind my informations (Pls understand me)

Thank you very much

Google sheet

Event Name Description Start Date End Date Start Time End Time Reminder Minutes
name.com1 ctpcrm.tech 2025-06-29 2025-06-29 10:00 18:00 10,1week
name.com2 ctpcrm.tech 2025-06-29 2025-06-29 10:00 18:00 30

Pls see above post :folded_hands:

If you are trying to set a dynamic amount of reminders for each event, then you might have to use the Google Calendar API directly using a http node. Im not sure you can set a dynamic amount of reminders using the Google Canlendar node directly.

Here again

(https://drive.google.com/file/d/1dv5zx1ppmmB5jaZPOtFfdsFbV_FjCGWc/view?usp=sharing)

Thank you

I try to use Google Canlendar node, first. Also using HTTP node. But I cannot do it. :sweat_smile:

Would you like to share the workflow you tried with http node, which didn’t work?

Here this HTTP node :sweat_smile:

{
“nodes”: [
{
“parameters”: {
“pollTimes”: {
“item”: [
{
“mode”: “everyMinute”
}
]
},
“documentId”: {
“__rl”: true,
“value”: “{{Google Sheet ID}}”,
“mode”: “list”,
“cachedResultName”: “{{Google Sheet name}}”,
“cachedResultUrl”: “{{Google Sheet url}}”
},
“sheetName”: {
“__rl”: true,
“value”: “gid=0”,
“mode”: “list”,
“cachedResultName”: “sheet”,
“cachedResultUrl”: “{{Google Sheet url}}”
},
“event”: “rowAdded”,
“options”: {}
},
“type”: “n8n-nodes-base.googleSheetsTrigger”,
“typeVersion”: 1,
“position”: [
-420,
-160
],
“id”: “34b2fa08-4ba1-40db-9fd2-a53320806940”,
“name”: “Google Sheets Trigger”,
“credentials”: {
“googleSheetsTriggerOAuth”: {
“id”: “{{Google Sheets Trigger ID}}”,
“name”: “{{Google Sheets Trigger}}”
}
}
},
{
“parameters”: {
“jsCode”: “function padTime(timeStr) {\n const [h, m] = timeStr.split(‘:’);\n return ${h.padStart(2, '0')}:${m.padStart(2, '0')};\n}\n\nfunction parseReminders(input) {\n const reminders = ;\n const reminderParts = String(input).split(‘,’).map(part => part.trim().toLowerCase());\n for (const part of reminderParts) {\n let minutes;\n const num = parseInt(part);\n if (part.includes(‘week’)) minutes = num * 7 * 24 * 60;\n else if (part.includes(‘day’)) minutes = num * 24 * 60;\n else if (part.includes(‘hour’)) minutes = num * 60;\n else minutes = num || 10;\n if (!isNaN(minutes)) {\n reminders.push({\n method: ‘popup’,\n minutes: minutes\n });\n }\n }\n return reminders; //.length > 0 ? reminders : [{ method: ‘popup’, minutes: 10 }];\n}\n\nconst eventsToCreate = ;\nfor (const row of $input.all()) {\n const reminderInput = row.json[‘Reminder Minutes’] || ‘10’;\n const reminders = parseReminders(reminderInput);\n const startDate = row.json[‘Start Date’];\n const startTime = padTime(row.json[‘Start Time’]);\n const endDate = row.json[‘End Date’];\n const endTime = padTime(row.json[‘End Time’]);\n const eventData = {\n summary: row.json[‘Event Name’],\n description: row.json[‘Description’] || ‘’,\n start: {\n dateTime: ${startDate}T${startTime}:00,\n timeZone: ‘Asia/Bangkok’,\n },\n end: {\n dateTime: ${endDate}T${endTime}:00,\n timeZone: ‘Asia/Bangkok’,\n },\n reminders: {\n useDefault: false,\n overrides: reminders.slice(0, 5) // Google Calendar รองรับ max 5 overrides\n },\n };\n eventsToCreate.push({ json: eventData });\n}\nreturn eventsToCreate;\n”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
-240,
-160
],
“id”: “62477d01-3078-4954-aca0-ac305a45cb05”,
“name”: “Code”
},
{
“parameters”: {
“method”: “POST”,
“url”: “{{Google CalendarOAuth url}}”,
“authentication”: “predefinedCredentialType”,
“nodeCredentialType”: “{{googleCalendarOAuth}}”,
“sendBody”: true,
“specifyBody”: “json”,
“jsonBody”: “={\n \"summary\": \"={{ $json.summary }}\",\n \"description\": \"={{ $json.description }}\",\n \"start\": { \"dateTime\": \"={{ $json.start.dateTime }}\", \"timeZone\": \"Asia/Bangkok\" },\n \"end\": { \"dateTime\": \"={{ $json.end.dateTime }}\", \"timeZone\": \"Asia/Bangkok\" },\n \"reminders\": {\n \"useDefault\": false,\n \"overrides\": {{ JSON.stringify($json.reminders.overrides) }}\n }\n }"\n}”,
“options”: {}
},
“type”: “n8n-nodes-base.httpRequest”,
“typeVersion”: 4.2,
“position”: [
-40,
-160
],
“id”: “c6e7ae9c-54b7-4aeb-896b-1ca930876651”,
“name”: “HTTP Request”,
“credentials”: {
“httpHeaderAuth”: {
“id”: “{{httpAuthID}}”,
“name”: “{{Api Key Name}}”
},
“{{googleCalendarOAuth}}”: {
“id”: “{{googleCalendarOAuth Id}}”,
“name”: “{{Google Calendar Name}}”
}
}
}
],
“connections”: {
“Google Sheets Trigger”: {
“main”: [
[
{
“node”: “Code”,
“type”: “main”,
“index”: 0
}
]
]
},
“Code”: {
“main”: [
[
{
“node”: “HTTP Request”,
“type”: “main”,
“index”: 0
}
]
]
}
},
“pinData”: {},
“meta”: {
“templateCredsSetupCompleted”: true,
“instanceId”: “{{instanceID}}”
}
}

Please share your workflow in the code block. We are unable to use the above as this forum changes the formatting

image

Try this, worked like a charm for me

1 Like

Wow!! it is very nice to use hold on json in HTTP
I follow you that that is work! :clap:

Thank you so much :folded_hands: