Skip to main content

 

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:

    1. Extracts the image ID via Formatter step

    2. Builds a uc?export=view&id=FILE_ID image URL

    3. 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()d0]; const placeholders = s "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.contents is parsed or how data is referenced in data.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

Hi ​@El Profe Gancz 

Why not use this Zap action: GSlides - Create Presentation from Template

GSlides help links: https://zapier.com/apps/google-slides/integrations#help

 


Hi @Troy Tessalone,

Thanks so much for your suggestion!  I actually started this project using the "Create Presentation from Template" action in the Google Slides Zap — and it worked really well for replacing all the text placeholders like {{Player_Name}}, {{GPA}}, etc.

The only challenge I ran into was adding an image (a player headshot) into the slide with each new form submission. From what I’ve found, the built-in Google Slides Zapier action doesn’t support dynamic image insertion into placeholders — unless that’s changed recently?

To work around that, I switched over to using Google Apps Script triggered via a Webhook step from Zapier, which gives me full control over inserting both text and images. But as you know, managing script deployments, permissions, and URL triggers can get pretty tricky — especially when troubleshooting why slides aren’t showing up or why image IDs aren’t loading as expected.

If there's a way to insert an image dynamically using only Zapier (without code) — even if it’s using another tool or workaround — I’d love to learn more about that!

Thanks again for jumping in and sharing your expertise!


@El Profe Gancz 

For us to have true context, post screenshots showing how your GSlides Create Presentation from Template Zap step is configured in EDIT mode with the field mappings visible.

Also, include a real image link that you are trying to use so we can verify if the link is in the correct format.

 

Help link for using GSlides Templates and images into placeholders: https://help.zapier.com/hc/en-us/articles/8496047004429-How-to-Use-the-Set-up-Google-Slides-Presentation-Action

 


Thank you for the quick follow-up and the helpful link!

I’ll go ahead and get the screenshots you requested showing my GSlides – Create Presentation from Template Zap step in EDIT mode with all the field mappings. I’ll also include a real image URL (hosted on Google Drive, with the format https://drive.google.com/uc?export=view&id=XYZ).

Just to confirm — if I include a placeholder like {{Player_Picture}} in my slide and pass the image URL into that field from Zapier, it should insert the actual image on the slide, correct? Or does it still only display the URL as text unless it’s hosted in a certain way?

Excited to test this approach if it means I can skip the Apps Script complications!

Thanks again 🙌
– Gerardo


@El Profe Gancz 

Make sure the GDrive File sharing preferences are updated to be publicly accessible.

Use this tool to get the correct direct download link for a GDrive File: https://sites.google.com/site/gdocs2direct/

Example: https://drive.google.com/uc?export=download&id=XXX


just wanted to thank you 🙌

Following your advice to use the Google Slides → Create Presentation from Template action worked perfectly! I was able to map the form data to all the text placeholders, and it’s generating slides with the correct player info and image 🎉

However, I’ve run into one last issue:

👉 When a new form submission includes a different image (shared properly and using a uc?export=download&id= format), the slide gets created with the previous image instead of the new one.

The form data confirms that the correct image URL is being sent through Zapier, but the image shown on the slide doesn’t update — it either repeats the old one or occasionally fails to show up at all.

The image placeholder on the slide is a text placeholder named {{Player_Picture}}, and the Slides template hasn't changed.

Do you happen to know if Slides caches the first image somehow, or is there something else I need to reset or clear to allow new images to populate each time?

Thanks again for all your help so far!


@El Profe Gancz 

From your screenshot, you have a static GDrive file link in the Field: Player Picture

That is why the same picture is being used in the GSlides Template.

You need to make that URL dynamic, by replacing the entire link from a previous Zap step or by replacing the id=iID] part.

 


Hi Troy 👋

Just wanted to say thanks again — your suggestion to use the Google Slides → Create Presentation from Template action worked perfectly! 🙌 We were able to get both the player info and image into the slide using mapped form data.

However, we're now stuck on one last piece:

