You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:57:27