Google Sheets Email - Vlookup 在 PDF 中显示 REF 值

Google Sheets Email - Vlookup showing REF value in PDF

希望你能帮我解决这个问题,我创建了一个系统,可以自动将当前 sheet 作为附件发送到电子邮件中,其中包含正文和主题文本。 我有一个问题似乎无法解决; sheet 中使用的 Vlookup 生成空白列或 REF!在通过电子邮件发送的 PDF 上。以及从不同 sheet 指向另一个值的任何信息(例如 ='Sheet2'!D2)

这是 sheet 触发 PDF 附件时使用的代码:

    function mailCCB() {
var originalSpreadsheet = SpreadsheetApp.getActive();                            //get active spreadsheet
var message = "Good Day." + "\n\n" + "Please find attached certificate";         //email body
var certNo = originalSpreadsheet.getRange("C7").getValue();                      //certificate number  
var cust = originalSpreadsheet.getRange("E10").getValues();                      //customer name
var subject = "Certificate " + certNo + " | " + cust;                 //email subject
var emailTo = originalSpreadsheet.getRange("E13").getValue();                    //email address
var sheets = originalSpreadsheet.getSheets();                                    //get all sheets
var sheetName = originalSpreadsheet.getActiveSheet().getName();                  //get current sheet name
var sourceSheet = originalSpreadsheet.getSheetByName(sheetName);                 //source sheet
// Get folder containing spreadsheet to save pdf in.
  var parents = DriveApp.getFileById(originalSpreadsheet.getId()).getParents();
  if (parents.hasNext()) {
    var folder =  parents.next();
  }
  else {
    folder = DriveApp.getRootFolder();
  }
SpreadsheetApp.getActiveSpreadsheet().toast("Working on it.. 50%", "Busy",12);
  // Copy whole spreadsheet.
  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(originalSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))

  // Delete redundant sheets.
  var sheets = destSpreadsheet.getSheets();
  for (i = 0; i < sheets.length; i++) {
    if (sheets[i].getSheetName() != sheetName){

      destSpreadsheet.deleteSheet(sheets[i]);
    }
  }
  var destSheet = destSpreadsheet.getSheets()[0];
  var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
  var sourcevalues = sourceRange.getValues();
SpreadsheetApp.getActiveSpreadsheet().toast("Working on it.. 60%", "Busy",12);
    var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
  destRange.setValues(sourcevalues);
  var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(subject);
  var newFile = folder.createFile(theBlob);
//*****************************

SpreadsheetApp.getActiveSpreadsheet().toast("Working on it.. 75%", "Busy",12);
// Create a new Spreadsheet and copy the current sheet into it.
var newSpreadsheet = SpreadsheetApp.create("Spreadsheet to export");
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var projectname = SpreadsheetApp.getActiveSpreadsheet();
sheet = originalSpreadsheet.getActiveSheet();
sheet.copyTo(newSpreadsheet);


var pdf = DriveApp.getFileById(originalSpreadsheet.getId()).getAs('application/pdf').getBytes();
var attach = {fileName:'Klerkscale Certificate',content:pdf, mimeType:'application/pdf'};
MailApp.sendEmail(emailTo, subject, message, {attachments:[theBlob]});

DriveApp.getFileById(newSpreadsheet.getId()).setTrashed(true);  

originalSpreadsheet.toast("Certificate will be sent shortly to " + emailTo,"Success",20);
} 

这是裁剪后的接收邮件结果:

好的,我看到了你的问题,你要删除 destSpreadsheet 中活动 sheet 引用的所有 sheet,因此它们将不可用,结果对于引用那些已删除 sheet 的每个单元格,将是 #REF!。要解决该问题,您可以使用 getDisplayValues() 方法,该方法检索单元格的当前显示值,而不是 getValues() 检索单元格中设置的函数(在本例中为 VLOOKUP)。更改此行:

  var sourcevalues = sourceRange.getValues();

为此:

  var sourcevalues = sourceRange.getDisplayValues();

此外,在将值复制到 destRange 之前,不要删除正在引用的其他 sheet:

  destRange.setValues(sourcevalues);