Google Sheets에서 다중 스펙터스 제품을 Shopify에 가져오기
고급
이것은자동화 워크플로우로, 21개의 노드를 포함합니다.주로 Set, Code, Switch, Graphql, SplitOut 등의 노드를 사용하며. Google Sheets에서 다중 스펙트럼 제품을 Shopify에 가져오기
사전 요구사항
- •Google Sheets API 인증 정보
카테고리
-
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"meta": {
"instanceId": "b6be3264d10563f53f60f119665bef14019561878be2f73c07ebd4200e9255cf",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "ba37e8c9-0372-443a-92cc-55d7893547cc",
"name": "'워크플로 실행' 클릭 시",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-720,
320
],
"parameters": {},
"typeVersion": 1
},
{
"id": "454305c0-5593-4340-9224-dee5c937acdb",
"name": "시트에서 행 가져오기",
"type": "n8n-nodes-base.googleSheets",
"position": [
0,
320
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 2048403983,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1y7HlsC35Rn_fRtJ7GvJ38F0Aw9sycJ4New80lTOR0hc/edit#gid=2048403983",
"cachedResultName": "Products"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1y7HlsC35Rn_fRtJ7GvJ38F0Aw9sycJ4New80lTOR0hc",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1y7HlsC35Rn_fRtJ7GvJ38F0Aw9sycJ4New80lTOR0hc/edit?usp=drivesdk",
"cachedResultName": "Shopify Store Details"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "nOpKwVGZRUlHqyd8",
"name": "Google Sheets account"
}
},
"typeVersion": 4.7
},
{
"id": "b6b0846a-1b94-438b-b518-7ed51b3bdc6a",
"name": "Shopify, GetLocations",
"type": "n8n-nodes-base.graphql",
"position": [
-240,
320
],
"parameters": {
"query": "query {\n locations(first:1, reverse:true) {\n edges {\n node {\n id\n name\n address {\n address1\n address2\n city\n country\n zip\n province\n }\n }\n }\n }\n}",
"endpoint": "={{ $('set shop url').item.json.myshop }}",
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": {
"id": "90WivU6wv8VrB8sn",
"name": "Header Auth account shopify"
}
},
"executeOnce": true,
"typeVersion": 1.1
},
{
"id": "b7a3b2c1-0f79-4233-8731-1d5631dccd93",
"name": "Shopify, CreateProduct",
"type": "n8n-nodes-base.graphql",
"position": [
784,
64
],
"parameters": {
"query": "=mutation productCreate($product: ProductCreateInput!, $media: [CreateMediaInput!]) {\n productCreate(product: $product, media: $media) {\n product {\n id\n title\n handle\n options {\n id\n name\n position\n optionValues {\n id\n name\n }\n }\n variants(first:10) {\n edges {\n node {\n id\n sku\n displayName\n inventoryItem {\n id\n sku\n tracked\n requiresShipping\n }\n }\n }\n }\nmedia(first: 10) {\n edges {\n node {\n alt\n mediaContentType\n status\n id\n preview {\n image {\n url\n }\n status\n }\n }\n }\n }\n }\n userErrors {\n field\n message\n }\n }\n}",
"endpoint": "={{ $('set shop url').first().json.myshop }}",
"variables": "={\n \"product\": {\n \"title\": \"{{ $json.productName }}\",\n \"vendor\": \"vendor.\",\n \"productType\": \"type\",\n \"status\": \"ACTIVE\",\n \"handle\": \"{{ $json.productName.toLowerCase().replaceAll(' ', '-') }}\",\n \"productOptions\": \n{{JSON.stringify($json.optionsGraph) }}\n },\n \"media\": [\n {\n \"alt\": \"{{ $json.productName }}\",\n \"mediaContentType\": \"IMAGE\",\n \"originalSource\": \"{{ $json.productImage }}\"\n }\n ]\n}",
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": {
"id": "90WivU6wv8VrB8sn",
"name": "Header Auth account shopify"
}
},
"typeVersion": 1.1
},
{
"id": "a1171896-5b8f-4bb8-8d8f-bfc208d86f0b",
"name": "Split Out1",
"type": "n8n-nodes-base.splitOut",
"position": [
1280,
64
],
"parameters": {
"include": "selectedOtherFields",
"options": {},
"fieldToSplitOut": "variants",
"fieldsToInclude": "productId, productTitle, mainfirstVariant, mediaID"
},
"typeVersion": 1
},
{
"id": "4a93dc5f-19a4-4c14-b48f-0de54e24f226",
"name": "SetVariant",
"type": "n8n-nodes-base.graphql",
"position": [
1504,
64
],
"parameters": {
"query": "mutation ProductVariantsCreate($productId: ID!, $variants: [ProductVariantsBulkInput!]!) {\n productVariantsBulkCreate(productId: $productId, variants: $variants) {\n productVariants {\n id\n sku\n title\n price\n compareAtPrice\ninventoryItem {\n id\n sku\n tracked\n requiresShipping\n }\n \n selectedOptions {\n name\n value\n }\n }\n userErrors { \n\n field\n message\n }\n }\n }",
"endpoint": "={{ $('set shop url').first().json.myshop }}",
"variables": "={\n \"productId\": \"{{ $json.productId }}\",\n \"variants\": [\n {\n \"price\": {{ $json.variants.price }},\n \"optionValues\": [\n {\n \"name\": \"{{ $json.variants.inventoryItem.size }}\",\n \n \"optionId\": \"{{ $json.variants.optionValues[0].optionId }}\"\n }\n ]\n }\n ]\n}",
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": {
"id": "90WivU6wv8VrB8sn",
"name": "Header Auth account shopify"
}
},
"typeVersion": 1.1
},
{
"id": "364a6a32-401c-4cc5-9f7c-7d985097d522",
"name": "Update Variants",
"type": "n8n-nodes-base.graphql",
"position": [
1936,
64
],
"parameters": {
"query": "mutation productVariantsBulkUpdate($productId: ID!, $variants: [ProductVariantsBulkInput!]!) {\n productVariantsBulkUpdate(productId: $productId, variants: $variants) {\n product {\n id\n handle\n }\n productVariants {\n id\n sku\n title\n price\n compareAtPrice\ninventoryItem {\n id\n sku\n tracked\n requiresShipping\n }\n }\n userErrors {\n field\n message\n }\n }\n}",
"endpoint": "={{ $('set shop url').first().json.myshop }}",
"variables": "={\n \"productId\": \"{{ $json.productId }}\",\n \"variants\": {\n \"id\" : \"{{ $json.data.productVariantsBulkCreate.productVariants[0].id }}\",\n \"price\" : \"{{ $('is variant?').item.json.basePrice }}\",\n \"inventoryItem\": {\n \"sku\": \"{{ $json.variants.inventoryItem.sku }}\",\n \"tracked\": true\n }\n }\n}",
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": {
"id": "90WivU6wv8VrB8sn",
"name": "Header Auth account shopify"
}
},
"typeVersion": 1.1
},
{
"id": "22739e81-498d-4608-b59a-bec8b39935cf",
"name": "SetInventory",
"type": "n8n-nodes-base.graphql",
"position": [
2160,
64
],
"parameters": {
"query": "mutation inventorySetOnHandQuantities($input: InventorySetOnHandQuantitiesInput!) {\n inventorySetOnHandQuantities(input: $input) {\n userErrors {\n field\n message\n }\n }\n}",
"endpoint": "={{ $('set shop url').first().json.myshop }}",
"variables": "={\n \"input\" : {\n \"reason\": \"correction\",\n \"setQuantities\" :[{\n \"inventoryItemId\":\"{{ $json.data.productVariantsBulkUpdate.productVariants[0].inventoryItem.id }}\",\n \"locationId\": \"{{ $('Shopify, GetLocations').first().json.data.locations.edges[0].node.id }}\",\n \"quantity\" : {{ $('set variants data').item.json.variants.inventoryItem.inventory }}\n }]\n }\n}",
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": {
"id": "90WivU6wv8VrB8sn",
"name": "Header Auth account shopify"
}
},
"typeVersion": 1.1
},
{
"id": "397d171a-5cb1-45b8-8f47-cced0dc1e90a",
"name": "SetVariant1",
"type": "n8n-nodes-base.graphql",
"position": [
1040,
512
],
"parameters": {
"query": "mutation productVariantsBulkUpdate($productId: ID!, $variants: [ProductVariantsBulkInput!]!) {\n productVariantsBulkUpdate(productId: $productId, variants: $variants) {\n product {\n id\n handle\n }\n productVariants {\n id\n sku\n title\n price\n compareAtPrice\n }\n userErrors {\n field\n message\n }\n }\n}",
"endpoint": "={{ $('set shop url').first().json.myshop }}",
"variables": "={\n \"productId\": \"{{ $json.data.productCreate.product.id }}\",\n \"variants\": {\n \"id\" : \"{{ $json.data.productCreate.product.variants.edges[0].node.id }}\",\n \"price\" : \"{{ $('is variant?').item.json.price }}\",\n \"inventoryItem\": {\n \"sku\": \"{{ $('is variant?').item.json.fullSKU }}\",\n \"tracked\": true\n }\n }\n}",
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": {
"id": "90WivU6wv8VrB8sn",
"name": "Header Auth account shopify"
}
},
"typeVersion": 1.1
},
{
"id": "2a69bd47-ca48-4699-b5eb-f1ec16753fca",
"name": "CreateProduct2",
"type": "n8n-nodes-base.graphql",
"position": [
784,
512
],
"parameters": {
"query": "mutation productCreate($product: ProductCreateInput!, $media: [CreateMediaInput!]) {\n productCreate(product: $product, media: $media) {\n product {\n id\n title\n descriptionHtml\n vendor\n productType\n status\n handle\n variants(first:10) {\n edges {\n node {\n id\n sku\n displayName\n inventoryItem {\n id\n sku\n tracked\n requiresShipping\n }\n }\n }\n }\n media(first: 10) {\n edges {\n node {\n alt\n mediaContentType\n status\n id\n preview {\n image {\n url\n }\n status\n }\n }\n }\n }\n options {\n id\n name\n position\n optionValues {\n id\n name\n hasVariants\n }\n }\n }\n userErrors {\n field\n message\n }\n }\n}",
"endpoint": "={{ $('set shop url').first().json.myshop }}",
"variables": "={\n \"product\": {\n \"title\": \" {{ $json.productName }} \",\n \"vendor\" : \"vendor.\",\n \"productType\": \"type\",\n \"status\": \"ACTIVE\",\n \"handle\": \"{{ $json.productName.replaceAll(\" \", \"-\") }}\"\n },\n \"media\" : [{\n \"alt\" : \"{{ $json.productName }}\",\n \"mediaContentType\" : \"IMAGE\",\n \"originalSource\" : \"{{ $json.productImage }}\"\n }]\n}",
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": {
"id": "90WivU6wv8VrB8sn",
"name": "Header Auth account shopify"
}
},
"typeVersion": 1.1
},
{
"id": "61e04df6-43f7-4a40-988f-860bd334b16c",
"name": "Create SetInventory",
"type": "n8n-nodes-base.graphql",
"position": [
1280,
512
],
"parameters": {
"query": "mutation inventorySetOnHandQuantities($input: InventorySetOnHandQuantitiesInput!) {\n inventorySetOnHandQuantities(input: $input) {\n userErrors {\n field\n message\n }\n }\n}",
"endpoint": "={{ $('set shop url').first().json.myshop }}",
"variables": "={\n \"input\" : {\n \"reason\": \"correction\",\n \"setQuantities\" :[{\n \"inventoryItemId\":\"{{ $('CreateProduct2').item.json.data.productCreate.product.variants.edges[0].node.inventoryItem.id }}\",\n \"locationId\": \"{{ $('Shopify, GetLocations').first().json.data.locations.edges[0].node.id }}\",\n \"quantity\" : {{ $('is variant?').item.json.inventory }}\n }]\n }\n}",
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": {
"id": "90WivU6wv8VrB8sn",
"name": "Header Auth account shopify"
}
},
"typeVersion": 1.1
},
{
"id": "ef9bb27c-ee31-4a4a-8574-ba03ce6cb368",
"name": "단일 및 다중 변형 제품",
"type": "n8n-nodes-base.code",
"position": [
240,
320
],
"parameters": {
"jsCode": "// n8n Code Node - Product Variant Processor\n// This processes products and groups them by variants\nconst items = $input.all();\n\n// Helper function to extract base SKU and variant suffix\nfunction parseVariantSKU(sku) {\n const skuStr = String(sku);\n const parts = skuStr.split('-');\n \n if (parts.length > 1) {\n const baseSKU = parts[0];\n const variantSuffix = parts.slice(1).join('-');\n return { baseSKU, variantSuffix, isVariant: true };\n }\n \n return { baseSKU: skuStr, variantSuffix: '', isVariant: false };\n}\n\n// Group products by Product Name\nconst productGroups = {};\n\nitems.forEach(item => {\n const data = item.json;\n const productName = data['Product Name'];\n \n if (!productGroups[productName]) {\n productGroups[productName] = [];\n }\n \n productGroups[productName].push(data);\n});\n\n// Build output array\nconst output = [];\n\nObject.keys(productGroups).forEach(productName => {\n const variants = productGroups[productName];\n const hasVariants = variants.length > 1 || (variants.length === 1 && variants[0].Size !== '');\n \n if (hasVariants) {\n // Product with variants - prepare all variant data\n const totalInventory = variants.reduce((sum, v) => sum + v['On hand Inventory'], 0);\n const basePrice = variants[0].Price;\n const baseSKU = parseVariantSKU(variants[0].SKU).baseSKU;\n \n // Build optionsGraph dynamically based on variant count\n const optionsGraph = [\n {\n name: \"Size\",\n values: variants.map(v => {\n const parsed = parseVariantSKU(v.SKU);\n return { name: v.Size || parsed.variantSuffix };\n })\n }\n ];\n \n output.push({\n json: {\n type: 'variant',\n productName: productName,\n baseSKU: baseSKU,\n basePrice: basePrice,\n totalInventory: totalInventory,\n variantCount: variants.length,\n productImage: variants[0]['Product Image'],\n // GraphQL options format\n optionsGraph: optionsGraph,\n // Format variants for Shopify productCreate mutation\n variantsForCreate: variants.map(v => {\n const parsed = parseVariantSKU(v.SKU);\n return {\n optionValues: [{ optionName: \"Size\", name: v.Size || parsed.variantSuffix }],\n price: String(v.Price),\n inventoryItem: {\n sku: String(v.SKU),\n tracked: true\n },\n inventoryQuantities: {\n availableQuantity: v['On hand Inventory'],\n locationId: \"LOCATION_ID_PLACEHOLDER\" // Will be replaced\n }\n };\n }),\n // Keep individual variant data for inventory updates\n variants: variants.map(v => {\n const parsed = parseVariantSKU(v.SKU);\n return {\n productName: productName,\n fullSKU: String(v.SKU),\n variantTitle: v.Size || parsed.variantSuffix,\n size: v.Size,\n inventory: v['On hand Inventory'],\n image: variants[0]['Product Image'],\n price: v.Price\n };\n })\n }\n });\n } else {\n // Single product (no variants)\n const product = variants[0];\n const parsed = parseVariantSKU(product.SKU);\n \n output.push({\n json: {\n type: 'single',\n productName: productName,\n baseSKU: parsed.baseSKU,\n fullSKU: String(product.SKU),\n price: product.Price,\n inventory: product['On hand Inventory'],\n productImage: product['Product Image']\n }\n });\n }\n});\n\nreturn output;"
},
"typeVersion": 2
},
{
"id": "6f41fc6d-f06e-4ab3-a2af-cf0983690edb",
"name": "is variant?",
"type": "n8n-nodes-base.switch",
"position": [
416,
320
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "Variant",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "843be2ff-a953-4ecc-a547-261adfcf3678",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.type }}",
"rightValue": "variant"
}
]
},
"renameOutput": true
},
{
"outputKey": "Single",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "7e1926e9-bc68-4cee-a697-5fad1564f903",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.type }}",
"rightValue": "single"
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.3
},
{
"id": "6b4b776c-08f3-4442-af5a-393b575ae14f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1728,
-592
],
"parameters": {
"color": 3,
"width": 960,
"height": 1280,
"content": "\n\n# Shopify Product Importer with Variants Support\n\n## Setup Guidelines\n\n🔧 Setup Instructions\n### Step 1: Configure Shopify Credentials\n\nIn n8n, create a new Header Auth credential\nSet these values:\n\nName: X-Shopify-Access-Token\nValue: Your Shopify Admin API Access Token\n\n\n\n### Step 2: Update Workflow Nodes\n\nShopify, GetLocations node:\n\nUpdate the endpoint with your store URL\nSelect your Shopify credentials\n\n\nGet row(s) in sheet node:\n\nConnect your Google Sheets account\nSelect your spreadsheet\nChoose the sheet with product data\n\n\nUpdate all other Shopify nodes with:\n\nYour store URL (replace myshop.myshopify.com)\nYour Shopify credentials\n\n\n\n### Step 3: Customize Product Details (Optional)\nIn the workflow, you can customize these defaults:\n\nFor variant products (in Shopify, CreateProduct node):\n\njavascript\"vendor\": \"vendor\", // Change to your vendor name\n\"productType\": \"type\", // Change to your product type\n\nFor single products (in CreateProduct2 node):\n\njavascript\"vendor\": \"vendor\", // Change to your vendor name\n\"productType\": \"type\", // Change to your product type"
},
"typeVersion": 1
},
{
"id": "4d167268-e51e-4451-8850-73258c233d25",
"name": "set shop url",
"type": "n8n-nodes-base.set",
"position": [
-480,
320
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "3b280df6-01c4-4db0-a53c-4e6579f3ba36",
"name": "myshop",
"type": "string",
"value": "https://[yourshop].myshopify.com/admin/api/2025-04/graphql.json"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "43c3ad5c-2a17-4d87-8d08-d8e4412429d4",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-544,
176
],
"parameters": {
"width": 256,
"height": 336,
"content": "## Add your store subdomain \n**https://[yourshop].myshopify.com/**"
},
"typeVersion": 1
},
{
"id": "6d1fe3be-cec8-4517-9759-6aa774c1d3fb",
"name": "set variants data",
"type": "n8n-nodes-base.set",
"position": [
1712,
64
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "cf7e0057-939e-4b3c-9654-ef05c2ece564",
"name": "variants.optionValues[0].optionId",
"type": "string",
"value": "={{ $('Split Out1').item.json.variants.optionValues[0].optionId }}"
},
{
"id": "75d5c47f-2614-416a-91fe-540ef44b5ea2",
"name": "variants.price",
"type": "string",
"value": "={{ $('Split Out1').item.json.variants.price }}"
},
{
"id": "0215f465-592a-4724-9412-8147abce1f83",
"name": "variants.inventoryItem.sku",
"type": "string",
"value": "={{ $('Split Out1').item.json.variants.inventoryItem.sku }}"
},
{
"id": "25e5b917-267b-4073-a1e1-5b3bf7bdc34d",
"name": "variants.inventoryItem.inventory",
"type": "number",
"value": "={{ $('Split Out1').item.json.variants.inventoryItem.inventory }}"
},
{
"id": "55109d6c-1599-4414-95ec-47d2aa631284",
"name": "variants.inventoryItem.size",
"type": "string",
"value": "={{ $('Split Out1').item.json.variants.inventoryItem.size }}"
},
{
"id": "53a71947-ca2c-4c19-9dfc-f16c9284f703",
"name": "variants.inventoryItem.image",
"type": "string",
"value": "={{ $('Split Out1').item.json.variants.inventoryItem.image }}"
},
{
"id": "f6a87447-64f2-4a46-a901-da105b8d679a",
"name": "data.productVariantsBulkCreate.productVariants[0].id",
"type": "string",
"value": "={{ $json.data.productVariantsBulkCreate.productVariants[0]?.id ? $json.data.productVariantsBulkCreate.productVariants[0].id : $('Split Out1').item.json.mainfirstVariant }}"
},
{
"id": "22d4abec-4a92-45a9-9473-bc6a1fa7324a",
"name": "productId",
"type": "string",
"value": "={{ $('Split Out1').item.json.productId }}"
},
{
"id": "3cb2cda3-613b-483c-89a1-f316ca0e1050",
"name": "productTitle",
"type": "string",
"value": "={{ $('Split Out1').item.json.productTitle }}"
},
{
"id": "0566352e-70b1-4c20-ad74-560400066cde",
"name": "mediaID",
"type": "string",
"value": "={{ $('Split Out1').item.json.mediaID }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e4b35802-52dc-472e-82a4-b1669270636c",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
704,
-80
],
"parameters": {
"color": 4,
"width": 256,
"height": 784,
"content": "### Use fixed 'type' and 'vendor' or update the json variables to pass these variables."
},
"typeVersion": 1
},
{
"id": "3645bfc0-26b1-405d-8c15-acc984db508a",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1200,
-80
],
"parameters": {
"color": 4,
"width": 256,
"height": 336,
"content": "### this split node will split variants into individual items to be created and updated in next steps"
},
"typeVersion": 1
},
{
"id": "58961d0d-74e5-4bfb-882d-e34ac397aea4",
"name": "adjust variants",
"type": "n8n-nodes-base.code",
"position": [
1024,
64
],
"parameters": {
"jsCode": "// Get ALL items from the previous step (all created products)\nconst items = $input.all();\n\n// Get the original variants data from Switch node (all variant products)\nconst switchItems = $('is variant?').all();\n// Process each product\nconst output = items.map((item, index) => {\n // Get the created product data\n const productData = item.json.data.productCreate.product;\n const productId = productData.id;\n const mainVariant = item.json.data.productCreate.product.variants.edges[0].node.id\n const mediaId = item.json.data.productCreate.product.media.edges[0].node.id\n\n // Get the Size option - it should exist now\n const sizeOption = productData.options.find(opt => opt.name === \"Size\");\n\n if (!sizeOption) {\n throw new Error(`Size option not found in created product: ${productData.title}`);\n }\n\n // Get the corresponding original variant data for this product\n const variantsData = switchItems[index].json.variants;\n\n // Build variants array for productVariantsBulkCreate\n // Match each variant with its corresponding optionValue ID\n const variantsForCreate = variantsData.map(variant => {\n // Find the matching option value ID for this size\n const optionValue = sizeOption.optionValues.find(ov => ov.name === variant.size);\n \n if (!optionValue) {\n throw new Error(`Option value not found for size: ${variant.size}`);\n }\n \n return {\n optionValues: [\n {\n optionId: sizeOption.id,\n id: optionValue.id\n }\n ],\n price: String(variant.price),\n inventoryItem: {\n sku: variant.fullSKU,\n inventory: variant.inventory,\n size: variant.size,\n image: variant.image,\n tracked: true\n }\n };\n });\n\n return {\n json: {\n productId: productId,\n productTitle: productData.title,\n mainfirstVariant: mainVariant,\n mediaID: mediaId,\n \n variants: variantsForCreate,\n originalVariantsData: variantsData\n }\n };\n});\n\nreturn output;"
},
"typeVersion": 2
},
{
"id": "144915d0-e6d6-4861-b454-a3eb19d9a137",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-96,
176
],
"parameters": {
"width": 256,
"height": 336,
"content": "## Connect your table ( source of products)\n** table with title, SKU, picture url, price, inventory and/or vendor, type **"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"4a93dc5f-19a4-4c14-b48f-0de54e24f226": {
"main": [
[
{
"node": "6d1fe3be-cec8-4517-9759-6aa774c1d3fb",
"type": "main",
"index": 0
}
]
]
},
"a1171896-5b8f-4bb8-8d8f-bfc208d86f0b": {
"main": [
[
{
"node": "4a93dc5f-19a4-4c14-b48f-0de54e24f226",
"type": "main",
"index": 0
}
]
]
},
"397d171a-5cb1-45b8-8f47-cced0dc1e90a": {
"main": [
[
{
"node": "61e04df6-43f7-4a40-988f-860bd334b16c",
"type": "main",
"index": 0
}
]
]
},
"6f41fc6d-f06e-4ab3-a2af-cf0983690edb": {
"main": [
[
{
"node": "b7a3b2c1-0f79-4233-8731-1d5631dccd93",
"type": "main",
"index": 0
}
],
[
{
"node": "2a69bd47-ca48-4699-b5eb-f1ec16753fca",
"type": "main",
"index": 0
}
]
]
},
"22739e81-498d-4608-b59a-bec8b39935cf": {
"main": [
[]
]
},
"4d167268-e51e-4451-8850-73258c233d25": {
"main": [
[
{
"node": "b6b0846a-1b94-438b-b518-7ed51b3bdc6a",
"type": "main",
"index": 0
}
]
]
},
"2a69bd47-ca48-4699-b5eb-f1ec16753fca": {
"main": [
[
{
"node": "397d171a-5cb1-45b8-8f47-cced0dc1e90a",
"type": "main",
"index": 0
}
]
]
},
"364a6a32-401c-4cc5-9f7c-7d985097d522": {
"main": [
[
{
"node": "22739e81-498d-4608-b59a-bec8b39935cf",
"type": "main",
"index": 0
}
]
]
},
"58961d0d-74e5-4bfb-882d-e34ac397aea4": {
"main": [
[
{
"node": "a1171896-5b8f-4bb8-8d8f-bfc208d86f0b",
"type": "main",
"index": 0
}
]
]
},
"6d1fe3be-cec8-4517-9759-6aa774c1d3fb": {
"main": [
[
{
"node": "364a6a32-401c-4cc5-9f7c-7d985097d522",
"type": "main",
"index": 0
}
]
]
},
"454305c0-5593-4340-9224-dee5c937acdb": {
"main": [
[
{
"node": "ef9bb27c-ee31-4a4a-8574-ba03ce6cb368",
"type": "main",
"index": 0
}
]
]
},
"b6b0846a-1b94-438b-b518-7ed51b3bdc6a": {
"main": [
[
{
"node": "454305c0-5593-4340-9224-dee5c937acdb",
"type": "main",
"index": 0
}
]
]
},
"b7a3b2c1-0f79-4233-8731-1d5631dccd93": {
"main": [
[
{
"node": "58961d0d-74e5-4bfb-882d-e34ac397aea4",
"type": "main",
"index": 0
}
]
]
},
"ef9bb27c-ee31-4a4a-8574-ba03ce6cb368": {
"main": [
[
{
"node": "6f41fc6d-f06e-4ab3-a2af-cf0983690edb",
"type": "main",
"index": 0
}
]
]
},
"ba37e8c9-0372-443a-92cc-55d7893547cc": {
"main": [
[
{
"node": "4d167268-e51e-4451-8850-73258c233d25",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
Facebook 페이지 댓글 관리 봇: 답글, 삭제, 차단 및 알림
AI 기반 Facebook 댓글 관리: 자동 답글, 삭제, 차단 및 알림
If
Set
Code
+
If
Set
Code
59 노드SpaGreen Creative
소셜 미디어
API 아키텍처 추출기
API 아키텍처 추출기
If
Set
Code
+
If
Set
Code
88 노드Polina Medvedieva
엔지니어링
리드 생성 및 이메일 워크플로
Google 지도, SendGrid 및 AI를 사용한 B2B 잠재 고객 개발 및 이메일 마케팅 자동화
If
Set
Code
+
If
Set
Code
141 노드Ezema Kingsley Chibuzo
리드 생성
Google Maps 리뷰를 Google 스프레드시트로 동기화
SerpApi를 사용한 Google Maps 리뷰를 Google 스프레드시트로 동기화
If
Set
Code
+
If
Set
Code
22 노드SerpApi
시장 조사
AI 이메일 분석기: PDF, 이미지 처리
PDF 및 이미지를 처리하여 Google Drive와 Telegram에 저장
If
Set
Code
+
If
Set
Code
31 노드Davide
인공지능
자동화 뉴스-브리핑 AI 에이전트 v13
AI 뉴스 연구 팀: 24/7 브리핑 자동화, Perplexity 인용 포함
Set
Code
Gmail
+
Set
Code
Gmail
37 노드Derek Cheung
제품
워크플로우 정보
난이도
고급
노드 수21
카테고리-
노드 유형8
저자
Muhammad Asadullah
@asadtechI am a Data Scientist, and Generative AI Developer with expertise in building AI applications, chatbots, and automation systems. Skilled in Python, R, and no-code/low-code platforms like n8n and Make, I combine strong technical knowledge in machine learning and NLP with hands-on experience in power systems, transformers, and solar design.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유