AutomationFlowsAI & RAG › Import Google Keep Notes to Google Sheets Using Openai and Google Drive

Import Google Keep Notes to Google Sheets Using Openai and Google Drive

ByPollupAI @Pollup on n8n.io

This n8n workflow automates the import of your Google Keep notes into a structured Google Sheet, using Google Drive, OpenAI for AI-powered processing, and JSON file extraction. It's perfect for users who want to turn exported Keep notes into a searchable, filterable spreadsheet…

Event trigger★★★★☆ complexityAI-powered19 nodesOpenAI ChatGoogle DriveAgentGoogle Sheets
AI & RAG Trigger: Event Nodes: 19 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #3517 — we link there as the canonical source.

This workflow follows the Agent → Google Drive 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
{
  "nodes": [
    {
      "id": "ee3cd6ff-40ba-40d4-bbbf-90244da4a272",
      "name": "When clicking \u2018Test workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        0,
        -155
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "68584aab-c5f3-450a-a1e3-cddc8d64082d",
      "name": "Extract from File",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        1100,
        -280
      ],
      "parameters": {
        "options": {},
        "operation": "fromJson"
      },
      "typeVersion": 1
    },
    {
      "id": "e23a67a1-44df-4b83-a80a-9383f4432c7d",
      "name": "If is archived is false",
      "type": "n8n-nodes-base.if",
      "position": [
        1540,
        -280
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e051d2f2-7c22-4864-bbe7-4832cc54acaa",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              },
              "leftValue": "={{ $json.data.isArchived }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "313764d0-f115-46d3-a2e3-1fde647f7d85",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1848,
        -60
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "81fcc7a0-955d-4930-b203-8e98d57e3c4c",
      "name": "If extension is json",
      "type": "n8n-nodes-base.filter",
      "position": [
        660,
        -280
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "7b80be39-b5cc-4f96-8529-75559aaece38",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.name.split('.').pop(); }}",
              "rightValue": "=json"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "1c8c81ea-d0ae-4925-ae4b-05482c1b5fa2",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -340,
        -380
      ],
      "parameters": {
        "color": 4,
        "width": 260,
        "height": 440,
        "content": "## How to export your Google keep notes \n* Google has a dedicated service for exporting your google data, called [Google Takeout](https://takeout.google.com/), you'll have to login  it. \n* Click on \"Deselect all\" then select only Google Keep and click on \"Next\". \n- Select the destination (use \"Send download link via mail\" as you'll have to uncompress a zip file before to send it again to Google Drive)\n- Upload to Google Drive all json files from your uncompresed file, to specific directory and you are ready to start!\n"
      },
      "typeVersion": 1
    },
    {
      "id": "31eb6398-cca0-4ed1-910a-470fa49c9727",
      "name": "Search in \"Keep\" folder",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        220,
        -155
      ],
      "parameters": {
        "limit": 2,
        "filter": {
          "folderId": {
            "__rl": true,
            "mode": "list",
            "value": "1BggjRVCqyDnECK_mB2M-PYareptQv99P",
            "cachedResultUrl": "https://drive.google.com/drive/folders/1BggjRVCqyDnECK_mB2M-PYareptQv99P",
            "cachedResultName": "Keep"
          },
          "whatToSearch": "files"
        },
        "options": {},
        "resource": "fileFolder"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "653d04b2-4020-4254-a8f5-53e15228adb7",
      "name": "Loop every 10 items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        440,
        -155
      ],
      "parameters": {
        "options": {},
        "batchSize": 10
      },
      "typeVersion": 3
    },
    {
      "id": "c1171bd7-5e2d-49e6-a52b-6e9282cb093d",
      "name": "Download the files",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        880,
        -280
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "4d9caff3-2ac8-40fc-91a4-1b395e693141",
      "name": "Put some AI treatment here if you need it",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "notes": "Yu can use this AI Agent to process a number or anything you need from your notes",
      "position": [
        1760,
        -280
      ],
      "parameters": {
        "text": "=Extract the amount in euros of the input. output just the amount and nothing else. \nHere is the input:{{ $json.data.textContent }}",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 1.8
    },
    {
      "id": "d97c4e02-4b1a-479f-8492-e601c553ac57",
      "name": "Set the fields for export",
      "type": "n8n-nodes-base.set",
      "position": [
        2136,
        -280
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d05409ea-b739-47bd-9c07-0dea40b83de1",
              "name": "textContent",
              "type": "string",
              "value": "={{ $('If is archived is false').item.json.data.textContent }}"
            },
            {
              "id": "acbe202e-de95-4a47-a90b-78556fec4650",
              "name": "Edited",
              "type": "string",
              "value": "={{ new Date($('If is archived is false').item.json.data.userEditedTimestampUsec / 1000).toLocaleString() }}"
            },
            {
              "id": "13f00e53-75fd-4db5-9a22-b5e329c72b47",
              "name": "Created",
              "type": "string",
              "value": "={{ new Date($('If is archived is false').item.json.data.createdTimestampUsec / 1000).toLocaleString() }}"
            },
            {
              "id": "7e58e874-5238-4fb6-8b00-ea947c59ec4b",
              "name": "isArchived",
              "type": "boolean",
              "value": "={{ $('If is archived is false').item.json.data.isArchived }}"
            },
            {
              "id": "721f31d8-4944-4a63-878e-71816eee755c",
              "name": "Amount",
              "type": "string",
              "value": "={{ $json.output }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0f8d9b1f-f5de-477f-ad50-eeb89bcf8dc7",
      "name": "Add to google sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2356,
        -155
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [
            {
              "id": "textContent",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "textContent",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Edited",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Edited",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Created",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Created",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "isArchived",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "isArchived",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rjgyHw6XU4NTRCx4eXuQ0AIXhY3mWqxg1NiAhrSnuzE/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1rjgyHw6XU4NTRCx4eXuQ0AIXhY3mWqxg1NiAhrSnuzE",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rjgyHw6XU4NTRCx4eXuQ0AIXhY3mWqxg1NiAhrSnuzE/edit?usp=drivesdk",
          "cachedResultName": "googl keep export (10/05/25)"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "31141cf2-94d6-45ad-8632-18001a6d4d36",
      "name": "Filter",
      "type": "n8n-nodes-base.if",
      "position": [
        1320,
        -280
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "11bacf5f-6675-4681-b205-5e5293eaae02",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $json.data.textContentHtml }}",
              "rightValue": "d\u00e9pens\u00e9"
            },
            {
              "id": "c40da1df-559c-4278-bde1-cdb8e65c8428",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $json.data.textContentHtml }}",
              "rightValue": "depense"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "c4c941f5-6579-4f4f-9916-cdd496498760",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2300,
        -360
      ],
      "parameters": {
        "color": 5,
        "height": 360,
        "content": "## Create an empty google sheet file\n\nThat will get your entries from the notes "
      },
      "typeVersion": 1
    },
    {
      "id": "3ab60239-85cf-4c84-94d3-659fdfef4316",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        140,
        -300
      ],
      "parameters": {
        "color": 5,
        "height": 360,
        "content": "## Set the directory Where you put the files"
      },
      "typeVersion": 1
    },
    {
      "id": "49546099-e072-4183-a14e-fff80928920d",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1240,
        -480
      ],
      "parameters": {
        "color": 5,
        "height": 360,
        "content": "## Filter the files\n\nIf you need the content to contain a word, or after a certain date.\n\nIf you don't need to filter it, just remove the node"
      },
      "typeVersion": 1
    },
    {
      "id": "195923a2-faf9-40c3-95c0-08fdc078e291",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1720,
        -500
      ],
      "parameters": {
        "color": 5,
        "width": 320,
        "height": 560,
        "content": "## Process each file with AI\n\nIf you need the extract some information from the contextq, you can do it here. If you don't need it, just delete the node"
      },
      "typeVersion": 1
    },
    {
      "id": "07b3570a-72cf-480b-b3b8-fb461b57822d",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -340,
        80
      ],
      "parameters": {
        "color": 4,
        "width": 380,
        "height": 300,
        "content": "## Setup\n* Export your Google Keep notes (see \"how to export your Google Keep notes\")\n\n- Connect Google Drive, OpenAI, and Google Sheets in n8n.\n\n- Set the correct folder path for your notes in the \u201cSearch in \u2018Keep\u2019 folder\u201d node.\n\n- Point the Google Sheet node to your spreadsheet"
      },
      "typeVersion": 1
    },
    {
      "id": "48e1cff2-2748-4d15-91b4-d5ee2f5d9581",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -340,
        -500
      ],
      "parameters": {
        "width": 720,
        "height": 100,
        "content": "## Contact me\n### If you need some help with this workflow: Write to me: [thomas@pollup.net](mailto:thomas@pollup.net)\n"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Filter": {
      "main": [
        [
          {
            "node": "If is archived is false",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract from File": {
      "main": [
        [
          {
            "node": "Filter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Put some AI treatment here if you need it",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Download the files": {
      "main": [
        [
          {
            "node": "Extract from File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add to google sheet": {
      "main": [
        [
          {
            "node": "Loop every 10 items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop every 10 items": {
      "main": [
        [],
        [
          {
            "node": "If extension is json",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If extension is json": {
      "main": [
        [
          {
            "node": "Download the files",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If is archived is false": {
      "main": [
        [
          {
            "node": "Put some AI treatment here if you need it",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search in \"Keep\" folder": {
      "main": [
        [
          {
            "node": "Loop every 10 items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set the fields for export": {
      "main": [
        [
          {
            "node": "Add to google sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Test workflow\u2019": {
      "main": [
        [
          {
            "node": "Search in \"Keep\" folder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Put some AI treatment here if you need it": {
      "main": [
        [
          {
            "node": "Set the fields for export",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

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

About this workflow

This n8n workflow automates the import of your Google Keep notes into a structured Google Sheet, using Google Drive, OpenAI for AI-powered processing, and JSON file extraction. It's perfect for users who want to turn exported Keep notes into a searchable, filterable spreadsheet…

Source: https://n8n.io/workflows/3517/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.

OpenAI, HTTP Request, Form Trigger +7
AI & RAG

Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato 2. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 94 nodes.

@Blotato/N8N Nodes Blotato, Google Sheets, OpenAI Chat +9
AI & RAG

&gt; Note: This workflow uses sticky notes extensively to document each logical section of the automation. Sticky notes are mandatory and already included to explain OCR, AI parsing, folder logic, dup

QuickBooks, Google Sheets, Google Drive +5
AI & RAG

This template is designed for marketers, content creators, and e-commerce brands who want to automate the creation of professional ad videos at scale. It’s ideal for teams looking to generate consiste

Telegram, Telegram Trigger, Google Drive +8
AI & RAG

This comprehensive n8n workflow automates the entire Meta (Facebook/Instagram) advertising process, from asset analysis to ad creation. It combines AI-powered content analysis with automated ad deploy

Facebook Graph Api, HTTP Request, Google Drive +5