This workflow corresponds to n8n.io template #15834 — we link there as the canonical source.
This workflow follows the Google Drive → Google Sheets recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "e0caaa9d-8656-4a51-bf99-9e764af2702f",
"name": "README - Run Workflow",
"type": "n8n-nodes-base.stickyNote",
"position": [
3664,
640
],
"parameters": {
"color": 5,
"width": 744,
"height": 672,
"content": "# Workflow 02 - Run Image Optimization\n\nThis workflow reads source slide images from a Google Drive folder.\n\nInput folder requirements:\n- Put one image per PPT slide into the folder\n- Supported MIME types: PNG, JPEG, WebP\n- File order is based on Google Drive API order; use names like `slide_001.png`, `slide_002.png`\n\nThe workflow:\n1. Creates a job folder in Google Drive\n2. Creates an `output/` folder\n3. Reads images from `inputFolderId`\n4. Calls Wisgate AI image edits\n5. Saves generated images to Drive\n6. Writes job and slide status to Google Sheets\n7. Returns the output folder link"
},
"typeVersion": 1
},
{
"id": "01ae317d-5bc4-4ffb-b9fd-1c45cd409404",
"name": "README - Run Webhook Body",
"type": "n8n-nodes-base.stickyNote",
"position": [
3664,
1360
],
"parameters": {
"color": 4,
"width": 736,
"height": 494,
"content": "# POST Body Example\n\n```json\n{\n \"spreadsheetId\": \"YOUR_GOOGLE_SHEET_ID\",\n \"driveRootFolderId\": \"DRIVE_ROOT_FOLDER_ID_FROM_INIT\",\n \"inputFolderId\": \"FOLDER_WITH_SLIDE_IMAGES\",\n \"jobName\": \"demo-job\",\n \"timeoutMs\": 120000,\n \"waitSeconds\": 2,\n \"basePrompt\": \"Improve this PPT slide. Make it clean, professional, readable, and presentation-ready.\"\n}\n```\n\nWebhook path:\n`ppt-opt-run-drive-folder`\n\nThe response includes:\n- `jobId`\n- `status`\n- `outputFolderLink`"
},
"typeVersion": 1
},
{
"id": "6a81ed66-7552-40a1-aca8-7127674f34b6",
"name": "README - Wisgate AI Settings",
"type": "n8n-nodes-base.stickyNote",
"position": [
6096,
672
],
"parameters": {
"color": 6,
"width": 528,
"height": 680,
"content": "# Image AI\n\nThis workflow uses:\n- Base URL: `https://api.wisgate.ai/v1`\n- Endpoint: `/images/edits`\n- Model: `gpt-image-2`\n\nSet one of these environment variables in n8n:\n- `WISGATE_API_KEY` recommended\n- `OPENAI_API_KEY` fallback\n\nThe HTTP Request node sends multipart/form-data:\n```json\n{\n \"model\": \"gpt-image-2\",\n \"response_format\": \"b64_json\",\n \"image\": \"originalImage binary field\"\n}\n```\n\nThe source slide image is downloaded from Google Drive, sent as multipart `image`, and the returned base64 image is converted to n8n binary and uploaded to Google Drive."
},
"typeVersion": 1
},
{
"id": "24c55a97-ae64-4fdf-a30e-f4f0b3914182",
"name": "README - Status Logic",
"type": "n8n-nodes-base.stickyNote",
"position": [
4448,
1360
],
"parameters": {
"color": 3,
"width": 560,
"height": 496,
"content": "# Status Tracking\n\nGoogle Sheets is the status database.\n\n`jobs` tab:\n- One row per job\n- Stores counts and output folder link\n\n`slides` tab:\n- One row per slide image\n- Tracks status: `pending`, `processing`, `success`, `failed`, `timeout`\n\n`events` tab:\n- Append-only log\n- Records success and failure events\n\nFailure handling:\n- HTTP errors do not stop the whole workflow\n- Failed slides can be retried with Workflow 03"
},
"typeVersion": 1
},
{
"id": "6cd395c4-9e4c-46bf-befc-1fae67fe55c8",
"name": "Webhook - Run",
"type": "n8n-nodes-base.webhook",
"position": [
3728,
1088
],
"parameters": {
"path": "ppt-opt-run-drive-folder",
"options": {},
"httpMethod": "POST",
"responseMode": "lastNode"
},
"typeVersion": 2
},
{
"id": "1095b039-0156-409c-af7b-27529912e843",
"name": "Code - Init Run",
"type": "n8n-nodes-base.code",
"position": [
4000,
1088
],
"parameters": {
"jsCode": "\nconst src = $json.body || $json || {};\nif (!src.spreadsheetId) throw new Error('Missing spreadsheetId');\nif (!src.driveRootFolderId) throw new Error('Missing driveRootFolderId');\nif (!src.inputFolderId) throw new Error('Missing inputFolderId');\nconst stamp = new Date().toISOString().replace(/[-:.TZ]/g,'').slice(0,14);\nconst rand = Math.random().toString(36).slice(2,8);\nconst jobId = `job_${stamp}_${rand}`;\nreturn [{json:{spreadsheetId:src.spreadsheetId,driveRootFolderId:src.driveRootFolderId,inputFolderId:src.inputFolderId,jobId,jobName:src.jobName || jobId,sourceType:'drive_folder_images',basePrompt:src.basePrompt || 'Create an improved professional presentation slide image inspired by the source slide. Keep the slide core message, improve readability, visual hierarchy, and polish. Return a single high-quality slide-like image.',timeoutMs:Number(src.timeoutMs || 120000),waitSeconds:Number(src.waitSeconds || 2),model:'gpt-image-2',baseUrl:'https://api.wisgate.ai/v1'}}];\n"
},
"typeVersion": 2
},
{
"id": "631ba042-4fa0-4b95-aa45-075d28d44936",
"name": "Drive - Create Job Folder",
"type": "n8n-nodes-base.googleDrive",
"position": [
4256,
992
],
"parameters": {
"name": "={{$json.jobId}}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "root",
"cachedResultName": "/ (Root folder)"
},
"resource": "folder"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "5ba81836-df7c-4cd9-882b-cfcc68d0308f",
"name": "Drive - Create Output Folder",
"type": "n8n-nodes-base.googleDrive",
"position": [
4496,
992
],
"parameters": {
"name": "output",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "root",
"cachedResultName": "/ (Root folder)"
},
"resource": "folder"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "1fd3a273-4233-4f87-96ca-e8fd894d9ccd",
"name": "Sheets - Append Job",
"type": "n8n-nodes-base.googleSheets",
"position": [
4736,
992
],
"parameters": {
"columns": {
"value": {
"jobId": "={{$json.jobId}}",
"model": "gpt-image-2",
"status": "processing",
"jobName": "={{$json.jobName}}",
"createdAt": "={{$now}}",
"updatedAt": "={{$now}}",
"sourceType": "drive_folder_images",
"totalSlides": "0",
"failedSlides": "0",
"successSlides": "0",
"timeoutSlides": "0",
"outputFolderId": "={{$node['Drive - Create Output Folder'].json.id}}",
"sourceFolderId": "={{$json.inputFolderId}}",
"driveJobFolderId": "={{$node['Drive - Create Job Folder'].json.id}}",
"outputFolderLink": "={{'https://drive.google.com/drive/folders/' + $node['Drive - Create Output Folder'].json.id}}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "append",
"sheetName": "jobs",
"documentId": "={{$json.spreadsheetId}}"
},
"typeVersion": 4.5
},
{
"id": "7a617f30-ede3-404c-8966-bc7cb6d4c9e1",
"name": "HTTP Drive - List Input Images",
"type": "n8n-nodes-base.httpRequest",
"position": [
4736,
1184
],
"parameters": {
"url": "=https://www.googleapis.com/drive/v3/files?q={{encodeURIComponent(\"'\" + $json.inputFolderId + \"' in parents and trashed=false and (mimeType='image/png' or mimeType='image/jpeg' or mimeType='image/webp' or mimeType='image/jpg')\")}}&fields={{encodeURIComponent('files(id,name,mimeType,webViewLink)')}}&pageSize=1000",
"options": {
"timeout": 30000
},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleDriveOAuth2Api"
},
"typeVersion": 4.2
},
{
"id": "e53f17a6-3ffd-4cec-8a23-711cafaea043",
"name": "Code - Expand Input Files",
"type": "n8n-nodes-base.code",
"position": [
4992,
1184
],
"parameters": {
"jsCode": "\nconst base = $node['Code - Init Run'].json;\nconst files = $json.files || [];\nif (!files.length) throw new Error('No image files found in inputFolderId');\nreturn files.map((f, idx) => { const i=idx+1; const p=String(i).padStart(3,'0'); return {json:{...base,slideIndex:i,slideKey:`${base.jobId}_slide_${p}`,originalFileName:f.name,originalDriveFileId:f.id,originalDriveUrl:f.webViewLink || `https://drive.google.com/file/d/${f.id}/view`,jobOutputFolderId:$node['Drive - Create Output Folder'].json.id,outputFileName:`slide_${p}.png`,status:'pending',attempt:0,prompt:`${base.basePrompt}\nSlide index: ${i}. Source file name: ${f.name}.`}}; });\n"
},
"typeVersion": 2
},
{
"id": "b4ea90ba-d06d-4b50-b727-6b7d02bc23ad",
"name": "Sheets - Append Slide Pending",
"type": "n8n-nodes-base.googleSheets",
"position": [
5248,
1184
],
"parameters": {
"columns": {
"value": {
"jobId": "={{$json.jobId}}",
"prompt": "={{$json.prompt}}",
"status": "pending",
"attempt": "0",
"slideKey": "={{$json.slideKey}}",
"errorType": "",
"startedAt": "",
"updatedAt": "={{$now}}",
"finishedAt": "",
"slideIndex": "={{$json.slideIndex}}",
"errorMessage": "",
"outputDriveUrl": "",
"outputFileName": "={{$json.outputFileName}}",
"originalDriveUrl": "={{$json.originalDriveUrl}}",
"originalFileName": "={{$json.originalFileName}}",
"jobOutputFolderId": "={{$json.jobOutputFolderId}}",
"outputDriveFileId": "",
"originalDriveFileId": "={{$json.originalDriveFileId}}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "append",
"sheetName": "slides",
"documentId": "={{$json.spreadsheetId}}"
},
"typeVersion": 4.5
},
{
"id": "42efa446-45bf-4cb8-b2b0-6e47a45d4313",
"name": "Sheets - Update Job Total",
"type": "n8n-nodes-base.googleSheets",
"position": [
5488,
1184
],
"parameters": {
"operation": "upsert",
"documentId": "={{$json.spreadsheetId}}"
},
"typeVersion": 4.5
},
{
"id": "da8440d6-8ce0-4287-9f09-f8e6a9bd463e",
"name": "Loop Slides",
"type": "n8n-nodes-base.splitInBatches",
"position": [
5728,
1184
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "3dd498f7-6011-4a5e-9aea-bc26a9ca120f",
"name": "Sheets - Mark Processing",
"type": "n8n-nodes-base.googleSheets",
"position": [
5968,
1184
],
"parameters": {
"operation": "upsert",
"documentId": "={{$json.spreadsheetId}}"
},
"typeVersion": 4.5
},
{
"id": "ec29b77c-a1c8-452a-85df-47cf145ff98e",
"name": "Code - Parse Edit Response",
"type": "n8n-nodes-base.code",
"position": [
6480,
1184
],
"parameters": {
"jsCode": "\nconst source = $node['Loop Slides'].json;\nconst resp = $json;\nconst b64 = resp.data?.[0]?.b64_json;\nif (b64) { return [{json:{...source,status:'success',attempt:Number(source.attempt||0)+1,errorType:'',errorMessage:'',finishedAt:new Date().toISOString()},binary:{outputImage:{data:b64,mimeType:'image/png',fileName:source.outputFileName}}}]; }\nconst text = JSON.stringify(resp.error || resp.message || resp).slice(0,3000) || 'Unknown error';\nconst lower = text.toLowerCase();\nconst status = lower.includes('timeout') ? 'timeout' : 'failed';\nconst errorType = status === 'timeout' ? 'TIMEOUT_120S' : 'API_ERROR';\nreturn [{json:{...source,status,errorType,errorMessage:text,attempt:Number(source.attempt||0)+1,finishedAt:new Date().toISOString()}}];\n"
},
"typeVersion": 2
},
{
"id": "f403ee5d-20a4-4a9c-aff4-8621b2c22e4c",
"name": "IF - Success",
"type": "n8n-nodes-base.if",
"position": [
6688,
1184
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{$json.status}}",
"rightValue": "success"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "caa56618-0ff6-444c-a3c1-b8f11f6d8a20",
"name": "Drive - Upload Output Image",
"type": "n8n-nodes-base.googleDrive",
"position": [
6928,
1088
],
"parameters": {
"name": "={{$json.outputFileName}}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "root",
"cachedResultName": "/ (Root folder)"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "814d0fb9-96ee-4e6d-8f2a-ab6c63ad3255",
"name": "Sheets - Update Slide Success",
"type": "n8n-nodes-base.googleSheets",
"position": [
7168,
1088
],
"parameters": {
"operation": "upsert",
"documentId": "={{$json.spreadsheetId}}"
},
"typeVersion": 4.5
},
{
"id": "9ee8a96b-4c59-43b0-ab2f-e52c03bff726",
"name": "Sheets - Event Success",
"type": "n8n-nodes-base.googleSheets",
"position": [
7408,
1088
],
"parameters": {
"columns": {
"value": {
"jobId": "={{$json.jobId}}",
"status": "success",
"eventId": "={{'evt_' + Date.now() + '_' + Math.random().toString(36).slice(2,8)}}",
"message": "Output image edited and uploaded to Drive",
"slideKey": "={{$json.slideKey}}",
"createdAt": "={{$now}}",
"eventType": "edit_success",
"slideIndex": "={{$json.slideIndex}}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "append",
"sheetName": "events",
"documentId": "={{$json.spreadsheetId}}"
},
"typeVersion": 4.5
},
{
"id": "9b9512b1-d394-4bdc-89ab-2449add7128e",
"name": "Sheets - Update Slide Failed",
"type": "n8n-nodes-base.googleSheets",
"position": [
6928,
1312
],
"parameters": {
"operation": "upsert",
"documentId": "={{$json.spreadsheetId}}"
},
"typeVersion": 4.5
},
{
"id": "fd82971d-73c1-44c1-8c36-ef932130c6db",
"name": "Sheets - Event Failed",
"type": "n8n-nodes-base.googleSheets",
"position": [
7168,
1312
],
"parameters": {
"columns": {
"value": {
"jobId": "={{$json.jobId}}",
"status": "={{$json.status}}",
"eventId": "={{'evt_' + Date.now() + '_' + Math.random().toString(36).slice(2,8)}}",
"message": "={{($json.errorType || 'ERROR') + ': ' + ($json.errorMessage || '')}}",
"slideKey": "={{$json.slideKey}}",
"createdAt": "={{$now}}",
"eventType": "edit_failed",
"slideIndex": "={{$json.slideIndex}}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "append",
"sheetName": "events",
"documentId": "={{$json.spreadsheetId}}"
},
"typeVersion": 4.5
},
{
"id": "0470b74f-3a74-4839-9253-cde99994d4e7",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
7648,
1184
],
"parameters": {
"amount": "={{$node[\"Code - Init Run\"].json.waitSeconds || 2}}"
},
"typeVersion": 1.1
},
{
"id": "01a30a29-2821-4499-b1cb-8eaed58fabe1",
"name": "Sheets - Read Slides",
"type": "n8n-nodes-base.googleSheets",
"position": [
5968,
1504
],
"parameters": {
"options": {},
"sheetName": "slides",
"documentId": "={{$node[\"Code - Init Run\"].json.spreadsheetId}}"
},
"typeVersion": 4.5
},
{
"id": "4461deba-984c-4665-97a2-834e82fab888",
"name": "Code - Summarize Job",
"type": "n8n-nodes-base.code",
"position": [
6208,
1504
],
"parameters": {
"jsCode": "\nconst job = $node['Code - Init Run'].json;\nconst rows = $input.all().map(i => i.json).filter(r => r.jobId === job.jobId);\nconst totalSlides = rows.length;\nconst successSlides = rows.filter(r => r.status === 'success').length;\nconst failedSlides = rows.filter(r => r.status === 'failed').length;\nconst timeoutSlides = rows.filter(r => r.status === 'timeout').length;\nconst status = (failedSlides || timeoutSlides) ? 'completed_with_errors' : 'done';\nconst outputFolderId = $node['Drive - Create Output Folder'].json.id;\nreturn [{json:{...job,status,totalSlides,successSlides,failedSlides,timeoutSlides,outputFolderId,outputFolderLink:`https://drive.google.com/drive/folders/${outputFolderId}`}}];\n"
},
"typeVersion": 2
},
{
"id": "d3da94f5-2ad6-4385-bcd4-6fe9c5f3e11a",
"name": "Sheets - Update Job Summary",
"type": "n8n-nodes-base.googleSheets",
"position": [
6448,
1504
],
"parameters": {
"operation": "upsert",
"documentId": "={{$json.spreadsheetId}}"
},
"typeVersion": 4.5
},
{
"id": "b806297f-068f-44a0-a32d-5b4033f1a60a",
"name": "Code - Final Response",
"type": "n8n-nodes-base.code",
"position": [
6688,
1504
],
"parameters": {
"jsCode": "return [{json:{ok:true,jobId:$json.jobId,status:$json.status,totalSlides:$json.totalSlides,successSlides:$json.successSlides,failedSlides:$json.failedSlides,timeoutSlides:$json.timeoutSlides,outputFolderId:$json.outputFolderId,outputFolderLink:$json.outputFolderLink,message:'Processing complete. Use outputFolderLink to access generated images.'}}];"
},
"typeVersion": 2
},
{
"id": "a8dde34f-6505-4d44-b13f-ffc9dd28bb7a",
"name": "Drive - Download Original Image",
"type": "n8n-nodes-base.googleDrive",
"position": [
6144,
1184
],
"parameters": {
"fileId": "={{$json.originalDriveFileId}}",
"options": {
"binaryPropertyName": "originalImage"
},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "806c8c5d-1595-4f5c-a2e9-a216921dd85a",
"name": "HTTP - AI Edit Image",
"type": "n8n-nodes-base.httpRequest",
"position": [
6320,
1184
],
"parameters": {
"url": "={{$json.baseUrl}}/images/edits",
"method": "POST",
"options": {
"timeout": "={{$json.timeoutMs}}"
},
"sendBody": true,
"contentType": "multipart-form-data",
"sendHeaders": true,
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "gpt-image-2"
},
{
"name": "prompt",
"value": "={{$json.prompt}}"
},
{
"name": "n",
"value": "1"
},
{
"name": "size",
"value": "1536x1024"
},
{
"name": "response_format",
"value": "b64_json"
},
{
"name": "image",
"parameterType": "formBinaryData",
"inputDataFieldName": "originalImage"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer {{$env.WISGATE_API_KEY || $env.OPENAI_API_KEY}}"
}
]
}
},
"typeVersion": 4.2,
"continueOnFail": true
}
],
"connections": {
"Wait": {
"main": [
[
{
"node": "Loop Slides",
"type": "main",
"index": 0
}
]
]
},
"Loop Slides": {
"main": [
[
{
"node": "Sheets - Read Slides",
"type": "main",
"index": 0
}
],
[
{
"node": "Sheets - Mark Processing",
"type": "main",
"index": 0
}
]
]
},
"IF - Success": {
"main": [
[
{
"node": "Drive - Upload Output Image",
"type": "main",
"index": 0
}
],
[
{
"node": "Sheets - Update Slide Failed",
"type": "main",
"index": 0
}
]
]
},
"Webhook - Run": {
"main": [
[
{
"node": "Code - Init Run",
"type": "main",
"index": 0
}
]
]
},
"Code - Init Run": {
"main": [
[
{
"node": "Drive - Create Job Folder",
"type": "main",
"index": 0
}
]
]
},
"Sheets - Append Job": {
"main": [
[
{
"node": "HTTP Drive - List Input Images",
"type": "main",
"index": 0
}
]
]
},
"Code - Summarize Job": {
"main": [
[
{
"node": "Sheets - Update Job Summary",
"type": "main",
"index": 0
}
]
]
},
"HTTP - AI Edit Image": {
"main": [
[
{
"node": "Code - Parse Edit Response",
"type": "main",
"index": 0
}
]
]
},
"Sheets - Read Slides": {
"main": [
[
{
"node": "Code - Summarize Job",
"type": "main",
"index": 0
}
]
]
},
"Sheets - Event Failed": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Sheets - Event Success": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Sheets - Mark Processing": {
"main": [
[
{
"node": "Drive - Download Original Image",
"type": "main",
"index": 0
}
]
]
},
"Code - Expand Input Files": {
"main": [
[
{
"node": "Sheets - Append Slide Pending",
"type": "main",
"index": 0
}
]
]
},
"Drive - Create Job Folder": {
"main": [
[
{
"node": "Drive - Create Output Folder",
"type": "main",
"index": 0
}
]
]
},
"Sheets - Update Job Total": {
"main": [
[
{
"node": "Loop Slides",
"type": "main",
"index": 0
}
]
]
},
"Code - Parse Edit Response": {
"main": [
[
{
"node": "IF - Success",
"type": "main",
"index": 0
}
]
]
},
"Drive - Upload Output Image": {
"main": [
[
{
"node": "Sheets - Update Slide Success",
"type": "main",
"index": 0
}
]
]
},
"Sheets - Update Job Summary": {
"main": [
[
{
"node": "Code - Final Response",
"type": "main",
"index": 0
}
]
]
},
"Drive - Create Output Folder": {
"main": [
[
{
"node": "Sheets - Append Job",
"type": "main",
"index": 0
}
]
]
},
"Sheets - Update Slide Failed": {
"main": [
[
{
"node": "Sheets - Event Failed",
"type": "main",
"index": 0
}
]
]
},
"Sheets - Append Slide Pending": {
"main": [
[
{
"node": "Sheets - Update Job Total",
"type": "main",
"index": 0
}
]
]
},
"Sheets - Update Slide Success": {
"main": [
[
{
"node": "Sheets - Event Success",
"type": "main",
"index": 0
}
]
]
},
"HTTP Drive - List Input Images": {
"main": [
[
{
"node": "Code - Expand Input Files",
"type": "main",
"index": 0
}
]
]
},
"Drive - Download Original Image": {
"main": [
[
{
"node": "HTTP - AI Edit Image",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleDriveOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
What it does: Initializes Google Sheets tabs: jobs, slides, events Creates a Google Drive root folder for optimizer jobs Reads slide images from a Google Drive input folder Sends each image to gpt-image-2. Converts base64 image results to binary Uploads edited images to Google…
Source: https://n8n.io/workflows/15834/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Resume Screening & Behavioral Interviews with Gemini, Elevenlabs, & Notion ATS copy. Uses googleDrive, httpRequest, notion, formTrigger. Webhook trigger; 67 nodes.
Transform your n8n instance management with this advanced automation system featuring artificial intelligence-driven workflow selection. This template provides comprehensive maintenance operations wit
Convalidaciones Académicas - Estructura Base. Uses googleSheets, emailSend, googleDrive, httpRequest. Webhook trigger; 35 nodes.
TrackCollect. Uses googleSheets, httpRequest, @n-octo-n/n8n-nodes-json-database, moveBinaryData. Webhook trigger; 31 nodes.
FlowV4. Uses googleSheets, emailSend, googleDrive, httpRequest. Webhook trigger; 31 nodes.