另存为带有图像和横向的PDF

时间:2019-07-15 22:28:12

标签: google-apps-script google-sheets google-form

我有一个代码,当从链接表单提交时,它将选择包含最新提交信息的行,该行将自动以我喜欢的格式填充另一张纸,然后将其另存为PDF。我已经将此代码用于多个工作表,但是现在我需要在包含图像的工作表上使用它。我的PDF在保存时没有图像,这对于该过程至关重要。除此之外,如果有人可以提供帮助,我也希望将其保存在景观中,

我已经尝试了一些代码,但是在编写代码方面有所帮助,并且对语言的理解不足以完成这项工作。

function generatePdf() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheeta = ss.getSheetByName('Firstsheet');
sheeta.getRange("A2:A").clear();
var lastrow = sheeta.getLastRow();
var range = sheeta.getRange(lastrow, 1);
var values = range.setValue("autofill"); //This is a checkbox in column A which triggers the vlookup on the second sheet

var originalSpreadsheet = SpreadsheetApp.getActive();

var sourcesheet = originalSpreadsheet.getSheetByName("Secondsheet");
var sourcerange = sourcesheet.getRange('A:I');
var sourcevalues = sourcerange.getValues();
var data = sourcesheet.getDataRange().getValues();
var pdfname = sourcesheet.getRange('E34').getDisplayValue();

var newSpreadsheet = SpreadsheetApp.create("Spreadsheet to export");
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var projectname = SpreadsheetApp.getActiveSpreadsheet();
var sheet = sourcesheet.copyTo(newSpreadsheet);
var destrange = sheet.getRange('A:I');
destrange.setValues(sourcevalues);
newSpreadsheet.getSheetByName('Sheet1').activate();
newSpreadsheet.deleteActiveSheet();

var pdf = DriveApp.getFileById(newSpreadsheet.getId());
var theBlob = pdf.getBlob().getAs('application/pdf').setName("Sheet" + pdfname);

var folderID = "folder ID goes here";
var folder = DriveApp.getFolderById(folderID);
var newFile = folder.createFile(theBlob);

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

sheeta.getRange("A2:A").clear();
}

我需要将A1:F29中的图像(合并)保存到此公式创建的中间页中,然后保存到PDF。如果可能的话,将其保存在风景中也是很好的。

1 个答案:

答案 0 :(得分:1)

1)缺少图像的问题是,您要进行两次复印过程,第一个过程是使用copyTo()函数正确地复制所有图纸。然后再用一个:

  var destrange = sheet.getRange('A:I');
  destrange.setValues(sourcevalues);

复制所有数据,甚至是“在单元格上”图像,但也不是“在单元格中”图像(可能是这是一个新的表格功能),这可能是您面临的问题。因此,您应该删除这两行代码,以便不覆盖第一个复制过程。那就是我所做的并且工作正常。

2)由于没有指定景观特征的选项,因此可以使用@cooper [1]向出口URL请求的链接中使用的方法。我实现了代码并按预期工作,您只需要删除以下两行即可:

  var pdf = DriveApp.getFileById(newSpreadsheet.getId());
  var theBlob = pdf.getBlob().getAs('application/pdf').setName("Sheet" + pdfname);

为此:

var url = newSpreadsheet.getUrl();

  //remove the trailing 'edit' from the url
  url = url.replace(/edit$/, '');

  //additional parameters for exporting the sheet as a pdf
  var url_ext = 'export?exportFormat=pdf&format=pdf' + //export as pdf
    //below parameters are optional...
    '&portrait=false' + //orientation, false for landscape
    '&gid=' + newSpreadsheet.getSheetId(); //the sheet's Id

  var token = ScriptApp.getOAuthToken();

  var response = UrlFetchApp.fetch(url + url_ext, {
    headers: {
      'Authorization': 'Bearer ' + token
    }
  });

  var theBlob = response.getBlob().setName("Sheet" + pdfname);

[1] https://ctrlq.org/code/19869-email-google-spreadsheets-pdf