ホスト構築環境での自動作業フローおよびリダイレクト復元システム

上級

これはContent Creation, Multimodal AI分野の自動化ワークフローで、17個のノードを含みます。主にIf, Code, EmailSend, StopAndError, ManualTriggerなどのノードを使用。 オンプレミス環境における自動化ワークフローと認証情報復元システム

前提条件
  • 特別な前提条件なし、インポートしてすぐに使用可能
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "meta": {
    "instanceId": "",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "-1-0",
      "name": "付箋1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        -704
      ],
      "parameters": {
        "color": 3,
        "width": 1152,
        "height": 256,
        "content": "## 1. Restore Credentials from Disk"
      },
      "typeVersion": 1
    },
    {
      "id": "--1",
      "name": "復元開始",
      "type": "n8n-nodes-base.manualTrigger",
      "notes": "CRED 1 WF 0",
      "position": [
        -368,
        -320
      ],
      "parameters": {},
      "notesInFlow": true,
      "typeVersion": 1
    },
    {
      "id": "-2-2",
      "name": "付箋2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -432,
        -1120
      ],
      "parameters": {
        "color": 4,
        "width": 912,
        "height": 976,
        "content": "## Start here\n### ⚠ Warnings ⚠\n• In case of full restore, restore Credentials first!\n• Any already existing credential or workflow will be overwritten…\n\n### Instructions\n• Optionnally re-create your SMTP credential.\n• Manually copy this workflow to your new n8n instance.\n• Launch it and restore everything!\n\nCan be used to move your workflows to another instance 👍🏻\n\n### Configure the \"Start Restore\" JSON according to your need\n```\n[\n  {\n    \"credentials\": true,\n    \"worflows\": false\n  }\n]\n```\n(and modify the \"notes\" too!).\n\n### Configure the \"Init\" node\n```\nconst BACKUP_FOLDER = $env.N8N_BACKUP_FOLDER || '/files/n8n-backups';\nconst workflows_temp_folder = '_restore_temp';\nconst credentials = \"n8n-credentials\";\n```"
      },
      "typeVersion": 1
    },
    {
      "id": "-3-3",
      "name": "付箋3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        416,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 224,
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "--4",
      "name": "付箋",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        -416
      ],
      "parameters": {
        "color": 5,
        "width": 1152,
        "height": 272,
        "content": "## 2. Restore Workflows from Disk"
      },
      "typeVersion": 1
    },
    {
      "id": "SUCCESS-email-5",
      "name": "SUCCESS email",
      "type": "n8n-nodes-base.emailSend",
      "disabled": true,
      "position": [
        1008,
        -608
      ],
      "webhookId": "58bbbcb4-a98a-4432-a617-7df665a42e61",
      "parameters": {
        "text": "=Credential restore from Disk has been successfully executed 🥳\n\nexitCode: {{ $json.exitCode }}\nstderr: {{ $json.stderr || \"no error\"}}\n\nSteps:\n\n1. Find Last Backup: {{ $('Find Last Backup').item.json.credentialsFullBackupPath }}\n\n2. Restore credentials:\n{{ $json.stdout }}",
        "options": {},
        "subject": "=n8n SUCCESS: {{ $workflow.name }}",
        "toEmail": "={{ $env.N8N_ADMIN_EMAIL }}",
        "fromEmail": "admin <admin@example.com>",
        "emailFormat": "text"
      },
      "typeVersion": 2.1
    },
    {
      "id": "--6",
      "name": "バックアップフォルダ一覧",
      "type": "n8n-nodes-base.executeCommand",
      "position": [
        80,
        -320
      ],
      "parameters": {
        "command": "=ls -1 {{ $json.customConfig.backupFolder }}"
      },
      "typeVersion": 1
    },
    {
      "id": "--7",
      "name": "認証情報復元",
      "type": "n8n-nodes-base.executeCommand",
      "position": [
        784,
        -608
      ],
      "parameters": {
        "command": "=n8n import:credentials --separate --input={{ $('Find Last Backup').item.json.credentialsFullBackupPath }}"
      },
      "typeVersion": 1
    },
    {
      "id": "SUCCESS-email-Workflows-8",
      "name": "SUCCESS email Workflows",
      "type": "n8n-nodes-base.emailSend",
      "disabled": true,
      "position": [
        1456,
        -320
      ],
      "webhookId": "",
      "parameters": {
        "text": "=Workflows' restore from Disk has been successfully executed 🥳\n\nexitCode: {{ $json.exitCode }}\nstderr: {{ $json.stderr || \"no error\"}}\n\nSteps:\n\n1. Find Last Backup: {{ $('Find Last Backup').item.json.workflowsFullBackupPath }}\n\n2. Exclude current workflow:\n{{ $('Exclude Current Workflow From Selection').item.json.stdout }}\n\n3. Restore workflows:\n{{ $('Restore Workflows').item.json.stdout }}\n\n4. Delete temporary folder:\n{{ $json.stdout }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "=n8n SUCCESS: {{ $workflow.name }}",
        "toEmail": "={{ $env.N8N_ADMIN_EMAIL }}",
        "fromEmail": "admin <admin@example.com>",
        "emailFormat": "text"
      },
      "typeVersion": 2.1
    },
    {
      "id": "Exclude-Current-Workflow-From-Selection-9",
      "name": "Exclude Current Workflow From Selection",
      "type": "n8n-nodes-base.executeCommand",
      "notes": "Copy to TEMP",
      "position": [
        784,
        -320
      ],
      "parameters": {
        "command": "=#!/bin/bash\n\n# Exclude current workflow from server restoration\n# This script creates a temporary copy of all workflows EXCEPT the current one\n\n# Get workflow info\nWORKFLOW_NAME=\"{{ $workflow.name }}\"\nBACKUP_FOLDER=\"{{ $('Find Last Backup').first().json.backupFolder }}\"\nPROJECT_ROOT_PATH=\"{{ $('Init').first().json.workflowConfig.PROJECT_ROOT_PATH }}\"\nBACKUP_DATE=\"{{ $('Find Last Backup').first().json.latestBackupDate }}\"\nWORKFLOWS_TEMP_FOLDER=\"{{ $('Init').first().json.customConfig.workflows_temp_folder }}\"\n\n# Source is the backup folder with date\nSOURCE_FOLDER=\"${BACKUP_FOLDER}/${BACKUP_DATE}\"\n\n# Destination is inside the project root path with backup date\nTEMP_RESTORE_FOLDER=\"${PROJECT_ROOT_PATH}/${BACKUP_DATE}_restore_temp\"\n\n# Clean the workflow name (same logic as Clean Filename node)\nCLEANED_NAME=$(echo \"$WORKFLOW_NAME\" | sed 's/[<>:\"/\\\\|?*[:cntrl:]]/_/g' | sed 's/[[:space:].]\\+/_/g' | sed 's/_\\+/_/g' | sed 's/^_\\+//;s/_\\+$//')\n\necho \"🔍 Current workflow: $WORKFLOW_NAME\"\necho \"🧹 Cleaned name: $CLEANED_NAME\"\necho \"💾 Backup folder: $BACKUP_FOLDER\"\necho \"📅 Backup date: $BACKUP_DATE\"\necho \"📂 Source folder: $SOURCE_FOLDER\"\necho \"📂 Project root: $PROJECT_ROOT_PATH\"\necho \"📂 Temp restore folder: $TEMP_RESTORE_FOLDER\"\n\n# Create temporary restore folder\nmkdir -p \"$TEMP_RESTORE_FOLDER\"\necho \"✅ Created temporary restore folder\"\n\n# Count total workflows in source\nTOTAL_COUNT=$(ls -1 \"$SOURCE_FOLDER\"/*.json 2>/dev/null | wc -l)\necho \"📊 Total workflows in source: $TOTAL_COUNT\"\n\n# Copy all workflows EXCEPT the current one\nCOPIED_COUNT=0\nSKIPPED_CURRENT=false\n\nfor file in \"$SOURCE_FOLDER\"/*.json; do\n  if [ -f \"$file\" ]; then\n    filename=$(basename \"$file\")\n    \n    # Check if this is the current workflow\n    if [ \"$filename\" = \"${CLEANED_NAME}.json\" ]; then\n      echo \"⏭️  Skipping current workflow: $filename\"\n      SKIPPED_CURRENT=true\n    else\n      cp \"$file\" \"$TEMP_RESTORE_FOLDER/\"\n      COPIED_COUNT=$((COPIED_COUNT + 1))\n    fi\n  fi\ndone\n\n# Display summary\necho \"\"\necho \"📊 COPY SUMMARY:\"\necho \"   Total workflows: $TOTAL_COUNT\"\necho \"   Copied: $COPIED_COUNT\"\necho \"   Skipped (current): $([ \"$SKIPPED_CURRENT\" = true ] && echo \"1\" || echo \"0\")\"\necho \"\"\n\nif [ \"$COPIED_COUNT\" -eq 0 ]; then\n  echo \"⚠️  No workflows to restore (only current workflow found)\"\n  # Clean up empty temp folder\n  rmdir \"$TEMP_RESTORE_FOLDER\"\n  exit 0\nfi\n\necho \"✅ Ready for import from: $TEMP_RESTORE_FOLDER\"\necho \"💡 Use this folder path in the next Import Workflows node\""
      },
      "notesInFlow": true,
      "typeVersion": 1
    },
    {
      "id": "--10",
      "name": "ワークフロー復元",
      "type": "n8n-nodes-base.executeCommand",
      "position": [
        1008,
        -320
      ],
      "parameters": {
        "command": "=n8n import:workflow --separate --input={{ $('Init').first().json.workflowConfig.PROJECT_ROOT_PATH }}/{{ $('Find Last Backup').first().json.latestBackupDate }}{{ $('Init').first().json.customConfig.workflows_temp_folder }}"
      },
      "typeVersion": 1
    },
    {
      "id": "--11",
      "name": "初期化",
      "type": "n8n-nodes-base.code",
      "position": [
        -144,
        -320
      ],
      "parameters": {
        "jsCode": "// ==========================================\n// 📅 LOCAL DATE/TIME INITIALIZATION\n// ==========================================\n\nconst now = new Date();\n\n// ==========================================\n// 🌍 USER-DEFINED TIMEZONE CONFIGURATION\n// ==========================================\n// ⚠️  IMPORTANT: This code runs on the n8n SERVER, not in your browser!\n// ⚠️  Configure the timezone where you want executions to be scheduled,\n//      regardless of where your n8n server is physically located.\n//\n// 📍 Common timezone examples:\n// - 'Europe/Paris'       → Central European Time (CET/CEST)\n// - 'America/New_York'   → Eastern Time (EST/EDT)\n// - 'America/Chicago'    → Central Time (CST/CDT)\n// - 'America/Los_Angeles'→ Pacific Time (PST/PDT)\n// - 'Asia/Tokyo'         → Japan Standard Time (JST)\n// - 'Asia/Shanghai'      → China Standard Time (CST)\n// - 'Australia/Sydney'   → Australian Eastern Time (AET)\n// - 'UTC'                → Coordinated Universal Time\n//\n// 🔧 TO CONFIGURE FOR YOUR USE CASE:\n// 1. Uncomment and edit the lines below with your desired timezone\n// 2. Comment out the automatic detection line\n//\n// To use user-defined timezone instead, UNCOMMENT these lines:\n// const USER_TIMEZONE = 'Europe/Paris';  // 👈 EDIT THIS for your location\n// const LOCAL_TIMEZONE = USER_TIMEZONE;  // 👈 EDIT THIS for your location\n//\n// 🕘 Automatic detection (uses server timezone or environment variable):\nconst LOCAL_TIMEZONE = $env.GENERIC_TIMEZONE || 'Europe/Paris';  // 🟢 Default fallback\n// To use user-defined timezone instead, comment out the above line\n\n// Local datetime in YYYY-MM-DD_HH-MM-SS format\nconst localDateTime = now.toLocaleString('sv-SE', { \n  timeZone: LOCAL_TIMEZONE,\n  year: 'numeric',\n  month: '2-digit',\n  day: '2-digit',\n  hour: '2-digit',\n  minute: '2-digit',\n  second: '2-digit'\n}).replace(' ', '_').replace(/:/g, '-');\n\n// Local formatted time for display\nconst localDateTimeFormatted = now.toLocaleString('sv-SE', { \n  timeZone: LOCAL_TIMEZONE,\n  year: 'numeric',\n  month: '2-digit',\n  day: '2-digit',\n  hour: '2-digit',\n  minute: '2-digit',\n  second: '2-digit'\n});\n\n// Local time HH:MM:SS format\nconst localTimeFormatted = now.toLocaleString('sv-SE', { \n  timeZone: LOCAL_TIMEZONE,\n  hour: '2-digit',\n  minute: '2-digit',\n  second: '2-digit'\n});\n\n// Local date in YYYY-MM-DD format\nconst localDate = now.toLocaleDateString('sv-SE', { timeZone: LOCAL_TIMEZONE });\n\n// Local time in French format\nconst localTimeFR = now.toLocaleString('sv-SE', { \n  timeZone: LOCAL_TIMEZONE,\n  hour: '2-digit',\n  minute: '2-digit'\n}).replace(/:/g, 'h').replace(/^0(\\d)h/, '$1h');\n\nconsole.log('🚀 USER-DEFINE TIMEZONE VARIABLES INITIALISED (Local timezone):');\nconsole.log(`   🌍 Timezone: ${LOCAL_TIMEZONE}`);\nconsole.log(`   ✨ Now (UTC): ${now}`);\nconsole.log(`   📅 Local date/time: ${localDateTime}`);\nconsole.log(`   🕐 Local time: ${localDateTimeFormatted}`);\nconsole.log(`   🕐 Local time: ${localTimeFormatted}`);\nconsole.log(`   📅 Local date: ${localDate}`);\nconsole.log(`   📅 Local time (FR): ${localTimeFR}`);\n\n// Create structure for time data output\nconst timeData = {\n  localTimeZone:LOCAL_TIMEZONE,\n  nowDateUTC: now,\n  nowUTCstring: now.toISOString(),        // UTC for calculations\n  localDateTime: localDateTime,     // YYY-MM-DD_HH-MM-SS format\n  localDateTimeFormatted: localDateTimeFormatted, // Human readable\n  localTimeFormatted: localTimeFormatted, // Human readable\n  localDate: localDate,             // YYYY-MM-DD format\n  localTime: localTimeFR            // HHhMM format (FR)\n}\n\n// ==========================================\n// 📝 WORKFLOW STANDARD CONFIGURATION\n// ==========================================\n\nconst N8N_ADMIN_EMAIL = $env.N8N_ADMIN_EMAIL || 'youremail@example.com';\nconst WORKFLOW_NAME = $workflow.name;\nconst N8N_PROJECTS_DIR = $env.N8N_PROJECTS_DIR || '/files/n8n-projects-data'; // ⚠️ Your projects' ROOT folder here\n// projects-root-folder/\n//   └── Your-project-folder-name/\n//       ├── logs/\n//       ├── reports/\n//       ├── ...\n//       └── [other project files]\nconst PROJECT_FOLDER_NAME = \"Workflow-backups\"; // ⚠️ Your project folder\nconst PROJECT_ROOT_PATH = `${N8N_PROJECTS_DIR}/${PROJECT_FOLDER_NAME}`;\n\nconst LOGS_PATH = `${PROJECT_ROOT_PATH}/logs`;\nconst logFileName = `${localDateTime}-backup_logs.json`;  // ⚠️ Your log file name\nconst logPathFileName = `${LOGS_PATH}/${logFileName}`;\n\n// Configuration for report generation\nconst REPORTS_PATH = `${PROJECT_ROOT_PATH}/reports`;\nconst reportFileName = `${localDateTime}-report.txt`;\nconst reportPathFileName = `${REPORTS_PATH}/${reportFileName}`;\n\n// Console output\nconsole.log('🧾 STANDARD WORKFLOW VARIABLES INITIALISED:');\nconsole.log(`   📁 Admin email: ${N8N_ADMIN_EMAIL}`);\nconsole.log(`   📁 Workflow name: ${WORKFLOW_NAME}`);\nconsole.log(`   📁 Projects folder: ${N8N_PROJECTS_DIR}`);\nconsole.log(`   📁 Project folder name: ${PROJECT_FOLDER_NAME}`);\nconsole.log(`   📁 Project root path: ${PROJECT_ROOT_PATH}`);\nconsole.log(`   📁 Log path: ${LOGS_PATH}`);\nconsole.log(`   📁 Log file name: ${logFileName}`);\nconsole.log(`   📁 Log file path: ${logPathFileName}`);\nconsole.log(`   📁 Reports path: ${REPORTS_PATH}`);\nconsole.log(`   📁 Report file name: ${reportFileName}`);\nconsole.log(`   📁 Report file path: ${reportPathFileName}`);\n\n// Create structure for workflow configuration output\nconst workflowConfig = {\n  workflowStep: 'init',\n  N8N_ADMIN_EMAIL,\n  WORKFLOW_NAME,\n  N8N_PROJECTS_DIR,\n  PROJECT_FOLDER_NAME,\n  PROJECT_ROOT_PATH,\n  LOGS_PATH,\n  logFileName,\n  logPathFileName,\n  REPORTS_PATH,\n  reportFileName,\n  reportPathFileName\n}\n\n// ==========================================\n// 📝 WORKFLOW CUSTOM CONFIGURATION\n// ==========================================\n// ⚠️  INSERT HERE: your workflow custom configuration variables\n\n// Base backup path using your Docker volume configuration (folder must exist)\nconst BACKUP_FOLDER = $env.N8N_BACKUP_FOLDER || '/files/n8n-backups'; // ⚠️ Change the default value for your n8n backup folder\nconst workflows_temp_folder = '_restore_temp';\n\nconst credentials = \"n8n-credentials\";\n\n// Console output\nconsole.log('🧾 CUSTOM WORKFLOW VARIABLES INITIALISED:');\nconsole.log(`   💾 Backup folder: ${BACKUP_FOLDER}`);\nconsole.log('      File prefix:', localDate);\nconsole.log('      Timestamp (UTC):', now);\n\nconst customConfig = {\n  backupFolder: BACKUP_FOLDER,\n  workflows_temp_folder,\n  credentials\n}\n\n// ==========================================\n// 📊 OUTPUT DATA\n// ==========================================\n\nconst initData = {\n  timeData,\n  workflowConfig,\n  customConfig\n};\n\nreturn [{ json: initData }];"
      },
      "typeVersion": 2
    },
    {
      "id": "--12",
      "name": "認証情報を復元しますか?",
      "type": "n8n-nodes-base.if",
      "position": [
        560,
        -608
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $('Start Restore').item.json.credentials }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "--13",
      "name": "ワークフローを復元しますか?",
      "type": "n8n-nodes-base.if",
      "position": [
        560,
        -320
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $('Start Restore').item.json.workflows }}",
              "rightValue": ""
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "TEMP--14",
      "name": "TEMPフォルダ削除",
      "type": "n8n-nodes-base.executeCommand",
      "position": [
        1232,
        -320
      ],
      "parameters": {
        "command": "=# Clean up temporary restore folder\nTEMP_FOLDER=\"{{ $('Init').first().json.workflowConfig.PROJECT_ROOT_PATH }}/{{ $('Find Last Backup').first().json.latestBackupDate }}{{ $('Init').first().json.customConfig.workflows_temp_folder }}\"\n\nif [ -d \"$TEMP_FOLDER\" ]; then\n  rm -rf \"$TEMP_FOLDER\"\n  echo \"✅ Cleaned up temporary restore folder: $TEMP_FOLDER\"\nelse\n  echo \"ℹ️ Temporary folder already removed or not found\"\nfi"
      },
      "typeVersion": 1
    },
    {
      "id": "ERROR--15",
      "name": "ERROR: 最新バックアップフォルダ検索",
      "type": "n8n-nodes-base.stopAndError",
      "position": [
        560,
        -64
      ],
      "parameters": {
        "errorMessage": "={{ $json.error }}"
      },
      "typeVersion": 1
    },
    {
      "id": "--16",
      "name": "最終バックアップ検索",
      "type": "n8n-nodes-base.code",
      "onError": "continueErrorOutput",
      "position": [
        304,
        -320
      ],
      "parameters": {
        "jsCode": "// ==========================================\n// 🔍 FIND LATEST BACKUP FOLDER\n// ==========================================\n\n// Extract init data from previous node\nconst initData = $('Init').first().json;\nconst { timeData, workflowConfig, customConfig } = initData;\n\n// Configuration\nconst BACKUP_FOLDER = customConfig.backupFolder;\nconst credentials = customConfig.credentials;\n\nconsole.log(`🔍 Searching for latest backup in: ${BACKUP_FOLDER}`);\nconsole.log(`📁 Target credentials folder: ${credentials}`);\n\ntry {\n  // Use Execute Command node before this one with: ls -1 /files/n8n-backups\n  \n  // If you have the directory list from previous node:\n  const inputData = $input.first().json;\n  \n  // Assuming previous Execute Command node returns directory names\n  let directories;\n  \n  if (inputData.stdout) {\n    // Parse stdout from Execute Command node\n    directories = inputData.stdout\n      .split('\\n')\n      .filter(line => line.trim());\n  } else {\n    throw new Error('No directory listing found in input. Please use Execute Command node before this one.');\n  }\n  \n  console.log(`📂 Found directories: ${directories.join(', ')}`);\n  \n  if (directories.length === 0) {\n    throw new Error('No date-formatted directories found in backup folder');\n  }\n  \n  // Sort directories by date (newest first)\n  const sortedDirectories = directories.sort((a, b) => {\n    // Convert YYYY-MM-DD to comparable format\n    const dateA = new Date(a.trim());\n    const dateB = new Date(b.trim());\n    return dateB - dateA; // Descending order (newest first)\n  });\n  \n  console.log(`📅 Sorted directories (newest first): ${sortedDirectories.join(', ')}`);\n  \n  // Get the most recent directory\n  const latestBackupDate = sortedDirectories[0];\n  const credentialsFullBackupPath = `${BACKUP_FOLDER}/${latestBackupDate}/${credentials}`;\n  const workflowsFullBackupPath = `${BACKUP_FOLDER}/${latestBackupDate}/`;\n  \n  console.log(`✅ Latest backup date: ${latestBackupDate}`);\n  console.log(`✅ Credentials' Full backup path: ${credentialsFullBackupPath}`);\n  console.log(`✅ Workflows'   Full backup path: ${workflowsFullBackupPath}`);\n  \n  // Return result\n  const result = {\n    backupFolder: BACKUP_FOLDER,\n    credentialsFolder: credentials,\n    latestBackupDate,\n    credentialsFullBackupPath,\n    workflowsFullBackupPath\n  };\n  \n  return [{ json: result }];\n  \n} catch (error) {\n  \n  console.error(`❌ Error finding latest backup: ${error.message}`);\n  throw new Error(`❌ Error finding latest backup: ${error.message}`);\n  \n}"
      },
      "typeVersion": 2
    }
  ],
  "pinData": {
    "Start Restore": [
      {
        "worflows": false,
        "credentials": true
      }
    ]
  },
  "connections": {
    "--11": {
      "main": [
        [
          {
            "node": "--6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--1": {
      "main": [
        [
          {
            "node": "--11",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--16": {
      "main": [
        [
          {
            "node": "--12",
            "type": "main",
            "index": 0
          },
          {
            "node": "--13",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "ERROR--15",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--6": {
      "main": [
        [
          {
            "node": "--16",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--10": {
      "main": [
        [
          {
            "node": "TEMP--14",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "TEMP--14": {
      "main": [
        [
          {
            "node": "SUCCESS-email-Workflows-8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--13": {
      "main": [
        [
          {
            "node": "Exclude-Current-Workflow-From-Selection-9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--7": {
      "main": [
        [
          {
            "node": "SUCCESS-email-5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--12": {
      "main": [
        [
          {
            "node": "--7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Exclude-Current-Workflow-From-Selection-9": {
      "main": [
        [
          {
            "node": "--10",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
よくある質問

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

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

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

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

有料ですか?

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

関連ワークフロー

n8n ワークフローと認証情報の完全なバックアップソリューション(ローカルストレージと FTP)
n8nのワークフローと認証情報の完全なバックアップソリューション(ローカルストレージとFTPを使用)
Ftp
N8n
Code
+
Ftp
N8n
Code
28 ノードFlorent
コンテンツ作成
人間らしいアクティビティパターンを作成し、ランダム化されたワーキングフローと時間スロットを含む
人間に似せた活動パターンを作成し、ランダムなワークフロースケジューリングとタイムスロットを含む
N8n
Code
Merge
+
N8n
Code
Merge
32 ノードFlorent
コンテンツ作成
YouTube 動画に基づく自律ブログ公開
YouTube 動画から ChatGPT、Sheets、Apify、Pexels、WordPress を使用してブログの自主公開
If
Set
Code
+
If
Set
Code
80 ノードOriol Seguí
コンテンツ作成
コンテンツジェネレーター v3
AI驱动ブログ自動化:使用GPT-4生成并公開SEO記事至WordPressとTwitter
If
Set
Code
+
If
Set
Code
144 ノードJay Emp0
コンテンツ作成
製品レビュー感情分析
Gemini AIを使用して製品レビューを分析し、改善案を生成する
If
Wait
Telegram
+
If
Wait
Telegram
21 ノードMadame AI
コンテンツ作成
インタビュー品質審査
GPT-4o-mini と Google スプレッドシートを使って、Slack でインタビューフィードバックを監査し、レポートを生成
If
Code
Slack
+
If
Code
Slack
23 ノードRahul Joshi
コンテンツ作成
ワークフロー情報
難易度
上級
ノード数17
カテゴリー2
ノードタイプ7
難易度説明

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

作成者
Florent

Florent

@florent

IT Business Analyst for 8+ years, I am finding joy in developping again, with the help of n8n and AIs 🤗

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34