Google DriveからFTPへのファイル転送とJSONログ記録およびレポートの自動化

中級

これはFile Management, Miscellaneous, Multimodal AI分野の自動化ワークフローで、15個のノードを含みます。主にIf, Ftp, Code, Webhook, EmailSendなどのノードを使用。 Google DriveからFTPへのファイル転送を自動化し、JSONログ出力とレポートを生成

前提条件
  • HTTP Webhookエンドポイント(n8nが自動生成)
  • Google Drive API認証情報
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "id": "LJmjAaP6VnaYVBF9",
  "meta": {
    "instanceId": "ade915387b18f7a3b9a14fd8fb677fdbace0ade794de7914e8790d907cd285d0",
    "templateCredsSetupCompleted": true
  },
  "name": "Automated Google Drive to FTP File Transfer with JSON Logging and Reporting",
  "tags": [],
  "nodes": [
    {
      "id": "52861d1c-200e-46dc-84cc-964db24965df",
      "name": "付箋ノート",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        224,
        400
      ],
      "parameters": {
        "width": 444,
        "height": 180,
        "content": "🔗 **WEBHOOK TRIGGER**\n\nManual trigger endpoint:\nPOST to: `/webhook-transfer-status`\n\nUse for on-demand transfers or external integrations."
      },
      "typeVersion": 1
    },
    {
      "id": "81c1ff80-5b17-46a2-9b48-d25894340817",
      "name": "スケジュールトリガー",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        304,
        32
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "fb27fb5b-5ff4-4bb4-82e3-44ad39b72022",
      "name": "Driveファイル取得",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        496,
        32
      ],
      "parameters": {
        "operation": "search"
      },
      "typeVersion": 3
    },
    {
      "id": "112f4226-ff78-4da8-9d97-b729d2ae54cb",
      "name": "ファイルのフィルタリングと検証",
      "type": "n8n-nodes-base.code",
      "position": [
        704,
        32
      ],
      "parameters": {
        "jsCode": "const transferNotes = {\n  metadata: {\n    created: new Date().toISOString(),\n    lastUpdated: new Date().toISOString(),\n    totalFiles: 0,\n    successfulTransfers: 0,\n    failedTransfers: 0,\n    skippedFiles: 0\n  },\n  settings: {\n    maxFileSizeMB: 50,\n    allowedExtensions: ['.pdf', '.doc', '.docx', '.txt', '.jpg', '.png', '.zip', '.xlsx'],\n    autoDeleteAfterTransfer: false,\n    verifyTransfer: true\n  },\n  transfers: [],\n  notes: {\n    general: 'File transfer from Google Drive to FTP server',\n    lastRun: new Date().toISOString(),\n    instructions: 'This workflow automatically transfers files from Google Drive to FTP'\n  }\n};\n\nconst driveFiles = $input.all();\nconst validFiles = [];\n\nfor (const fileItem of driveFiles) {\n  const file = fileItem.json;\n  const fileName = file.name;\n  const fileSize = parseInt(file.size) || 0;\n  const fileExtension = fileName.substring(fileName.lastIndexOf('.')).toLowerCase();\n  \n  const maxSizeBytes = transferNotes.settings.maxFileSizeMB * 1024 * 1024;\n  const isAllowedExtension = transferNotes.settings.allowedExtensions.includes(fileExtension);\n  const isSizeOk = fileSize <= maxSizeBytes;\n  \n  if (isAllowedExtension && isSizeOk) {\n    validFiles.push({\n      id: file.id,\n      name: fileName,\n      size: fileSize,\n      extension: fileExtension,\n      modifiedTime: file.modifiedTime,\n      mimeType: file.mimeType,\n      transferStatus: 'pending'\n    });\n  } else {\n    transferNotes.transfers.push({\n      timestamp: new Date().toISOString(),\n      fileId: file.id,\n      fileName: fileName,\n      fileSize: fileSize,\n      status: 'skipped',\n      reason: !isAllowedExtension ? 'Invalid file extension' : 'File too large',\n      details: {\n        extension: fileExtension,\n        sizeMB: Math.round(fileSize / 1024 / 1024 * 100) / 100\n      }\n    });\n    transferNotes.metadata.skippedFiles++;\n  }\n}\n\ntransferNotes.metadata.totalFiles = validFiles.length;\n\nreturn [{\n  json: {\n    transferNotes: transferNotes,\n    validFiles: validFiles,\n    totalFilesFound: driveFiles.length,\n    validFilesCount: validFiles.length\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "d9f3620c-c532-43fa-9b8b-0b6e47737fd0",
      "name": "ファイルを1つずつ処理",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        896,
        32
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "7622280e-523d-40ed-84a6-6467c46470e8",
      "name": "Driveからダウンロード",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1104,
        32
      ],
      "parameters": {
        "fileId": "={{ $json.validFiles[$json.batchIndex].id }}",
        "options": {},
        "operation": "download"
      },
      "typeVersion": 3
    },
    {
      "id": "90b25c0a-0719-4b24-ac62-e61781e27533",
      "name": "FTPへアップロード",
      "type": "n8n-nodes-base.ftp",
      "position": [
        1296,
        32
      ],
      "parameters": {
        "path": "/remote/directory/{{ $json.validFiles[$json.batchIndex].name }}",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "9cf1b93b-5584-48d9-bb96-91c2665719cf",
      "name": "ノート更新 - 成功",
      "type": "n8n-nodes-base.code",
      "position": [
        1504,
        -64
      ],
      "parameters": {
        "jsCode": "const currentFile = $('split-files').item.json.validFiles[$('split-files').item.json.batchIndex];\nconst transferNotes = $('filter-files').item.json.transferNotes;\n\nconst transferRecord = {\n  timestamp: new Date().toISOString(),\n  fileId: currentFile.id,\n  fileName: currentFile.name,\n  fileSize: currentFile.size,\n  status: 'success',\n  transferDuration: null,\n  ftpPath: `/remote/directory/${currentFile.name}`,\n  details: {\n    extension: currentFile.extension,\n    mimeType: currentFile.mimeType,\n    sizeMB: Math.round(currentFile.size / 1024 / 1024 * 100) / 100\n  }\n};\n\ntransferNotes.transfers.push(transferRecord);\ntransferNotes.metadata.successfulTransfers++;\ntransferNotes.metadata.lastUpdated = new Date().toISOString();\n\nreturn [{\n  json: {\n    transferNotes: transferNotes,\n    currentTransfer: transferRecord,\n    message: `Successfully transferred file: ${currentFile.name}`\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "5ea1483c-1b95-443e-b57f-08a192bc76f9",
      "name": "ノート更新 - エラー",
      "type": "n8n-nodes-base.code",
      "position": [
        1504,
        144
      ],
      "parameters": {
        "jsCode": "const currentFile = $('split-files').item.json.validFiles[$('split-files').item.json.batchIndex];\nconst transferNotes = $('filter-files').item.json.transferNotes;\nconst errorInfo = $input.last().error || 'Unknown error';\n\nconst transferRecord = {\n  timestamp: new Date().toISOString(),\n  fileId: currentFile.id,\n  fileName: currentFile.name,\n  fileSize: currentFile.size,\n  status: 'failed',\n  errorMessage: errorInfo.message || errorInfo,\n  details: {\n    extension: currentFile.extension,\n    mimeType: currentFile.mimeType,\n    sizeMB: Math.round(currentFile.size / 1024 / 1024 * 100) / 100\n  }\n};\n\ntransferNotes.transfers.push(transferRecord);\ntransferNotes.metadata.failedTransfers++;\ntransferNotes.metadata.lastUpdated = new Date().toISOString();\n\nreturn [{\n  json: {\n    transferNotes: transferNotes,\n    currentTransfer: transferRecord,\n    message: `Error during file transfer: ${currentFile.name} - ${errorInfo.message || errorInfo}`\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "ea8a7f9c-b7a8-4a15-8584-7fe59a7d18bd",
      "name": "追加ファイルの確認",
      "type": "n8n-nodes-base.if",
      "position": [
        1696,
        32
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "success-condition",
              "operator": {
                "type": "boolean",
                "operation": "equal"
              },
              "leftValue": "={{ $json.batchIndex < ($json.validFiles.length - 1) }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "25732bf1-2c41-44b3-bcbf-a492f30be6e9",
      "name": "ノート保存 JSON",
      "type": "n8n-nodes-base.writeBinaryFile",
      "position": [
        1904,
        32
      ],
      "parameters": {
        "options": {},
        "fileName": "transfer_notes_{{ new Date().toISOString().split('T')[0] }}.json"
      },
      "typeVersion": 1
    },
    {
      "id": "b400936c-4f5d-4b7e-b414-38accc14bd7a",
      "name": "ノートをDriveにアップロード",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        2096,
        32
      ],
      "parameters": {
        "name": "transfer_notes_{{ new Date().toISOString().split('T')[0] }}.json",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "root",
          "cachedResultName": "/ (Root folder)"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "9a4bffa9-6d4b-495e-af69-68884eeadaab",
      "name": "レポートメール送信",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        2304,
        32
      ],
      "webhookId": "4ef2b12e-aae1-4c93-a034-13bdda075fad",
      "parameters": {
        "options": {
          "appendAttribution": false
        },
        "subject": "Google Drive to FTP File Transfer - Report"
      },
      "typeVersion": 2.1
    },
    {
      "id": "234ca9a5-6ce6-470d-b1f4-31671cf782c3",
      "name": "Webhook トリガー",
      "type": "n8n-nodes-base.webhook",
      "position": [
        304,
        240
      ],
      "webhookId": "transfer-webhook-id",
      "parameters": {
        "path": "/webhook-transfer-status",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2
    },
    {
      "id": "e5ebea62-bc9c-4a56-a52d-0a657df83e2c",
      "name": "最終レポート作成",
      "type": "n8n-nodes-base.code",
      "position": [
        1904,
        240
      ],
      "parameters": {
        "jsCode": "const transferNotes = $json.transferNotes;\nconst summary = {\n  executionDate: new Date().toLocaleString('en-US'),\n  totalFiles: transferNotes.metadata.totalFiles,\n  successful: transferNotes.metadata.successfulTransfers,\n  failed: transferNotes.metadata.failedTransfers,\n  skipped: transferNotes.metadata.skippedFiles,\n  successRate: transferNotes.metadata.totalFiles > 0 ? Math.round((transferNotes.metadata.successfulTransfers / transferNotes.metadata.totalFiles) * 100) : 0,\n  settings: transferNotes.settings,\n  lastUpdated: transferNotes.metadata.lastUpdated\n};\n\nconst successfulTransfers = transferNotes.transfers.filter(t => t.status === 'success').map(t => ({\n  fileName: t.fileName,\n  sizeMB: t.details.sizeMB,\n  timestamp: t.timestamp\n}));\n\nconst failedTransfers = transferNotes.transfers.filter(t => t.status === 'failed').map(t => ({\n  fileName: t.fileName,\n  error: t.errorMessage,\n  timestamp: t.timestamp\n}));\n\nreturn [{\n  json: {\n    summary: summary,\n    successfulTransfers: successfulTransfers,\n    failedTransfers: failedTransfers,\n    fullNotes: transferNotes\n  }\n}];"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "ce584da0-35fd-4b92-a862-13b3256a376b",
  "connections": {
    "90b25c0a-0719-4b24-ac62-e61781e27533": {
      "main": [
        [
          {
            "node": "9cf1b93b-5584-48d9-bb96-91c2665719cf",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fb27fb5b-5ff4-4bb4-82e3-44ad39b72022": {
      "main": [
        [
          {
            "node": "112f4226-ff78-4da8-9d97-b729d2ae54cb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "25732bf1-2c41-44b3-bcbf-a492f30be6e9": {
      "main": [
        [
          {
            "node": "b400936c-4f5d-4b7e-b414-38accc14bd7a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "234ca9a5-6ce6-470d-b1f4-31671cf782c3": {
      "main": [
        [
          {
            "node": "fb27fb5b-5ff4-4bb4-82e3-44ad39b72022",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "81c1ff80-5b17-46a2-9b48-d25894340817": {
      "main": [
        [
          {
            "node": "fb27fb5b-5ff4-4bb4-82e3-44ad39b72022",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d9f3620c-c532-43fa-9b8b-0b6e47737fd0": {
      "main": [
        [
          {
            "node": "7622280e-523d-40ed-84a6-6467c46470e8",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "e5ebea62-bc9c-4a56-a52d-0a657df83e2c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ea8a7f9c-b7a8-4a15-8584-7fe59a7d18bd": {
      "main": [
        [
          {
            "node": "d9f3620c-c532-43fa-9b8b-0b6e47737fd0",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "25732bf1-2c41-44b3-bcbf-a492f30be6e9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e5ebea62-bc9c-4a56-a52d-0a657df83e2c": {
      "main": [
        [
          {
            "node": "25732bf1-2c41-44b3-bcbf-a492f30be6e9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7622280e-523d-40ed-84a6-6467c46470e8": {
      "main": [
        [
          {
            "node": "90b25c0a-0719-4b24-ac62-e61781e27533",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5ea1483c-1b95-443e-b57f-08a192bc76f9": {
      "main": [
        [
          {
            "node": "ea8a7f9c-b7a8-4a15-8584-7fe59a7d18bd",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b400936c-4f5d-4b7e-b414-38accc14bd7a": {
      "main": [
        [
          {
            "node": "9a4bffa9-6d4b-495e-af69-68884eeadaab",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9cf1b93b-5584-48d9-bb96-91c2665719cf": {
      "main": [
        [
          {
            "node": "ea8a7f9c-b7a8-4a15-8584-7fe59a7d18bd",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "112f4226-ff78-4da8-9d97-b729d2ae54cb": {
      "main": [
        [
          {
            "node": "d9f3620c-c532-43fa-9b8b-0b6e47737fd0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
よくある質問

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

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

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

中級 - ファイル管理, その他, マルチモーダルAI

有料ですか?

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

関連ワークフロー

Google Driveで保存し、TelegramでリマインドしてInstagram Reelをダウンロードを自動化
Google Drive の保存と Telegram によるリマインダーで Instagram Reel ダウンロードを自動化
If
Code
Webhook
+
If
Code
Webhook
11 ノードAryan Shinde
ファイル管理
僕のワークフロー 2
スマートクリーニングとメール通知付きの自動FTPファイル移行
Ftp
Set
Filter
+
Ftp
Set
Filter
15 ノードDariusz Koryto
ファイル管理
Reddit の絵文字を自動のに Google Drive にダウンロードし、重複検出と Telegram メッセージで通知
Reddit からのスタンプを自動のに Google Drive にダウンロードし、重複検出と Telegram アラートを含める
If
Set
Code
+
If
Set
Code
20 ノードVitorio Magalhães
ファイル管理
毎日の WhatsApp グループ スマート分析:GPT-4.1 による分析と音声メッセージの transcrição
毎日の WhatsApp グループ インタラクティブ分析:GPT-4.1 分析と音声メッセージ文字起こし
If
Set
Code
+
If
Set
Code
52 ノードDaniel Lianes
その他
Gmail と Google Drive を使用した PDF 請求書生成と送信を自動化
GmailとGoogle Driveの保管を使ってPDF請求書の生成と送信を自動化する
Code
Webhook
Email Send
+
Code
Webhook
Email Send
13 ノードIbrahim Emre POLAT
その他
Google広告活動レポートをGoogleスプレッドシートに自動生成(Airtable顧客管理別途あり)
Google広告活動レポートを自動生成してGoogleスプレッドシートに出力(Airtable顧客管理含む)
If
Code
Wait
+
If
Code
Wait
31 ノードGrowth AI
その他
ワークフロー情報
難易度
中級
ノード数15
カテゴリー3
ノードタイプ10
難易度説明

経験者向け、6-15ノードの中程度の複雑さのワークフロー

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34