如何将Google Form提交的图片插入自动生成的Google Slides报告
问题原因
你原有代码无法插入图片的核心原因是:Google表单中「文件上传」类题型的响应返回值是上传文件对应的Drive ID数组,不是可直接渲染的图片内容,直接调用replaceAllText只会把ID字符串作为文本替换,无法生成图片。
实现逻辑
- 在Slides模板中保留你原来写的
{Work Item File/Image :}文本作为图片占位符,不需要额外调整模板结构 - 脚本遍历幻灯片找到这个占位符文本框,记录它的位置、宽高参数后删除占位框
- 从表单响应中拿到上传图片的ID,读取对应Drive文件的Blob对象插入到幻灯片中
- 自动按比例缩放图片适配占位框尺寸,多图上传时自动垂直排列
修改后完整代码
function onFormSubmit(e) { // 打开模板幻灯片 var templateDoc = DriveApp.getFileById('1ytA5aje8eTW4tQOf9U_DCKlpLrnLYZna3KIvjz9rx1Q'); // 生成模板副本 var newTempFile = templateDoc.makeCopy(); // 打开副本准备编辑 var openSlide = SlidesApp.openById(newTempFile.getId()); // 获取表单提交的所有响应 var items = e.response.getItemResponses(); // 替换所有文本类占位符 openSlide.replaceAllText('{PM In Charge :}', items[0].getResponse()); openSlide.replaceAllText('{Homeowner Name :}', items[1].getResponse()); openSlide.replaceAllText('{Location :}', items[2].getResponse()); openSlide.replaceAllText('{Week :}', items[3].getResponse()); openSlide.replaceAllText('{Report Date :}', items[4].getResponse()); openSlide.replaceAllText('{Start Date :}', items[6].getResponse()); openSlide.replaceAllText('{End Date :}', items[7].getResponse()); openSlide.replaceAllText('{Rooms :}', items[8].getResponse()); openSlide.replaceAllText('{Work Item :}', items[9].getResponse()); openSlide.replaceAllText('{Work Item Progress :}', items[10].getResponse()); // 处理图片上传项,替换占位符 var IMAGE_PLACEHOLDER = '{Work Item File/Image :}'; var uploadedFileIds = items[11].getResponse(); if (uploadedFileIds && uploadedFileIds.length > 0) { var allSlides = openSlide.getSlides(); // 遍历所有幻灯片、所有形状查找占位符 for (var slideIdx = 0; slideIdx < allSlides.length; slideIdx++) { var currentSlide = allSlides[slideIdx]; var allShapes = currentSlide.getShapes(); for (var shapeIdx = 0; shapeIdx < allShapes.length; shapeIdx++) { var currentShape = allShapes[shapeIdx]; var shapeText = currentShape.getText().asString().trim(); if (shapeText === IMAGE_PLACEHOLDER.trim()) { // 记录占位符的位置和尺寸 var shapeTransform = currentShape.getTransform(); var posX = shapeTransform.getTranslateX(); var startY = shapeTransform.getTranslateY(); var boxWidth = currentShape.getWidth(); var gapBetweenImgs = 10; // 多张图片之间的间距,单位磅,可自行调整 // 删除占位文本框 currentShape.remove(); // 逐张插入图片 var currentY = startY; for (var fileIdx = 0; fileIdx < uploadedFileIds.length; fileIdx++) { var imgFile = DriveApp.getFileById(uploadedFileIds[fileIdx]); // 仅插入图片格式文件,跳过其他类型上传文件 if (imgFile.getMimeType().startsWith('image/')) { var insertedImg = currentSlide.insertImage(imgFile.getBlob()); // 按比例缩放图片适配占位框宽度 var scaleRate = boxWidth / insertedImg.getWidth(); var scaledHeight = insertedImg.getHeight() * scaleRate; insertedImg.setWidth(boxWidth).setHeight(scaledHeight); // 设置图片位置 insertedImg.setLeft(posX).setTop(currentY); // 更新下一张图的起始Y坐标 currentY += scaledHeight + gapBetweenImgs; } } break; } } } } // 保存关闭文档,设置文件名 openSlide.saveAndClose(); DriveApp.getFileById(newTempFile.getId()).setName(items[1].getResponse() + "-" + items[3].getResponse() + "-Progress"); }
配置注意事项
- 如果你的表单图片题不允许多图上传,代码逻辑也能正常兼容,只会插入单张图片
- 第一次手动运行脚本触发授权时,务必允许所有权限申请,否则脚本无法读取Drive中的上传图片、无法操作Slides
- 如果你后续调整过表单题目顺序,一定要对应修改
items[索引]里的索引值,否则会取错题目的响应内容 - 多图间距可以通过修改代码里的
gapBetweenImgs参数调整,数值越大图片之间的空隙越大
内容的提问来源于stack exchange,提问作者fj_gie
相关产品推荐
相关产品推荐

