Google Apps Script复制数据转PDF空白问题求助
为什么数据复制操作滞后于PDF生成,导致空白PDF?
这个问题我之前也碰到过,核心原因是Google Apps Script的Spreadsheet服务与Drive服务之间存在异步同步机制。当你用setValues()把数据写入临时表格后,这些修改首先存在于Spreadsheet的内存缓存中,并没有立刻同步到Drive的文件系统里。这时候你直接调用DriveApp.getFileById()生成PDF,拿到的其实是修改前的空白版本。
至于Utilities.sleep()没用,是因为这个同步不是单纯的“等待一段时间”就能完成的——它是后台异步执行的,sleep只是让脚本暂停,但无法确保缓存已经同步到Drive端。
解决方案:强制同步Spreadsheet修改
你只需要在写入数据后、生成PDF前,调用SpreadsheetApp.flush()方法,这个方法会强制把所有未提交的Spreadsheet操作(比如单元格赋值)同步到云端,确保Drive能获取到最新的表格内容。
另外我还发现你原代码里有个容易忽略的小问题:var values = sheet.getRange("A9:F9");获取的是Range对象,但setValues()需要传入二维数组,所以必须加上.getValues()才能正确赋值。
修改后的完整代码
function myFunction() { //Template Info var sheetTemplate = ""; //sheet id goes here //Sheet with List of Suppliers var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var info = sheet.getRange("A1:B1").getValues(); //Grabs name and email var name = info[0][0]; var email = info[0][1]; //Copies template and save the sheet's id var copyId = DriveApp.getFileById(sheetTemplate).makeCopy("Copy").getId(); // Open the temporary spreadsheet var copySs = SpreadsheetApp.openById(copyId); // Get the sheet var copySheet = copySs.getSheetByName("Sheet1"); // 修正:获取单元格的二维数组值 var values = sheet.getRange("A9:F9").getValues(); var copyRange = copySheet.getRange("A9:F9"); copyRange.setValues(values); // 关键:强制同步所有表格修改到云端 SpreadsheetApp.flush(); //Convert Template File to PDF emailMe(copyId, email, name); } function emailMe(copyId, email, name) { var pdf = DriveApp.getFileById(copyId).getAs("application/pdf"); var subject = "Test"; var body = "This is a test."; MailApp.sendEmail(email, subject, body, {htmlBody: body, attachments: pdf}); }
内容的提问来源于stack exchange,提问作者Robert Anthony Svec
相关产品推荐
相关产品推荐

