使用Apps Script将工作表转换为pdf并发送电子邮件时,我收到了损坏的PDF

时间:2018-08-15 20:58:25

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

我正在尝试使用以下代码将电子表格中的当前工作表转换为pdf并通过电子邮件发送:

function sendEmailPDF(pdfName, email, title, body) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var sheetId = sheet.getSheetId(); 
  var url_base = ss.getUrl().replace(/edit$/,'');
  var url_ext = 'exportFormat=pdf'   //export as pdf
      + '&format=pdf'     //export as pdf
      + '&size=letter'      // paper size
      + '&portrait=true'    // orientation, false for landscape
      + '&fitw=true'        // fit to width, false for actual size
      + '&sheetnames=false'  //hide optional headers and footers
      + '&printtitle=false'  //hide optional headers and footers
      + '&pagenumbers=false'  //hide page numbers
      + '&gridlines=false'  // hide gridlines
      + '&fzr=false'       // do not repeat row headers (frozen rows) on each page
      + '&gid='  //the sheet's Id

  var token = ScriptApp.getOAuthToken();

  var params = {
    headers: {
      'Authorization': 'Bearer ' + token,
    },
    'muteHttpExceptions' : true
  };

  var response = UrlFetchApp.fetch(url_base + url_ext + sheetId, params)
  var blob = response.getBlob().setName(pdfName + ".pdf");

  var mailOptions = {attachments:blob, htmlBody:body};

  if (MailApp.getRemainingDailyQuota() > 0){
    MailApp.sendEmail(
      email,
      title,
      "html content only",
      mailOptions
      );
    }
  }

现在代码执行没有错误,并且我收到一封附有pdf的电子邮件,但是我无法打开它,因为我收到一条错误消息,指出它已损坏并且无法打开。

当我在第24行删除以下代码时: 'muteHttpExceptions':是 该代码无法执行,并且我的日志中出现以下错误:

Request failed for https://docs.google.com/spreadsheets/d/146PS13Dz2HOzljUsH-umTU1FUIlcL1UCFqANAqNRUP0/exportFormat=pdf&format=pdf&size=letter&portrait=true&fitw=true&sheetnames=false&printtitle=false&pagenumbers=false&gridlines=false&fzr=false&gid=133193667 returned code 404. Truncated server response: <!DOCTYPE html><html lang="en"><head><meta name="description" content="Web word processing, presentations and spreadsheets"><meta name="viewport" c... (use muteHttpExceptions option to examine full response) at sendEmailPDF(sendEmailPDF:27) at submitNewProject(submitNewProject:264) at userOnEdit(On Edit:68) at userOnEdit(Code:2)

我在上下搜索,查看了如何使用Apps Script通过电子邮件发送pdf的不同代码示例,但是似乎没有一个对我有用。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我认为您的脚本中有2个修改点。

1。查询参数

请尝试如下插入?

发件人:

var url_base = ss.getUrl().replace(/edit$/,'');

收件人:

var url_base = ss.getUrl().replace(/edit$/,'') + "export?";

2。 MailApp.sendMail()的高级参数

  

附件BlobSource []与电子邮件一起发送的文件数组(请参见示例)

blob是一个数组。因此,请进行如下修改。

发件人:

var mailOptions = {attachments:blob, htmlBody:body};

收件人:

var mailOptions = {attachments: [blob], htmlBody:body};

我认为当blob只有一个时,attachments:blob起作用。如果要发送多个Blob,请使用一个数组。

参考:

如果仍然无法解决,请告诉我。我想修改它。

答案 1 :(得分:0)

正在向KingOfTheNerds求助... 我有类似的问题,有一天我的代码停止工作。上面的解决方案不能解决我的问题。 但是我发现问题出在行代码中:

var url_base = spreadsheet.getUrl().replace(/edit$/,'');

因为我的电子表格链接未以“ edit”一词结束。

我的解决方案是将提到的行更改为:

var url_base = spreadsheet.getUrl().replace(/edit.+/,'');

我希望它能对某人有所帮助:)

相关问题