Google Script中如何等待前置代码执行完成?(无法用flush()和sleep())
解决方案
问题核心是修改文档后没有显式保存并关闭文档,replaceText操作仅在内存中完成,未持久化到Drive时,getAs会读取修改前的内容生成PDF。
修复要点
- 删掉无用的
Utilities.sleep()和SpreadsheetApp.flush()(后者只对表格操作有效) - 添加
doc.saveAndClose(),强制将内存中的修改写入Drive,确保后续生成PDF时读取的是最新内容
修改后的代码
const receiptTemplate = DriveApp.getFileById('1-wOmJz3Vbvwk1EeLgFCAMEa-bo5Wgwbu3L5m8pFvRUw'); const destinationFolder = DriveApp.getFolderById('1CpmKci_kV_Dv4m4hNUxbIZIVNXrjwcCH'); //Generate Receipt Based on Template const friendlyDate = new Date(transactData[7]).toLocaleDateString(); const copy = receiptTemplate.makeCopy(`${transactData[0]} \- ${transactData[1]} \- ${transactData[4]} \- ${friendlyDate}`, destinationFolder) const doc = DocumentApp.openById(copy.getId()); const body = doc.getBody(); body.replaceText('{{Reference No}}', transactData[0]); body.replaceText('{{Customer Name}}', transactData[1]); body.replaceText('{{Policy Type}}', transactData[2]); body.replaceText('{{Insurance Company}}', transactData[3]); body.replaceText('{{Policy Number}}', transactData[4]); body.replaceText('{{Payment Amount}}', transactData[5]); body.replaceText('{{Payment Method}}', transactData[6]); body.replaceText('{{Date}}', friendlyDate); body.replaceText('{{Agent}}', transactData[8]); // 保存并关闭文档,将修改同步到云端 doc.saveAndClose(); //Convert the New Doc Receipt to PDF let pdfDoc = DriveApp.getFileById(copy.getId()).getAs('application/pdf'); pdfDoc.setName(doc.getName() + ".pdf"); let file = destinationFolder.createFile(pdfDoc); let fileId = file.getId();
补充说明
doc.saveAndClose()是DocumentApp专属方法,专门用于确认所有修改写入Drive,是解决这类同步问题的关键- 生成PDF时重新通过DriveApp获取文件,能彻底避免内存缓存导致的旧内容读取问题
内容的提问来源于stack exchange,提问作者Clayton Ritchey
相关产品推荐
相关产品推荐

