【问题标题】:Export Specific sheet to PDF [duplicate]将特定工作表导出为 PDF [重复]
【发布时间】:2020-10-22 20:10:54
【问题描述】:

我知道之前在Using Google Apps Script to save a single sheet from a spreadsheet as pdf in a specific folder 下提出过类似类型的问题

使用的代码对我有用,如下所述:

function generatePdf() {
  // Get active spreadsheet.
  var sourceSpreadsheet = SpreadsheetApp.getActive();

  // Get active sheet.
  var sheets = sourceSpreadsheet.getSheets();
  var sheetName = sourceSpreadsheet.getActiveSheet().getName();
  var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);

  // Set the output filename as SheetName.
  var pdfName = sheetName;

  // Get folder containing spreadsheet to save pdf in.
  var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents();
  if (parents.hasNext()) {
    var folder = parents.next();
  } else {
    folder = DriveApp.getRootFolder();
  }

  // Copy whole spreadsheet.
  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.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];

  // Repace cell values with text (to avoid broken references).
  var sourceRange = sourceSheet.getRange(1, 1, sourceSheet.getMaxRows(), sourceSheet.getMaxColumns());
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
  destRange.setValues(sourcevalues);

  // Save to pdf.
  var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
  var newFile = folder.createFile(theBlob);

  // Delete the temporary sheet.
  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}

我遇到的问题是我的源工作表有一些字段是使用vlookup 自动填充到工作表中的。这些字段在此脚本创建的临时文件中导出,因为我检查了垃圾并且存在字段值,但代码生成的 PDF 缺少所有 vlookup 数据。

PDF示例图如下,其中vlookup缺失的条目用黄色标记:

虽然垃圾箱中的临时 google 工作表具有相应单元格中的值。相同的屏幕截图如下,vlookup 字段以红色突出显示。

请帮助我解决问题。

【问题讨论】:

    标签: google-apps-script google-sheets pdf-generation


    【解决方案1】:

    在第 38 行添加 contentOnly: true。参见代码。希望这能解决问题。这将清除所有公式。 (我不确定 setValues() 是否接受这个额外的参数。copyTo 可以,因此您可以将工作表复制到 contentOnly 工作表,然后将其用于 pdf)

    function generatePdf() {
      // Get active spreadsheet.
      var sourceSpreadsheet = SpreadsheetApp.getActive();
    
      // Get active sheet.
      var sheets = sourceSpreadsheet.getSheets();
      var sheetName = sourceSpreadsheet.getActiveSheet().getName();
      var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
    
      // Set the output filename as SheetName.
      var pdfName = sheetName;
    
      // Get folder containing spreadsheet to save pdf in.
      var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents();
      if (parents.hasNext()) {
        var folder = parents.next();
      } else {
        folder = DriveApp.getRootFolder();
      }
    
      // Copy whole spreadsheet.
      var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.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];
    
      // Repace cell values with text (to avoid broken references).
      var sourceRange = sourceSheet.getRange(1, 1, sourceSheet.getMaxRows(), sourceSheet.getMaxColumns());
      var sourcevalues = sourceRange.getValues();
      var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
      destRange.setValues(sourcevalues, {contentsOnly:true});
    
      // Save to pdf.
      var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
      var newFile = folder.createFile(theBlob);
    
      // Delete the temporary sheet.
      DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
    }
    

    【讨论】:

    • 此行出现错误“异常:参数 (number[],(class)) 与 SpreadsheetApp.Range.setValues 的方法签名不匹配。(第 40 行,文件“PDF” )"
    • 是的,这就是我们的想法,试试上面代码中提到的 copyTo。 webapps.stackexchange.com/questions/118136/…
    • 抱歉发了这么长的帖子,一个简单的flush就可以了
    【解决方案2】:

    只需要添加一行来刷新应用程序就可以了。更新代码:

    function generatePdf() {
      // Get active spreadsheet.
      var sourceSpreadsheet = SpreadsheetApp.getActive();
      
      // Get active sheet.
      var sheets = sourceSpreadsheet.getSheets();
      var sheetName = sourceSpreadsheet.getActiveSheet().getName();
      var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
      
      // Set the output filename as SheetName.
      var pdfName = sheetName;
    
      // Get folder containing spreadsheet to save pdf in.
      var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents();
      if (parents.hasNext()) {
        var folder = parents.next();
      }
      else {
        folder = DriveApp.getRootFolder();
      }
      
      // Copy whole spreadsheet.
      var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.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];
    
      // Repace cell values with text (to avoid broken references).
      var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
      var sourcevalues = sourceRange.getValues();
      var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
      destRange.setValues(sourcevalues);
      SpreadsheetApp.flush();
      // Save to pdf.
      var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
      var newFile = folder.createFile(theBlob);
    
      // Delete the temporary sheet.
      DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      相关资源
      最近更新 更多