惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
D
DataBreaches.Net
C
Check Point Blog
雷峰网
雷峰网
小众软件
小众软件
GbyAI
GbyAI
美团技术团队
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
WordPress大学
WordPress大学
MyScale Blog
MyScale Blog
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
Apple Machine Learning Research
Apple Machine Learning Research
Y
Y Combinator Blog
Jina AI
Jina AI
爱范儿
爱范儿
Last Week in AI
Last Week in AI
MongoDB | Blog
MongoDB | Blog
I
InfoQ
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Stop drowning in files: auto-organize your Google Drive w...
Alex Kane · 2026-05-22 · via DEV Community

Your Google Drive is a mess. Don't lie.

Downloads folder. Desktop. Shared drives. Inbox attachments saved without thinking. After a year of casual saving, you've got PDFs next to vacation photos next to invoices next to half-finished presentations — and nothing is findable.

The fix isn't a "digital declutter weekend." That takes hours and you'll slide back in two weeks. The fix is an automation that runs forever and silently keeps everything sorted for you.

Here's a 4-node n8n workflow that watches a Google Drive folder and automatically moves every new file into the right sub-folder — PDFs, Images, Spreadsheets, Documents, Presentations, Videos — with a date prefix so files sort chronologically without renaming anything manually.


What the workflow does

Node 1 — Google Drive Trigger: watch a folder

Polls a specific Google Drive folder every minute for new files. The moment a file lands in your "Inbox" folder (your drop zone), the workflow fires.

Node 2 — Code node: classify by type + generate new name