🧩 When a new form submission includes a different image, the new slide displays the image file ID as text instead of rendering the image — even though the dynamic image URL is correctly structured.

We followed your advice and made the Player Picture field dynamic by combining the base download link (https://drive.google.com/uc?export=download&id=) with the File ID pulled from Formatter Step 2.

Here’s how it’s mapped in the Slides step (screenshot attached for reference):

https://drive.google.com/uc?export=download&id= {{2. Output 0}}
 

The text data and links render perfectly — but instead of inserting the image, the slide displays the image ID text string on the placeholder. Not sure if we’re hitting a limitation in Slides, or if the placeholder format needs to be something other than a basic text field?

Any insights would be hugely appreciated — we’re really close to the finish line! 🏁

Thanks again for all your support!


@El Profe Gancz 

Help us have more info by posting screenshots showing how Zap step 2 is configured for the Formatter step along with the DATA IN/OUT for testing that Zap step.

NOTE: Make sure you are testing with a GDrive File ID that still exists in GDrive and that the file sharing preferences in GDrive for the file are set to public.

You may need to add this Zap action: GDrive - Add File Sharing Preference

 


Here are the screenshots for step 2


@El Profe Gancz 

FYI: An easier way to extract the ID from the GDrive File link would be to use this Zap action: Formatter > Text > Split

Split by: id=

For segment: Last

That will give you the value after id=, which will be just the ID.

 

Things to check/try:

  • Make sure the generated URL in the GSlide step is a valid URL that initiates a direct download from the link
    • Does the File with ID still exist?
    • Does the File with ID have public sharing preferences?
  • Make sure there are no extra leading/trailing spaces before/after the URL
  • Make sure there is no extra space before/after the mapped variable

 

  • If needed, use this Zap action: Formatter > Text > Default Value
    • Use this step to create the image URL
    • Then map the output to the GSlides steps
    • That way it’s not a hybrid static/dynamic value, in case that was part of the issue

 

 


Hi Troy,

Thanks again for your continued guidance!

We’ve now implemented every suggestion you provided, including:

✅ Generating a valid direct download URL (https://drive.google.com/uc?export=download&id=...)
✅ Using Formatter > Text > Split to cleanly extract the File ID from the Google Form upload
✅ Using Formatter > Text > Default Value to build the image URL and ensure no hybrid static/dynamic values
✅ Confirming the uploaded file exists in Drive
✅ Ensuring file sharing preferences are set to “Anyone with the link can view”
✅ Verifying there are no leading or trailing spaces in the mapped value
✅ Mapping the full URL dynamically into the Google Slides → Create from Template action
✅ Attempted replacing the text placeholder with an image placeholder and also pre-inserting an image into the template

Despite all of this, the Slides presentation still displays the direct link or file ID as text, instead of replacing it with the actual image.

At this point, I am wondering if there’s something else going on (possibly a limitation with image replacements in this action), or if it’s worth escalating further.

Really appreciate your help!
Let me know if there’s anything else we can try.


@El Profe Gancz 

If you had it working previously, then it seems like it would be a Zap step config or GSlides Template issue.

 

OPTIONS


Before I explore a completely different app, I just want to confirm:
👉 Is it officially not possible to dynamically insert a new image into a Google Slides template using Google Slides → Create Presentation from Template when the image comes from a dynamic Google Drive upload?

Everything works great with text placeholders, but this one last image step is the blocker. If it’s a known limitation, I’ll shift to a different tool — just want to make sure I’m not missing a workaround.

Thanks again for all your help 🙌


@El Profe Gancz 

Q: You asked: Is it officially not possible to dynamically insert a new image into a Google Slides template using Google Slides → Create Presentation from Template when the image comes from a dynamic Google Drive upload?

 

A: You said: Following your advice to use the Google Slides → Create Presentation from Template action worked perfectly! I was able to map the form data to all the text placeholders, and it’s generating slides with the correct player info and image 🎉

 

You previously tested successfully, so it does work, which makes me think it is related to:

  • Zap step config
  • GSlides Template config
  • User testing

Reply