Hi Zapier Community 👋
I've been working on an automation project to help streamline college football recruiting profiles using Google Forms, Sheets, Slides, and Webhooks by Zapier — and I’m hitting a wall I can’t seem to break through.
🔧 What I'm Trying to Do:
-
A Google Form collects player info and an image (uploaded via File Upload).
-
Zapier:
-
Extracts the image ID via Formatter step
-
Builds a
uc?export=view&id=FILE_IDimage URL -
Sends player info + image URL to a Google Apps Script via a Webhook step.
-
-
The Apps Script should:
-
Duplicate a Slide template into a shared folder
-
Replace placeholder tags like
{{Player_Name}} -
Insert the image where
{{Player_Picture}}is placed -
Save the new slide
-
✅ What Is Working:
-
The Zap successfully sends data to the script (I get a "success" response).
-
The slide file is being created in the right shared folder.
-
Image is occasionally inserted — but still not consistently.
❌ What’s Not Working:
-
Text placeholders like
{{Player_Name}}do not get replaced. -
The image sometimes doesn’t show or it inserts an old image.
-
No error in Zapier or Apps Script console — but the slide content is blank or unchanged.
📜 Google Apps Script I'm Using (provided by Zapier support):
javascript
CopyEdit
function doPost(e) { try { const data = JSON.parse(e.postData.contents); const templateId = "1KGhQ-GVzR6AoCM2I1geq0pt7QzsFBapPPamrmTO6QRE"; // Your slide template const folderId = "13DUc5Mh1tdtrkgeVIPGKaz87qICsA_cRTiapAt_gHrah1WCx_JOwCxnUY1IJMk0HYWnwMZs5"; // Shared folder const playerName = data.Player_Name || "Unnamed Player"; const imageUrl = data.imageUrl; const template = DriveApp.getFileById(templateId); const folder = DriveApp.getFolderById(folderId); const newSlide = template.makeCopy(`${playerName} Recruiting Slide`, folder); const presentation = SlidesApp.openById(newSlide.getId()); const slide = presentation.getSlides()[0]; const placeholders = [ "Player_Name", "Graduation_Year", "Grade", "Position", "Height", "Weight", "GPA", "SAT_Score", "Bench_Press", "40_yd_time", "Highlight_Link", "Social_Media_Links" ]; placeholders.forEach(key => { const placeholder = `{{${key}}}`; const value = data[key] || ""; slide.replaceAllText(placeholder, value); }); const shapes = slide.getShapes(); for (let shape of shapes) { if (shape.getText && shape.getText().asString().includes("{{Player_Picture}}")) { const left = shape.getLeft(); const top = shape.getTop(); const width = shape.getWidth(); const height = shape.getHeight(); shape.remove(); slide.insertImage(imageUrl, left, top, width, height); break; } } presentation.saveAndClose(); return ContentService.createTextOutput(JSON.stringify({ status: "success" })).setMimeType(ContentService.MimeType.JSON); } catch (err) { return ContentService.createTextOutput(JSON.stringify({ status: "error", message: err.message })).setMimeType(ContentService.MimeType.JSON); } }
🤔 What I’ve Tried:
-
Confirmed the data payload looks correct in Zapier’s Webhook step.
-
Checked that placeholders match exactly (
{{Player_Name}}, etc.) -
Ensured the image is shared as “Anyone with the link can view”
-
Re-deployed the script and replaced the Web App URL
🆘 What I Need Help With:
-
Why aren’t the placeholders like
{{Player_Name}}being replaced? -
Why does the image still sometimes fail to update?
-
Is there something wrong with how
e.postData.contentsis parsed or how data is referenced indata.KEY?
I’d really appreciate any insight — I’ve spent a full week testing every combination I can think of and I’m truly stuck. Thank you in advance for helping








