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

Google Script中如何等待前置代码执行完成?(无法用flush()和sleep())

解决方案

问题核心是修改文档后没有显式保存并关闭文档,replaceText操作仅在内存中完成,未持久化到Drive时,getAs会读取修改前的内容生成PDF。

修复要点

  1. 删掉无用的Utilities.sleep()和SpreadsheetApp.flush()(后者只对表格操作有效)
  2. 添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:01:04