Looks at the file's MIME type and filename extension:

  • application/pdf or .pdf → PDFs
  • image/* or .jpg/.jpeg/.png/.gif/.svg/.webp → Images
  • spreadsheet MIME or .xlsx/.xls/.csv → Spreadsheets
  • document MIME or .doc/.docx/.txt/.md → Documents
  • presentation MIME or .ppt/.pptx → Presentations
  • video/* or .mp4/.mov/.avi → Videos
  • Everything else → Other

Also prepends today's date: 2026-05-22_invoice-client.pdf. Every folder sorts automatically from oldest to newest — no manual date-tagging ever.

Node 3 — Google Drive: move to folder

Moves the file from the Inbox folder into the classified sub-folder. Two-second operation. The original file is gone from your drop zone, organized where it belongs.

Node 4 — Google Sheets: log the action

Appends a row to a FileLog sheet: fileId, fileName, targetFolder, newName. Full audit trail: every file ever sorted, when it was sorted, where it went.


Setup (5 minutes)

  1. Create the folder structure in Google Drive:

    • Inbox/ (your drop zone)
    • Files/PDFs/
    • Files/Images/
    • Files/Spreadsheets/
    • Files/Documents/
    • Files/Presentations/
    • Files/Videos/
    • Files/Other/
  2. Import the JSON into n8n (New Workflow → Import from clipboard)

  3. Connect your Google account in the Drive Trigger, Drive, and Sheets nodes (one OAuth connection covers all three)

  4. Set your folder IDs in Node 1 (Inbox folder ID) and Node 3 (target folder IDs — one per category). Get folder IDs from the URL when you open a folder in Drive: drive.google.com/drive/folders/FOLDER_ID_HERE

  5. Create a Google Sheet called FileLog and set its ID in Node 4

  6. Activate the workflow — it now runs forever

From now on: drop anything into Inbox, it's organized in under 60 seconds.


Full workflow JSON

{
  "name": "File Organizer",
  "nodes": [
    {
      "parameters": {
        "pollTimes": {"item": [{"mode": "everyMinute"}]},
        "triggerOn": "specificFolder",
        "folderToWatch": {"__rl": true, "value": "YOUR_INBOX_FOLDER_ID", "mode": "id"}
      },
      "id": "fo1", "name": "Watch Google Drive",
      "type": "n8n-nodes-base.googleDriveTrigger", "typeVersion": 1, "position": [240, 300]
    },
    {
      "parameters": {
        "jsCode": "const file = $input.first().json;\nconst name = file.name || '';\nconst mime = file.mimeType || '';\nlet folder = 'Other';\nif (mime.includes('pdf') || name.endsWith('.pdf')) folder = 'PDFs';\nelse if (mime.includes('image') || /\\.(jpg|jpeg|png|gif|svg|webp)$/i.test(name)) folder = 'Images';\nelse if (mime.includes('spreadsheet') || /\\.(xlsx|xls|csv)$/i.test(name)) folder = 'Spreadsheets';\nelse if (mime.includes('document') || /\\.(doc|docx|txt|md)$/i.test(name)) folder = 'Documents';\nelse if (mime.includes('presentation') || /\\.(ppt|pptx)$/i.test(name)) folder = 'Presentations';\nelse if (mime.includes('video') || /\\.(mp4|mov|avi)$/i.test(name)) folder = 'Videos';\nconst datePrefix = new Date().toISOString().split('T')[0];\nreturn [{ json: { fileId: file.id, fileName: name, targetFolder: folder, newName: datePrefix + '_' + name } }];"
      },
      "id": "fo2", "name": "Classify File Type",
      "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [480, 300]
    },
    {
      "parameters": {
        "operation": "move",
        "fileId": "={{ $json.fileId }}",
        "folderId": "={{ $json.targetFolder }}"
      },
      "id": "fo3", "name": "Move to Folder",
      "type": "n8n-nodes-base.googleDrive", "typeVersion": 3, "position": [720, 200]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {"__rl": true, "value": "YOUR_SHEET_ID", "mode": "id"},
        "sheetName": {"__rl": true, "value": "FileLog", "mode": "name"},
        "columns": {"mappingMode": "autoMapInputData"}
      },
      "id": "fo4", "name": "Log Action",
      "type": "n8n-nodes-base.googleSheets", "typeVersion": 4.5, "position": [720, 400]
    }
  ],
  "connections": {
    "Watch Google Drive": {"main": [[{"node": "Classify File Type", "type": "main", "index": 0}]]},
    "Classify File Type": {"main": [[{"node": "Move to Folder", "type": "main", "index": 0}, {"node": "Log Action", "type": "main", "index": 0}]]}
  },
  "settings": {"executionOrder": "v1"},
  "tags": [{"name": "file-management"}]
}

Enter fullscreen mode Exit fullscreen mode


Customizations

Add more file types
The Code node's classification logic is just a series of if/else statements. Add a line like:

else if (/\.(zip|tar|gz)$/i.test(name)) folder = 'Archives';

Enter fullscreen mode Exit fullscreen mode

for ZIP files, audio files, code files — whatever categories you need.

Use it as a shared team inbox
Share the Inbox folder with your team. Now anyone on the team can drop files and they'll auto-sort into the right place. Works great for shared client deliverables, design assets, or contract PDFs.

Add Slack notification
Append a Slack node after Node 3:

"✅ {{$json.fileName}} → {{$json.targetFolder}}"

Enter fullscreen mode Exit fullscreen mode

Great for team awareness when important files arrive.

Email attachment auto-saver
Pair this workflow with an n8n Gmail trigger that saves all attachments to the Inbox folder. Now every email attachment is automatically sorted by type and logged — your inbox clutter permanently solved.

Add AI-based naming
Replace the date prefix logic in the Code node with a call to the OpenAI or Claude API to generate a clean descriptive filename based on file content (for text-readable files). More complex but powerful for documents with generic names like scan001.pdf.


Why this compounds

Unlike a "clean up your files" session that you'll undo in a month, this workflow runs silently forever. The longer it runs, the better your files are organized. Set it up once in 5 minutes, and your Drive is permanently sorted.

The audit log in Sheets also means you can easily answer: where did that file go? Search by filename, filter by date, done.


Get the full automation bundle

This workflow is part of our 15-template n8n automation bundle — each one covering a different business use case: lead capture, invoice generation, AI customer support, social media automation, price monitoring, and more.

Grab the full bundle at stripeai.gumroad.com — pre-tested, documented, ready to activate.


Built with n8n. Self-hostable, open source, no vendor lock-in.