8
n8n 한국어amn8n.com

VLM Run AI와 Gmail 알림을 사용하여 Google Drive 이미지에서 출석 데이터를 Sheets로 추출

중급

이것은자동화 워크플로우로, 11개의 노드를 포함합니다.주로 Gmail, Webhook, GoogleDrive, HttpRequest, VlmRun 등의 노드를 사용하며. VLM Run AI와 Gmail 알림을 사용하여 Google Drive 이미지에서 근무 데이터를 Sheets로 추출합니다.

사전 요구사항
  • Google 계정 및 Gmail API 인증 정보
  • HTTP Webhook 엔드포인트(n8n이 자동으로 생성)
  • Google Drive API 인증 정보
  • 대상 API의 인증 정보가 필요할 수 있음

카테고리

-
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
  "meta": {
    "instanceId": "96d35e452e0d9a182973416b7532cfc5643239aaaa764a5bf74d52ca84f4a35c",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "0968592f-243a-4fb9-809c-2434e9375da3",
      "name": "VLM Run for Extraction",
      "type": "@vlm-run/n8n-nodes-vlmrun.vlmRun",
      "position": [
        496,
        -96
      ],
      "parameters": {
        "operation": "executeAgent",
        "agentPrompt": "=Analyze the image of user list names and show them in the following json format, make sure to follow this exact structure, where val1 will be current date, val2 will be total user count and rest of the values will be the user names:\n{ \\\"majorDimension\\\": \\\"ROWS\\\",   \\\"values\\\": [     [\\\"val1\\\", \\\"val2\\\"]   ] }",
        "agentCallbackUrl": "https://playground.attensys.ai/webhook/check-attendance"
      },
      "credentials": {
        "vlmRunApi": {
          "id": "B7ZYM8AfBgjnOEOl",
          "name": "VLM Run account 5"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "32cf5900-f3f2-4a05-b3d0-97848189f513",
      "name": "메모지",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        864,
        -480
      ],
      "parameters": {
        "color": 7,
        "width": 464,
        "height": 576,
        "content": "## 🟣 Append to Sheets + Send Email\n\n* ➕ **HTTP Request** calls Google Sheets `values:append` with `valueInputOption=RAW`, `insertDataOption=INSERT_ROWS`, `includeValuesInResponse=true`, then ✉️ **Gmail** sends the formatted attendance to the chosen recipient\n\n* 📥 Appends the received row into **Sheet1!A:Z** and formats the message where the first item is the date, the last item is the total, and the rest are numbered names\n\n🧪 Example input:\n{\"majorDimension\":\"ROWS\",\"values\":[[\"2025-10-03\",\"6\",\"Camila Torres Rivera\",...,\"Anisah Anif\"]]}\n\n\n📊 Result: a new row with date in column A, total count in column B, then each attendee name across subsequent columns, and an email sent with subject `Attendance List`\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e37ad5b4-1df1-4d4c-b07a-358ea7c2f8ef",
      "name": "메모지1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        -480
      ],
      "parameters": {
        "width": 416,
        "height": 576,
        "content": "## 🟡 VLM Run: Extraction Logic\n\n\n- 🤖 **Execute Agent** processes the downloaded image.  \n- 📝 **Prompt**: Return JSON in format `{ \"majorDimension\": \"ROWS\", \"values\": [[\"YYYY-MM-DD\", \"user_count\", \"name1\", \"name2\", ...]] }`.  \n- 🌐 Result posted to n8n webhook **`check-attendance`** (test endpoint).  \n- 📩 Webhook receives ready-to-append Sheets payload.  \n- 🧠 *Example output*:  \n  `{\"majorDimension\":\"ROWS\",\"values\":[[\"2025-10-03\",\"6\",\"Camila Torres Rivera\",\"Mellissa\"]]}`\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "c4b6f7e3-31ff-49ff-9640-c90950141a33",
      "name": "메모지2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -480
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 576,
        "content": "## 🟢 Google Drive: Monitor & Download\n\n* ⏱️ Google Drive Trigger checks the target folder every minute for **fileCreated** events\n\n* 🗂️ Trigger scope: the attendance images folder you selected\n\n* 🔗 Passes the new file **id** to the next node\n\n* ⬇️ Google Drive node downloads the file as binary under **data**\n\n* 📦 Output: the binary file is ready for the attendance extraction step\n"
      },
      "typeVersion": 1
    },
    {
      "id": "fbb0adca-34a1-41c0-847b-5fb7304f2c4a",
      "name": "메모지4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -864
      ],
      "parameters": {
        "color": 7,
        "width": 848,
        "height": 368,
        "content": "## 🧾 Attendance Extraction Pipeline\n\n**Overview:**\n\nUploads land in Google Drive → VLM Run’s Execute Agent reads names from the image or scan → Agent posts a clean JSON to the n8n Webhook → The workflow appends the row into Google Sheets.\n\n\nPerfect for:\nWhiteboard standups, workshop sign-ins, classroom roll calls.\n\n\n**Requirements:**\n\n* VLM Run API credentials with access to Execute Agent\n* Google Drive OAuth2 for trigger and download\n* Google Sheets OAuth2 for `values:append`\n* n8n Webhook reachable at `check-attendance` on the test endpoint\n"
      },
      "typeVersion": 1
    },
    {
      "id": "3d69f4a9-20f0-487e-9402-cd7f2ec1bd73",
      "name": "목록 수신",
      "type": "n8n-nodes-base.webhook",
      "position": [
        704,
        -96
      ],
      "webhookId": "706a3754-0987-4153-9193-29c27827d442",
      "parameters": {
        "path": "check-attendance",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "0e9e1a63-80b6-4366-bbf9-dd18bfab4efb",
      "name": "목록 업로드 모니터링",
      "type": "n8n-nodes-base.googleDriveTrigger",
      "notes": "Monitors Google Drive folder for new receipt uploads and triggers processing automatically.",
      "position": [
        64,
        -96
      ],
      "parameters": {
        "event": "fileCreated",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerOn": "specificFolder",
        "folderToWatch": {
          "__rl": true,
          "mode": "list",
          "value": "1S6baavqJn98MjUlbB6KtmARCWuWEekIZ",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1S6baavqJn98MjUlbB6KtmARCWuWEekIZ",
          "cachedResultName": "test_data"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "zYyIOFMdGz258avn",
          "name": "Google Drive account 6"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "bcdf4ec9-602c-402b-a929-54a0b73f2d70",
      "name": "목록 다운로드",
      "type": "n8n-nodes-base.googleDrive",
      "notes": "Downloads receipt files from Google Drive for AI processing.",
      "position": [
        240,
        -96
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {
          "binaryPropertyName": "data"
        },
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "zYyIOFMdGz258avn",
          "name": "Google Drive account 6"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "93549d62-06ba-491d-bb82-c9c79beeca71",
      "name": "새 출석 데이터를 Sheet에 추가",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        944,
        -80
      ],
      "parameters": {
        "url": "https://sheets.googleapis.com/v4/spreadsheets/1lg0aJKvd7E2pbhumHNjcgxUfEQKvlBs9h1zZbhSeqas/values/Sheet1!A:Z:append",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $json.body.response }}",
        "sendBody": true,
        "sendQuery": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "valueInputOption",
              "value": "RAW"
            },
            {
              "name": "insertDataOption",
              "value": "INSERT_ROWS"
            },
            {
              "name": "includeValuesInResponse",
              "value": "true"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "nodeCredentialType": "googleSheetsOAuth2Api"
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "sdLQgQJjowDNfXMU",
          "name": "Google Sheets account 7"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "bc39bbf9-24a1-422a-99d8-d318bb15c59c",
      "name": "메시지 전송",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1168,
        -80
      ],
      "webhookId": "dc974b24-8060-48c3-a143-c4441b191061",
      "parameters": {
        "sendTo": "mehediahamed@iut-dhaka.edu",
        "message": "={{\n(() => {\n  const raw = $json.updates?.updatedData?.values;\n\n  // Normalize to a flat array of strings\n  const parts = Array.isArray(raw)\n    ? (Array.isArray(raw[0]) ? raw[0] : raw).map(String)\n    : String(raw || \"\").split(\",\").map(s => s.trim());\n\n  if (!parts.length) return \"No data received\";\n\n  const date = parts[0];\n  const total = parts[1];\n  const names = parts.slice(2).filter(Boolean);\n\n  // Optional pretty date without relying on timezone parsing\n  const prettyDate = /^(\\d{4})-(\\d{2})-(\\d{2})$/.test(date)\n    ? date.replace(/^(\\d{4})-(\\d{2})-(\\d{2})$/, \"$3-$2-$1\")\n    : date;\n\n  const list = names.map((n, i) => `${i + 1}. ${n}`).join(\"<br>\");\n\n  return `Today's Attendance List (${prettyDate})<br>Total: ${total}<br>${list}`;\n})()\n}}\n",
        "options": {},
        "subject": "Attendance List"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "GrK9vxqscIwcG24Y",
          "name": "Gmail account 4"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "4c50399f-3901-4067-859c-241834696ea5",
      "name": "메모지3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        864,
        -640
      ],
      "parameters": {
        "color": 5,
        "width": 464,
        "height": 144,
        "content": "## 📝 Webhook: Set Public Callback URL\n\nPaste your n8n webhook’s Production URL into VLM Run’s Callback URL field—no localhost URLs (they’re unreachable)."
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "bcdf4ec9-602c-402b-a929-54a0b73f2d70": {
      "main": [
        [
          {
            "node": "0968592f-243a-4fb9-809c-2434e9375da3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3d69f4a9-20f0-487e-9402-cd7f2ec1bd73": {
      "main": [
        [
          {
            "node": "93549d62-06ba-491d-bb82-c9c79beeca71",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0e9e1a63-80b6-4366-bbf9-dd18bfab4efb": {
      "main": [
        [
          {
            "node": "bcdf4ec9-602c-402b-a929-54a0b73f2d70",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "93549d62-06ba-491d-bb82-c9c79beeca71": {
      "main": [
        [
          {
            "node": "bc39bbf9-24a1-422a-99d8-d318bb15c59c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
자주 묻는 질문

이 워크플로우를 어떻게 사용하나요?

위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.

이 워크플로우는 어떤 시나리오에 적합한가요?

중급

유료인가요?

이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.

워크플로우 정보
난이도
중급
노드 수11
카테고리-
노드 유형7
난이도 설명

일정 경험을 가진 사용자를 위한 6-15개 노드의 중간 복잡도 워크플로우

저자
Shahrear

Shahrear

@shahrear

I’m Shahrear, a Software Engineer with over 5 years of experience in full-stack development and workflow automation. I specialize in building intelligent automations using n8n, helping teams streamline operations and boost productivity. I’m also an expert in developing custom n8n nodes, with published work on npm - including the @vlm-run/n8n-nodes-vlmrun package. Linkedin - https://www.linkedin.com/in/shahrear-amin/ Email - shahrearbinamin33@gmail.com

외부 링크
n8n.io에서 보기

이 워크플로우 공유

카테고리

카테고리: 34