バッチSEOコンテンツ生成とAI画像付きWebflowドラフト作成(テンプレート)

上級

これはContent Creation, Multimodal AI分野の自動化ワークフローで、54個のノードを含みます。主にIf, Set, Code, Wait, Mergeなどのノードを使用。 GPT、Gemini画像、Webflowデラフトで行う大量SEOコンテンツ生成

前提条件
  • Google Drive API認証情報
  • ターゲットAPIの認証情報が必要な場合あり
  • Google Sheets API認証情報
  • OpenAI API Key
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "id": "bCM3L5So04TaTb3I",
  "meta": {
    "instanceId": "506e1eb999b7a8cf86103921b3e1b94e371534d9bae39d44754933678dc6697d",
    "templateCredsSetupCompleted": true
  },
  "name": "Bulk SEO content generation and Webflow draft creation with AI images (template)",
  "tags": [
    {
      "id": "T3xhK1cIuPex0boX",
      "name": "Templates",
      "createdAt": "2025-09-03T11:06:03.839Z",
      "updatedAt": "2025-09-03T11:06:03.839Z"
    }
  ],
  "nodes": [
    {
      "id": "6c19a117-9bac-4598-9618-432ca067a02f",
      "name": "AIエージェント",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -5712,
        64
      ],
      "parameters": {
        "text": "=Current date and time: {{$now}}\n\nTASK: Create high-quality SEO content and generate a relevant featured image for the keyword below.\n\nKeyword: {{ $json['main keyword'] }}\n\nRequirements:\n1. Write 600-800 words of engaging, professional but accessible content.\n2. Include the keyword naturally 2-3 times: once in the introduction, once in a subheading, and once in the conclusion.\n3. Create a compelling title (50-60 characters).\n4. Write a meta description (150-160 characters).\n5. Structure the article with clear sections:\n   - Introduction\n   - Key Benefits\n   - How It Works / Practical Advice\n   - Conclusion / Next Steps\n6. Target audience: general readers searching for this keyword (not academic or overly technical).\n7. Generate ONE relevant professional image. The image should:\n   - Visually represent the keyword topic (not generic SEO/marketing visuals)\n   - Use a clean, modern, professional style\n   - Be suitable as a blog featured image\n   - IMPORTANT: Generate only ONE image per article\n\nCRITICAL: Call the image generation tool exactly ONCE per article. Do not generate multiple images or variations.\n\n8. Provide descriptive **alt text** for the image, optimized for accessibility and SEO.\n\nOutput Format:\nReturn ONLY this valid JSON structure as raw JSON (no markdown code blocks, no json tags, no extra text, notes, or explanations):\n{\n\"title\": \"SEO optimized title here\",\n\"slug\": \"{{ $('Load Pending Keywords').item.json.slug }}\", \n\"metaDescription\": \"Compelling meta description here\",\n\"content\": \"Full article content here (600-800 words). CRITICAL FORMATTING REQUIREMENTS: Start with ### Introduction as the first heading. Use ### for ALL section headings (Key Benefits, How It Works / Practical Advice, Conclusion / Next Steps). Write complete paragraphs separated by blank lines. Never mix plain text with markdown formatting. Each section must have substantial content with specific examples and actionable advice. Include the target keyword naturally 2-3 times throughout the content. Ensure consistent markdown structure from start to finish.\",\n\"main keyword\": \"{{ $json['main keyword'] }}\",\n\"imageUrl\": \"URL from image generation tool\", \n\"altText\": \"Descriptive and SEO-friendly alt text here\"\n}\n\nFORMATTING VALIDATION: Before returning JSON, verify that:\n1. Content starts with ### Introduction \n2. All headings use ### format consistently\n3. Each paragraph is properly separated with blank lines\n4. No mixing of plain text and markdown syntax\n5. Content flows logically between sections\n6. Target keyword appears naturally in introduction and conclusion\n\nCRITICAL: Your response must start with { and end with }. Do not wrap the JSON in markdown formatting or code blocks. Return the raw JSON object only.",
        "options": {
          "systemMessage": "You are an expert SEO content writer and AI coordinator. Your responsibilities: Always follow the Agent Prompt exactly. Always generate both content and a relevant professional image. Always return valid JSON only, with no extra commentary or notes. Never skip image generation. Never output incomplete or invalid JSON. Ensure the content is engaging, structured, and optimized for readers searching for the keyword."
        },
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "9081f1d4-5dac-4350-b910-e17ad918208f",
      "name": "シンプルメモリ",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -5632,
        288
      ],
      "parameters": {
        "sessionKey": "={{ $('Load Pending Keywords').item.json['main keyword'] }}",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "13743c5a-d649-49a3-8cd6-4c03494d9749",
      "name": "OpenAI チャットモデル",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -5760,
        288
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {
          "temperature": 0.1
        }
      },
      "credentials": {
        "openAiApi": {
          "id": "mvWns3smwtPV0N7O",
          "name": "OpenAI (Dummy Account)"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "97ed3faa-f65c-4b47-a024-9800c24763fd",
      "name": "付箋",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6480,
        -624
      ],
      "parameters": {
        "width": 576,
        "height": 448,
        "content": "### 📋 Automated SEO Content Generation for Webflow\n\nThis workflow generates SEO-optimized articles at scale and saves them as Webflow drafts.\n\n**What it does:**\n- Reads keywords from Google Sheets (status = \"pending\")\n- AI writes 600+ word articles with proper structure\n- Generates custom featured images via Gemini AI\n- Creates drafts in Webflow (you publish manually after review)\n- Tracks results in Google Sheets\n\n**Best for:** Creating multiple articles targeting long-tail keyword variations (e.g., \"best running shoes for winter\", \"best running shoes for trails\")\n\n**Setup Steps:**\n1. Configure your Google Sheet or [clone this template](https://docs.google.com/spreadsheets/d/1_4wVEuu1fVZBXs0JhImQyzZYv9QC0RLZjxZFwHcJHPw/edit?gid=183091813#gid=183091813)\n2. Add API credentials (OpenAI, OpenRouter, Webflow)\n3. Set Webflow site/collection IDs\n4. Test with 1 keyword before bulk processing"
      },
      "typeVersion": 1
    },
    {
      "id": "d10c11b9-0cbe-4725-ae66-fe4c381666c5",
      "name": "スケジュールトリガー",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -6432,
        64
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "months"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "85a2baaf-7fd0-4cb9-b200-7f56d3781275",
      "name": "保留中のキーワードを読み込む",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -6208,
        64
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "pending",
              "lookupColumn": "status"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 183091813,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit#gid=183091813",
          "cachedResultName": "keywords"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit?usp=drivesdk",
          "cachedResultName": "N8N SHEETS TEST"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "zyEOPkCfmHTXNm4V",
          "name": "Google Sheets (Dummy Account)"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "3474f5e5-84e7-44c5-8751-e53ffedffd1e",
      "name": "アイテムをループ処理",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -5984,
        64
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "3403fae8-07ba-4faf-9db5-0ad221b1360e",
      "name": "コンテンツ品質チェック",
      "type": "n8n-nodes-base.if",
      "position": [
        -5072,
        64
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "word-count-check",
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ $json.wordCount }}",
              "rightValue": 600
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "ebe7106d-a3bb-4396-989c-5aba594e828d",
      "name": "エージェント出力を処理",
      "type": "n8n-nodes-base.code",
      "position": [
        -5296,
        64
      ],
      "parameters": {
        "jsCode": "// Original keyword item from the loop\nconst original = $json;\n\n// Extract and clean the agent output with multiple fallbacks\nlet agentOutput = {};\ntry {\n  let rawOutput = original.output || \"\";\n  \n  // Security: Handle multiple markdown variations\n  let cleanedOutput = rawOutput\n    .replace(/```json\\s*/g, '')    // Remove ```json\n    .replace(/```\\s*$/g, '')       // Remove closing ```\n    .replace(/^```\\s*/g, '')       // Remove opening ``` \n    .replace(/```$/g, '')          // Remove trailing ```\n    .trim();\n  \n  // Try parsing the cleaned output\n  agentOutput = JSON.parse(cleanedOutput);\n  \n} catch (parseError) {\n  // Security fallback: Create safe structure if parsing fails\n  console.log(\"JSON Parse Error:\", parseError.message);\n  \n  agentOutput = { \n    title: `Error: ${original[\"main keyword\"] || \"Unknown keyword\"}`,\n    slug: `error-${Date.now()}`,\n    metaDescription: \"Content generation failed\",\n    content: \"Failed to generate content. Please check agent configuration.\",\n    \"main keyword\": original[\"main keyword\"] || \"unknown\",\n    imageUrl: \"\",\n    altText: \"Error generating content\",\n    parseError: parseError.message,\n    rawAgentOutput: original.output\n  };\n}\n\n// Compute word count from the content\nconst content = agentOutput.content || \"\";\nconst wordCount = content.split(/\\s+/).filter(Boolean).length;\n\n// Return wrapped in json object to avoid n8n reserved key conflicts\nreturn [{\n  json: {\n    ...original,          \n    ...agentOutput,       \n    wordCount,\n    status: wordCount >= 600 ? \"content_ready\" : \"needs_expansion\",\n    generatedAt: new Date().toISOString()\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "457c8c37-c678-4299-8676-4ec41c2ba56d",
      "name": "コンテンツを拡張",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -4848,
        160
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {
          "maxTokens": 4000,
          "temperature": 0.3
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are an expert content expansion specialist. Always return ONLY valid JSON with no extra text, notes, or explanations. Follow the exact format specified in the user prompt."
            },
            {
              "content": "=Expand the following content from {{ $json.wordCount }} words to 600+ words while maintaining the same structure, tone, and keyword optimization.\n\nTARGET KEYWORD: {{ $('Loop Over Items').item.json['main keyword'] }}\n\nORIGINAL CONTENT: {{ $json.content }}\n\nEXPANSION GUIDELINES:\n1. Keep all existing headings and sections intact\n2. Add specific examples, real-world scenarios, and practical tips within each section  \n3. Include 2-3 brand mentions or product examples where relevant\n4. Add actionable advice readers can implement immediately\n5. Maintain the same markdown formatting (###, **, etc.)\n6. Preserve keyword density and natural integration\n7. Keep the original writing style and tone\n\nReturn ONLY this valid JSON structure (no extra text, notes, or explanations):\n\n{\n  \"title\": \"{{ $json.title }}\",\n  \"slug\": \"{{ $json.slug }}\",\n  \"metaDescription\": \"{{ $json.metaDescription }}\",\n  \"content\": \"Expanded article content here (600+ words)\",\n  \"main keyword\": \"{{ $json['main keyword'] }}\",\n  \"imageUrl\": \"{{ $json.imageUrl }}\",\n  \"altText\": \"{{ $json.altText }}\"\n}"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "id": "mvWns3smwtPV0N7O",
          "name": "OpenAI (Dummy Account)"
        }
      },
      "retryOnFail": true,
      "typeVersion": 1.8
    },
    {
      "id": "6a7bc453-cf01-4bed-88a9-7b8d478793a2",
      "name": "エージェント出力をフォーマット",
      "type": "n8n-nodes-base.code",
      "position": [
        -4496,
        160
      ],
      "parameters": {
        "jsCode": "const originalData = $json;\nconst expandedResponse = $('Expand Content').first().json.message.content;\n\n// Parse the JSON response from the expanded content\nlet expandedData = {};\ntry {\n  expandedData = JSON.parse(expandedResponse);\n} catch (e) {\n  expandedData = { \n    error: \"Invalid JSON from expansion\", \n    raw: expandedResponse,\n    content: expandedResponse // fallback to raw content\n  };\n}\n\n// Calculate word count from the expanded content\nconst content = expandedData.content || \"\";\nconst wordCount = content.split(/\\s+/).filter(Boolean).length;\n\nreturn [{\n  json: {\n    ...originalData,     // Keep original data (main keyword, etc.)\n    ...expandedData,     // Add all expanded fields\n    wordCount,\n    status: wordCount >= 600 ? \"content_ready\" : \"needs_expansion\",\n    wasExpanded: true,\n    expandedAt: new Date().toISOString()\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "0a272acd-2853-45c9-bdc6-c69d876648f8",
      "name": "コンテンツパスを統合",
      "type": "n8n-nodes-base.merge",
      "position": [
        -4272,
        64
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combinationMode": "mergeByPosition"
      },
      "typeVersion": 2.1
    },
    {
      "id": "7554230a-0c6b-4654-ab87-5f527675912f",
      "name": "HTMLに変換",
      "type": "n8n-nodes-base.markdown",
      "position": [
        -4048,
        64
      ],
      "parameters": {
        "mode": "markdownToHtml",
        "options": {},
        "markdown": "={{ $json.content }}"
      },
      "typeVersion": 1
    },
    {
      "id": "0bcdca31-1f50-41fe-b748-91a732a730a2",
      "name": "既存投稿と統合",
      "type": "n8n-nodes-base.merge",
      "position": [
        -3600,
        64
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "advanced": true,
        "joinMode": "keepEverything",
        "mergeByFields": {
          "values": [
            {
              "field1": "fieldData.slug",
              "field2": "slug"
            }
          ]
        }
      },
      "typeVersion": 3.2
    },
    {
      "id": "ad6944f8-67ac-4454-b011-61f833541b97",
      "name": "既存投稿を取得",
      "type": "n8n-nodes-base.webflow",
      "position": [
        -3824,
        -48
      ],
      "parameters": {
        "siteId": "653a17a1b31a397763f3ce40",
        "operation": "getAll",
        "returnAll": true,
        "collectionId": "68c01d34f15ae8b8c30ead31"
      },
      "credentials": {
        "webflowOAuth2Api": {
          "id": "NqkfDWqbJpAotiw2",
          "name": "Webflow (Dummy Account)"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "7f443fca-2d0f-43e2-83be-74f096c0c92b",
      "name": "新規投稿スラッグを取得",
      "type": "n8n-nodes-base.set",
      "position": [
        -3824,
        160
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "6f6f5935-eb33-41bd-804c-dc62c085b000",
              "name": "slug",
              "type": "string",
              "value": "={{ $json.slug }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "5c7c7872-e391-479c-b9de-c82c9e1af5f8",
      "name": "ルート: 更新または作成",
      "type": "n8n-nodes-base.switch",
      "position": [
        -3376,
        64
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Route 1",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "f22dbd15-9e3d-4dcd-ac02-b6763223b916",
                    "operator": {
                      "type": "string",
                      "operation": "notEmpty",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.id }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Route 2",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "6915f663-8bd2-4e60-ad37-409ea961f89f",
                    "operator": {
                      "type": "string",
                      "operation": "empty",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.id }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "ac01b0a4-ecda-4f20-afc8-9aa582fda210",
      "name": "既存投稿を更新",
      "type": "n8n-nodes-base.webflow",
      "maxTries": 3,
      "position": [
        -3152,
        -48
      ],
      "parameters": {
        "itemId": "={{ $json.id }}",
        "siteId": "653a17a1b31a397763f3ce40",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "name",
              "fieldValue": "={{ $('Convert to HTML').item.json.title }}"
            },
            {
              "fieldId": "page-content",
              "fieldValue": "={{ $('Convert to HTML').item.json.data }}"
            },
            {
              "fieldId": "metadescription",
              "fieldValue": "={{ $('Convert to HTML').item.json.metaDescription }}"
            },
            {
              "fieldId": "featured-image",
              "fieldValue": "={{ $('Convert to HTML').item.json.imageUrl }}"
            }
          ]
        },
        "operation": "update",
        "collectionId": "68c01d34f15ae8b8c30ead31"
      },
      "credentials": {
        "webflowOAuth2Api": {
          "id": "NqkfDWqbJpAotiw2",
          "name": "Webflow (Dummy Account)"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2
    },
    {
      "id": "a3f5e05d-a525-4fdd-a214-998806a344b0",
      "name": "新規投稿を作成",
      "type": "n8n-nodes-base.webflow",
      "maxTries": 3,
      "position": [
        -3152,
        160
      ],
      "parameters": {
        "siteId": "653a17a1b31a397763f3ce40",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "name",
              "fieldValue": "={{ $('Convert to HTML').item.json.title }}"
            },
            {
              "fieldId": "slug",
              "fieldValue": "={{ $('Convert to HTML').item.json.slug }}"
            },
            {
              "fieldId": "page-content",
              "fieldValue": "={{ $('Convert to HTML').item.json.data }}"
            },
            {
              "fieldId": "metadescription",
              "fieldValue": "={{ $('Convert to HTML').item.json.metaDescription }}"
            },
            {
              "fieldId": "featured-image",
              "fieldValue": "={{ $('Convert to HTML').item.json.imageUrl }}"
            }
          ]
        },
        "operation": "create",
        "collectionId": "68c01d34f15ae8b8c30ead31"
      },
      "credentials": {
        "webflowOAuth2Api": {
          "id": "NqkfDWqbJpAotiw2",
          "name": "Webflow (Dummy Account)"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2
    },
    {
      "id": "42e4fb72-e16f-4dd3-a1ea-9aa94443f5ec",
      "name": "投稿結果を統合",
      "type": "n8n-nodes-base.merge",
      "position": [
        -2928,
        64
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "4755da23-5ea0-4420-b5a2-7976e41411d1",
      "name": "成功を確認",
      "type": "n8n-nodes-base.if",
      "position": [
        -2704,
        64
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "success-check",
              "operator": {
                "type": "string",
                "operation": "isNotEmpty"
              },
              "leftValue": "={{ $json.id }}",
              "rightValue": ""
            },
            {
              "id": "4bdc0525-b8fe-4faa-a3a0-d701102ed47a",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.id }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "a013bc1b-70af-4c27-9c88-c5df8a913bd1",
      "name": "完了としてマーク",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -2480,
        -48
      ],
      "parameters": {
        "columns": {
          "value": {
            "status": "created",
            "main keyword": "={{ $('Convert to HTML').item.json['main keyword'] }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "main keyword",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "main keyword",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "head terms",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "head terms",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "modifiers",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "modifiers",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "slug",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "slug",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "main keyword"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 183091813,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit#gid=183091813",
          "cachedResultName": "keywords"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit?usp=drivesdk",
          "cachedResultName": "N8N SHEETS TEST"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "zyEOPkCfmHTXNm4V",
          "name": "Google Sheets (Dummy Account)"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "d833be28-654b-41f1-af4d-bcf18e8aa3ec",
      "name": "エラーを記録",
      "type": "n8n-nodes-base.code",
      "position": [
        -2480,
        160
      ],
      "parameters": {
        "jsCode": "const error = $json.error || 'Creation failed';\nconst keyword = $('Convert to HTML').first()?.json?.['main keyword'] || 'Unknown';\n\nreturn {\n  json: {\n    keyword: keyword,\n    error: error,\n    timestamp: new Date().toISOString(),\n    status: 'failed'\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "ab10a761-91e4-4b64-8164-c87134bcbb45",
      "name": "成功結果を保存",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -2256,
        -48
      ],
      "parameters": {
        "columns": {
          "value": {
            "id": "={{ $('Merge post result').item.json.id }}",
            "slug": "={{ $('Merge post result').item.json.fieldData.slug }}",
            "content": "={{ $('Merge post result').item.json.fieldData['page-content'] }}",
            "updated on": "={{ $('Merge post result').item.json.lastUpdated }}",
            "generatedAt": "={{ $('Merge post result').item.json.createdOn }}",
            "meta description": "={{ $('Merge post result').item.json.fieldData.metadescription }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "slug",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "slug",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "meta description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "meta description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "content",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "content",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "generatedAt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "generatedAt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "updated on",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "updated on",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "published on",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "published on",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 977377122,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit#gid=977377122",
          "cachedResultName": "content_created"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit?usp=drivesdk",
          "cachedResultName": "N8N SHEETS TEST"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "zyEOPkCfmHTXNm4V",
          "name": "Google Sheets (Dummy Account)"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "632a7c39-687c-4ea9-95e0-dd57b302c191",
      "name": "エラーを保存",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -2256,
        160
      ],
      "parameters": {
        "columns": {
          "value": {
            "error": "={{ $json.error }}",
            "status": "={{ $json.status }}",
            "keyword": "={{ $('Convert to HTML').item.json['main keyword'] }}",
            "timestamp": "={{ $json.timestamp }}"
          },
          "schema": [
            {
              "id": "keyword",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "keyword",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "error",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "error",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "keyword"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1205462190,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit#gid=1205462190",
          "cachedResultName": "webflow_error_logs"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit?usp=drivesdk",
          "cachedResultName": "N8N SHEETS TEST"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "zyEOPkCfmHTXNm4V",
          "name": "Google Sheets (Dummy Account)"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "5f4abc50-4c29-4424-9668-b3eb1494fb66",
      "name": "数秒待機",
      "type": "n8n-nodes-base.wait",
      "position": [
        -2032,
        160
      ],
      "webhookId": "6d8fa6b9-a084-4656-a950-cf477ab7329d",
      "parameters": {
        "amount": 3
      },
      "typeVersion": 1.1
    },
    {
      "id": "af480c9a-5086-45af-9d1e-0b403a387463",
      "name": "付箋1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6464,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "content": "## STEP 1\n\nLoads all keywords with status='pending' from Google Sheets"
      },
      "typeVersion": 1
    },
    {
      "id": "7747856f-3922-46a8-8f09-ecc007cabeb0",
      "name": "付箋2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5728,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 144,
        "content": "## STEP 2\n\nAgent creates full article + generates featured image via tool call. Content is checked for 600+ words."
      },
      "typeVersion": 1
    },
    {
      "id": "99d5b7cd-b330-4519-b166-76c3fdd1ac51",
      "name": "付箋3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4896,
        384
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 144,
        "content": "## STEP 3\n\nQuality Control\nIf under 600 words → expand content\nIf 600+ words → proceed to publishing"
      },
      "typeVersion": 1
    },
    {
      "id": "2100b5a6-2e31-42d5-bbe1-259b81f38933",
      "name": "付箋4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4096,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 192,
        "height": 144,
        "content": "## STEP 4\n\n\nConverts markdown to HTML and merges with image data"
      },
      "typeVersion": 1
    },
    {
      "id": "b4478d43-86f7-453b-977d-7bec723d77f8",
      "name": "付箋5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3824,
        -224
      ],
      "parameters": {
        "color": 7,
        "width": 336,
        "height": 144,
        "content": "## STEP 5\n\n\nMatches slug with Webflow collection to update or create"
      },
      "typeVersion": 1
    },
    {
      "id": "57f327c8-15c0-4d61-a2bc-afe23897add6",
      "name": "付箋6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3280,
        -208
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 112,
        "content": "## STEP 6\n\nUpdates existing post or creates new one"
      },
      "typeVersion": 1
    },
    {
      "id": "c444b15e-d08f-474d-a10b-30414590af77",
      "name": "付箋7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2672,
        -224
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 144,
        "content": "## STEP 7\n\n- saves to content_created sheet\n- Error → logs to webflow_error_logs sheet"
      },
      "typeVersion": 1
    },
    {
      "id": "af2bab6c-5315-4c8a-9ebe-e0d71b2def54",
      "name": "キーワードなし",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -5760,
        -336
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "bc529bba-49c5-4ba7-95f2-9388f4440ede",
      "name": "付箋8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3920,
        416
      ],
      "parameters": {
        "color": 5,
        "width": 704,
        "height": 400,
        "content": "\n### ⚙️ Webflow OAuth Setup Required\n\n**Before running this workflow, configure Webflow OAuth2 credentials in n8n:**\n\n1. **In n8n:** Credentials → Create new → Webflow OAuth2 API → Copy the OAuth Redirect URL\n\n2. **In Webflow:** Workspace Settings → Apps & Integrations → Develop → Create an app\n\n3. **Configure your app:**\n   - App name & description (required)\n   - App homepage URL: your n8n instance URL\n   - Toggle on \"Data Client REST API\"\n   - Copy Client ID and Client Secret → paste into n8n credentials\n   - Paste the OAuth Redirect URL from n8n\n   - Select permissions (recommend read-write for CMS collections)\n\nFind your Site/Collection IDs in Webflow's Designer or CMS settings."
      },
      "typeVersion": 1
    },
    {
      "id": "c3becf95-359b-4a4a-8dc7-4e9faacf5b81",
      "name": "AI画像生成ツール",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        -5504,
        288
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "iYw38zcdqp4HuOZR",
          "cachedResultName": "AI image generation for automatic content creation"
        },
        "description": "Generate ONE AI image for content. Pass imagePrompt, imageTitle, and keyword to create a single relevant image. This tool should be called exactly once per article.",
        "workflowInputs": {
          "value": {
            "altText": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('altText', `A clear, descriptive, and SEO-friendly alternative text for the image. Should naturally include the image and remain under 125 characters for accessibility.`, 'string') }}",
            "keyword": "={{ $json['main keyword'] }}",
            "imageTitle": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('imageTitle', `A concise, professional title for the featured image that clearly reflects the main topic of the article`, 'string') }}",
            "imagePrompt": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('imagePrompt', `A concise, professional title for the featured image that clearly reflects the main topic of the article`, 'string') }}"
          },
          "schema": [
            {
              "id": "imageTitle",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "imageTitle",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "imagePrompt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "imagePrompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "keyword",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "keyword",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "altText",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "altText",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "4aa37110-3c5b-4086-bf30-3c3f0c2b47c7",
      "name": "他ワークフロー実行時",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        -6224,
        2416
      ],
      "parameters": {
        "workflowInputs": {
          "values": [
            {
              "name": "imageTitle"
            },
            {
              "name": "imagePrompt"
            },
            {
              "name": "keyword"
            },
            {
              "name": "altText"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "af3cac37-624f-41f1-b9cf-1136e23d06c1",
      "name": "画像応答を処理",
      "type": "n8n-nodes-base.code",
      "position": [
        -5696,
        2416
      ],
      "parameters": {
        "jsCode": "const response = $json;\nlet imageUrl = '';\n\ntry {\n  // OpenRouter returns images in the assistant message\n  if (response.choices && response.choices.length > 0) {\n    const message = response.choices[0].message;\n    \n    // Check for images array in the message\n    if (message.images && message.images.length > 0) {\n      // Extract the base64 data URL from the first image\n      imageUrl = message.images[0].image_url.url;\n    }\n  }\n  \n  // Fallback checks\n  if (!imageUrl && response.data && response.data.length > 0) {\n    imageUrl = response.data[0].url;\n  }\n  \n} catch (error) {\n  console.error('Error processing OpenRouter image response:', error);\n}\n\nconst originalInputs = $('When Executed by Another Workflow').item.json;\n\nreturn {\n  json: {\n    imageUrl: imageUrl,\n    imageTitle: originalInputs.imageTitle,\n    keyword: originalInputs.keyword,\n    imagePrompt: originalInputs.imagePrompt,\n    altText: originalInputs.altText || `${originalInputs.keyword} featured image`,\n    imageGenerated: !!imageUrl,\n    generatedAt: new Date().toISOString(),\n    status: imageUrl ? 'success' : 'failed',\n    rawResponse: response\n  }\n};\n"
      },
      "typeVersion": 2
    },
    {
      "id": "1a9080e8-19e5-4aa1-afee-a938fc89615d",
      "name": "画像生成を確認",
      "type": "n8n-nodes-base.if",
      "position": [
        -5408,
        2416
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "image-check",
              "operator": {
                "type": "string",
                "operation": "isNotEmpty"
              },
              "leftValue": "={{ $json.imageUrl }}",
              "rightValue": ""
            },
            {
              "id": "68f8678d-2c93-4335-aa18-bcaa0df7985f",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.imageUrl }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "558fd78f-7410-44ea-8af3-8ab5580989aa",
      "name": "生成失敗を処理",
      "type": "n8n-nodes-base.code",
      "position": [
        -5056,
        2128
      ],
      "parameters": {
        "jsCode": "const originalData = $('Process Image Response').item.json;\nconst error = $json.error || 'Image generation failed';\n\nconsole.error(`Image generation failed for: ${originalData.keyword}`);\nconsole.error(`Error: ${error}`);\n\nreturn {\n  json: {\n    imageUrl: '',\n    imageTitle: originalData.imageTitle,\n    keyword: originalData.keyword,\n    imagePrompt: originalData.imagePrompt,\n    imageGenerated: false,\n    status: 'failed',\n    error: error,\n    generatedAt: new Date().toISOString(),\n    message: `Failed to generate image for '${originalData.imageTitle}'`\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "4828babb-1f1c-4e19-86a3-effc98f5e4f4",
      "name": "結果",
      "type": "n8n-nodes-base.set",
      "position": [
        -4320,
        2544
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c66c7c13-57ca-4191-9af3-5ab306dfedfc",
              "name": "Response",
              "type": "string",
              "value": "=The image was created and named \"{{ $json.name }}\" and the following altText \"{{ $('Convert Base64 to Binary').item.json.altText }}\"\n\nHere is the link to the image in Google Drive: {{ $json.webViewLink }}\n\nHere's the download link: {{ $json.webContentLink }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "6756130b-2e51-4457-a28d-f810f9968fac",
      "name": "Base64をバイナリに変換",
      "type": "n8n-nodes-base.code",
      "position": [
        -5024,
        2544
      ],
      "parameters": {
        "jsCode": "// Extract base64 from data URL and convert to binary\nconst input = $input.first().json;\nconst base64String = input.imageUrl.replace(/^data:image\\/\\w+;base64,/, '');\nconst buffer = Buffer.from(base64String, 'base64');\n\n// Pass through other data and add binary\nreturn {\n  json: {\n    imageTitle: input.imageTitle,\n    imageUrl: input.imageUrl,\n    altText: input.altText || `${input.keyword} featured image`,  \n    keyword: input.keyword,  \n    imagePrompt: input.imagePrompt  \n  },\n  binary: {\n    data: await this.helpers.prepareBinaryData(\n      buffer,\n      `${input.imageTitle || input.keyword}_raw.png`,\n      'image/png'\n    )\n  }\n};\n"
      },
      "typeVersion": 2
    },
    {
      "id": "9830cce4-9d2f-450f-a61a-2937b3d9831c",
      "name": "Google ドライブにアップロード",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -4784,
        2544
      ],
      "parameters": {
        "name": "={{ $json.imageTitle }}.png",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive",
          "cachedResultUrl": "https://drive.google.com/drive/my-drive",
          "cachedResultName": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1CYgRUELLCpM1tHx5cM6hBpf5RdfxItR0",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1CYgRUELLCpM1tHx5cM6hBpf5RdfxItR0",
          "cachedResultName": "AI images"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "0tTY9psJ9CGds01o",
          "name": "Google Drive Dummy Account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "4c611c1f-8a67-482f-a8c2-3faccc234d84",
      "name": "ダウンロードリンクを取得",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -4528,
        2544
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "url",
          "value": "={{ $json.webViewLink }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "0tTY9psJ9CGds01o",
          "name": "Google Drive Dummy Account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "281da2fe-0d6e-47c7-9073-ada1b0f83343",
      "name": "画像を生成",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -5952,
        2416
      ],
      "parameters": {
        "url": "https://openrouter.ai/api/v1/chat/completions",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"model\": \"google/gemini-2.5-flash-image-preview\",\n  \"messages\": [\n    {\n      \"role\": \"user\", \n      \"content\": \"Generate an image: {{ $json.imagePrompt }}\"\n    }\n  ],\n  \"modalities\": [\"image\", \"text\"],\n  \"max_tokens\": 1000\n}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "typeVersion": 4.2
    },
    {
      "id": "057b7038-0135-486c-9d85-e58c420280a2",
      "name": "付箋9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4032,
        2224
      ],
      "parameters": {
        "width": 528,
        "height": 496,
        "content": "### 🎨 AI Image Generation Sub-Workflow\n\nGenerates custom AI images for SEO posts.\n\n**How it works:**\n1. Called by parent workflow with image parameters\n2. Gemini 2.5 Flash creates image from prompt\n3. Uploads to Google Drive, returns shareable link\n\n**Inputs Required:**\n- imageTitle: filename/title\n- imagePrompt: AI generation instructions\n- keyword: topic keyword\n- altText: accessibility text\n\n**Output:**\n- Google Drive download link\n- Alt text for SEO\n- Image metadata\n\n**Setup:** Configure OpenRouter API key and Google Drive folder ID before use.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "610f756e-b237-4712-b602-4fae1cf0d842",
      "name": "付箋10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6016,
        2224
      ],
      "parameters": {
        "color": 7,
        "height": 352,
        "content": "## Step 1\n\nCalls OpenRouter with Gemini 2.5 Flash to create image based on prompt. You can modify based on your own tools and preference."
      },
      "typeVersion": 1
    },
    {
      "id": "6051dd14-fc03-4a39-b781-67c7a8c405e4",
      "name": "付箋11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5744,
        2224
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 352,
        "content": "## Step 2\n\nParses API response and extracts base64 image URL from response structure"
      },
      "typeVersion": 1
    },
    {
      "id": "f6299361-eb86-4f48-86cf-8d4c661d198d",
      "name": "付箋12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5456,
        2224
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 352,
        "content": "## Step 3\n\n\nChecks if imageUrl exists and is not empty. Routes to success or error path."
      },
      "typeVersion": 1
    },
    {
      "id": "07b288ff-289c-489a-99d3-0c1f0ad36d61",
      "name": "付箋13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5088,
        1952
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 352,
        "content": "## Step extra\n\n\nConverts base64 data URL to binary format required for file upload"
      },
      "typeVersion": 1
    },
    {
      "id": "8c05b88e-eb47-4c9d-9d68-ddc3e50115e5",
      "name": "付箋14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5072,
        2400
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 352,
        "content": "## Step 4\n\nUploads binary image to Google Drive with descriptive filename"
      },
      "typeVersion": 1
    },
    {
      "id": "b743d732-0624-4572-b286-f30e6839784b",
      "name": "付箋15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4816,
        2400
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 352,
        "content": "## Step 5\n\n\nDownloads file to get permanent shareable and download links"
      },
      "typeVersion": 1
    },
    {
      "id": "7cfff106-510f-46d9-aed2-f8d5cde4369b",
      "name": "付箋16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4368,
        2400
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 352,
        "content": "## Step 6\n\nFormats final output with image URL, alt text, and confirmation message"
      },
      "typeVersion": 1
    },
    {
      "id": "8a0e7ba0-5c3d-4c72-a5c6-10318074769c",
      "name": "付箋18",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6272,
        1680
      ],
      "parameters": {
        "color": 3,
        "width": 2896,
        "height": 144,
        "content": "\n# Important\nThis workflow should be created as an individual one. Then, in the Agent Tool node, you need to select it as the tool. DON'T try to run it inside the same workflow."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "f48990ab-4845-4d5f-9050-6abb325afe3a",
  "connections": {
    "6c19a117-9bac-4598-9618-432ca067a02f": {
      "main": [
        [
          {
            "node": "ebe7106d-a3bb-4396-989c-5aba594e828d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d833be28-654b-41f1-af4d-bcf18e8aa3ec": {
      "main": [
        [
          {
            "node": "632a7c39-687c-4ea9-95e0-dd57b302c191",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "632a7c39-687c-4ea9-95e0-dd57b302c191": {
      "main": [
        [
          {
            "node": "5f4abc50-4c29-4424-9668-b3eb1494fb66",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4755da23-5ea0-4420-b5a2-7976e41411d1": {
      "main": [
        [
          {
            "node": "a013bc1b-70af-4c27-9c88-c5df8a913bd1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "d833be28-654b-41f1-af4d-bcf18e8aa3ec",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9081f1d4-5dac-4350-b910-e17ad918208f": {
      "ai_memory": [
        [
          {
            "node": "6c19a117-9bac-4598-9618-432ca067a02f",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "457c8c37-c678-4299-8676-4ec41c2ba56d": {
      "main": [
        [
          {
            "node": "6a7bc453-cf01-4bed-88a9-7b8d478793a2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "281da2fe-0d6e-47c7-9073-ada1b0f83343": {
      "main": [
        [
          {
            "node": "af3cac37-624f-41f1-b9cf-1136e23d06c1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7554230a-0c6b-4654-ab87-5f527675912f": {
      "main": [
        [
          {
            "node": "7f443fca-2d0f-43e2-83be-74f096c0c92b",
            "type": "main",
            "index": 0
          },
          {
            "node": "ad6944f8-67ac-4454-b011-61f833541b97",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a3f5e05d-a525-4fdd-a214-998806a344b0": {
      "main": [
        [
          {
            "node": "42e4fb72-e16f-4dd3-a1ea-9aa94443f5ec",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "3474f5e5-84e7-44c5-8751-e53ffedffd1e": {
      "main": [
        [
          {
            "node": "af2bab6c-5315-4c8a-9ebe-e0d71b2def54",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "6c19a117-9bac-4598-9618-432ca067a02f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a013bc1b-70af-4c27-9c88-c5df8a913bd1": {
      "main": [
        [
          {
            "node": "ab10a761-91e4-4b64-8164-c87134bcbb45",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d10c11b9-0cbe-4725-ae66-fe4c381666c5": {
      "main": [
        [
          {
            "node": "85a2baaf-7fd0-4cb9-b200-7f56d3781275",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7f443fca-2d0f-43e2-83be-74f096c0c92b": {
      "main": [
        [
          {
            "node": "0bcdca31-1f50-41fe-b748-91a732a730a2",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "42e4fb72-e16f-4dd3-a1ea-9aa94443f5ec": {
      "main": [
        [
          {
            "node": "4755da23-5ea0-4420-b5a2-7976e41411d1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "13743c5a-d649-49a3-8cd6-4c03494d9749": {
      "ai_languageModel": [
        [
          {
            "node": "6c19a117-9bac-4598-9618-432ca067a02f",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "4c611c1f-8a67-482f-a8c2-3faccc234d84": {
      "main": [
        [
          {
            "node": "4828babb-1f1c-4e19-86a3-effc98f5e4f4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ad6944f8-67ac-4454-b011-61f833541b97": {
      "main": [
        [
          {
            "node": "0bcdca31-1f50-41fe-b748-91a732a730a2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5f4abc50-4c29-4424-9668-b3eb1494fb66": {
      "main": [
        [
          {
            "node": "3474f5e5-84e7-44c5-8751-e53ffedffd1e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6a7bc453-cf01-4bed-88a9-7b8d478793a2": {
      "main": [
        [
          {
            "node": "0a272acd-2853-45c9-bdc6-c69d876648f8",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "0a272acd-2853-45c9-bdc6-c69d876648f8": {
      "main": [
        [
          {
            "node": "7554230a-0c6b-4654-ab87-5f527675912f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ebe7106d-a3bb-4396-989c-5aba594e828d": {
      "main": [
        [
          {
            "node": "3403fae8-07ba-4faf-9db5-0ad221b1360e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ab10a761-91e4-4b64-8164-c87134bcbb45": {
      "main": [
        [
          {
            "node": "5f4abc50-4c29-4424-9668-b3eb1494fb66",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ac01b0a4-ecda-4f20-afc8-9aa582fda210": {
      "main": [
        [
          {
            "node": "42e4fb72-e16f-4dd3-a1ea-9aa94443f5ec",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3403fae8-07ba-4faf-9db5-0ad221b1360e": {
      "main": [
        [
          {
            "node": "0a272acd-2853-45c9-bdc6-c69d876648f8",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "457c8c37-c678-4299-8676-4ec41c2ba56d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "85a2baaf-7fd0-4cb9-b200-7f56d3781275": {
      "main": [
        [
          {
            "node": "3474f5e5-84e7-44c5-8751-e53ffedffd1e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1a9080e8-19e5-4aa1-afee-a938fc89615d": {
      "main": [
        [
          {
            "node": "558fd78f-7410-44ea-8af3-8ab5580989aa",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "6756130b-2e51-4457-a28d-f810f9968fac",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "af3cac37-624f-41f1-b9cf-1136e23d06c1": {
      "main": [
        [
          {
            "node": "1a9080e8-19e5-4aa1-afee-a938fc89615d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9830cce4-9d2f-450f-a61a-2937b3d9831c": {
      "main": [
        [
          {
            "node": "4c611c1f-8a67-482f-a8c2-3faccc234d84",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5c7c7872-e391-479c-b9de-c82c9e1af5f8": {
      "main": [
        [
          {
            "node": "ac01b0a4-ecda-4f20-afc8-9aa582fda210",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "a3f5e05d-a525-4fdd-a214-998806a344b0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c3becf95-359b-4a4a-8dc7-4e9faacf5b81": {
      "ai_tool": [
        [
          {
            "node": "6c19a117-9bac-4598-9618-432ca067a02f",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "6756130b-2e51-4457-a28d-f810f9968fac": {
      "main": [
        [
          {
            "node": "9830cce4-9d2f-450f-a61a-2937b3d9831c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0bcdca31-1f50-41fe-b748-91a732a730a2": {
      "main": [
        [
          {
            "node": "5c7c7872-e391-479c-b9de-c82c9e1af5f8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4aa37110-3c5b-4086-bf30-3c3f0c2b47c7": {
      "main": [
        [
          {
            "node": "281da2fe-0d6e-47c7-9073-ada1b0f83343",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
よくある質問

このワークフローの使い方は?

上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。

このワークフローはどんな場面に適していますか?

上級 - コンテンツ作成, マルチモーダルAI

有料ですか?

このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。

ワークフロー情報
難易度
上級
ノード数54
カテゴリー2
ノードタイプ21
難易度説明

上級者向け、16ノード以上の複雑なワークフロー

作成者
Dahiana

Dahiana

@mssporto

No-Code Specialist with more than 10 years of experience in Digital Marketing. Currently working with Bubble. Webflow, AI, Agents and N8N.

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34