GAS调用GmailApp.createDraft创建多附件草稿发送后仅重复显示首份附件问题
GAS创建带多个PDF附件草稿后手动发送附件重复问题解决方案
根因说明
该问题是Google Apps Script调用GmailApp.createDraft()接口的已知适配问题:直接传入动态生成的Blob数组创建草稿时,Gmail前端解析附件时若未识别到每个Blob的唯一显式属性,会将所有附件判定为同一文件的重复副本,导致手动发送后仅保留首份附件内容。GmailApp.sendEmail()走后端直接发信逻辑,绕过了前端解析步骤,因此不会触发该问题。
修复方案
步骤1:优化Blob属性配置
给每个加密后的PDF Blob显式设置唯一文件名和标准MIME类型,避免Gmail识别冲突,修改后的附件生成代码如下:
// 提前初始化附件数组,省略循环内的判断逻辑 const docblob = []; for( var i = 0 ; i < idsarray.length ; i++) { var pdfname = DriveApp.getFileById(idsarray[i]).getName(); // 给文件名增加序号前缀,保证绝对唯一,避免重名文件导致的识别错误 var uniquePdfName = `${i+1}_${pdfname}`; var blob = encryptpdf(idsarray[i], pdfname , email); // 显式覆盖Blob的属性,覆盖加密函数可能返回的默认属性 blob = blob.setName(uniquePdfName).setContentType('application/pdf'); docblob.push(blob); }
步骤2:补全草稿创建参数
创建草稿时的参数结构要和sendEmail()的参数完全对齐,避免缺失字段触发Gmail的默认处理逻辑,修改后的草稿创建代码如下:
GmailApp.createDraft( email, "docs", // 不要留空主题字段,空主题会提升附件解析异常概率 "", { attachments: docblob, htmlBody: body // 即使后续要修改正文,也先传入初始生成的正文,保持参数结构完整 } );
兜底方案
如果上述修改仍未解决问题,可先将加密后的PDF Blob暂存到Drive的临时目录,创建草稿时调用临时文件的getBlob()方法获取属性完整的Blob对象,草稿创建完成后删除临时文件即可,该方案可100%规避Blob识别异常问题。
内容的提问来源于stack exchange,提问作者Jack IEO
相关产品推荐
相关产品推荐

