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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:28:18