Apps Script将文档定位图片发送至Google表单时重复上传末图问题
问题原因
Paragraph.getPositionedImages()返回的不是静态的图片对象数组,是和文档段落绑定的实时引用集合。Apps Script的对象引用存在延迟求值的特性:循环里给img赋值时,没有立刻读取对应图片的blob数据,等循环跑完、实际执行setImage操作读blob的时候,所有临时存储的img引用都指向了集合里最后一张定位图片,所以插入的全是重复的最后一张。仅锚定1张图时不存在索引偏移,所以不会出问题。
修复方法
循环里每拿到一张定位图片,立刻把它的blob复制一份存成独立对象,切断和原实时引用集合的关联,再往表单里插入即可。
修正后的代码片段:
else if (questType == 'IMAGE'){ var childIndex = questions[i][2]; // 从questions数组取段落索引 var doc = DocumentApp.getActiveDocument(); var docBody = doc.getBody(); var child = docBody.getChild(childIndex).asParagraph(); var posImgs = child.getPositionedImages(); if (posImgs.length > 0){ var noImgs = posImgs.length; // 原alert直接传对象只会显示类型,改成传长度字符串方便调试 DocumentApp.getUi().alert("定位图片数量:" + noImgs); for (var j = 0; j<noImgs; j++){ // 取到blob后立刻copy生成独立副本,避免引用联动 var imgBlob = posImgs[j].getBlob().copyBlob(); item = form.addImageItem(); item.setImage(imgBlob); } } }
注意事项
- 不要在循环外修改item变量的属性,否则会覆盖之前已经插入到表单的图片项
- 如果需要给图片加题目标题、设置必填属性,直接在循环内操作当前循环生成的item对象即可
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

