Google工作表脚本(电子邮件至PDF)突然发送损坏的PDF

Google工作表脚本(电子邮件至PDF)突然发送损坏的PDF,pdf,google-apps-script,google-sheets,Pdf,Google Apps Script,Google Sheets,我有一个GoogleSheet脚本,它可以将页面以PDF格式发送到电子邮件中,直到昨天为止一直工作正常。突然,它开始发送无法打开的损坏PDF 该脚本运行良好,如果只是不能打开PDF文件,因为它说不能显示-无效的格式 你知道为什么它会停止工作吗 function sendSheetToPdfwithA1MailAdress(){ // this is the function to call var ss = SpreadsheetApp.getActiveSpreadsheet(); v

我有一个GoogleSheet脚本,它可以将页面以PDF格式发送到电子邮件中,直到昨天为止一直工作正常。突然,它开始发送无法打开的损坏PDF

该脚本运行良好,如果只是不能打开PDF文件,因为它说不能显示-无效的格式

你知道为什么它会停止工作吗

function sendSheetToPdfwithA1MailAdress(){ // this is the function to call
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheets()[0]; // it will send sheet 0 which is the first sheet in the spreadsheet.
  // if you change the number, change it also in the parameters below
  var shName = sh.getName()
    
  // This function uses a cell in the spreadsheet that names the file that is being saved as getfilename().  using this function will pull from a certain Cell (G4 in this case)
function getFilename() {

    var spreadsheet = SpreadsheetApp.getActive();

    var sheet = spreadsheet.getSheetByName('N1944E'); // Edit the sheet name as necessary

    var cell = sheet.getRange('C8'); //Cell to pull file name from.
    var filename = cell.getValue();

    return filename;
} 

  sendSpreadsheetToPdf(0, shName, sh.getRange('C6').getValue(),"Air Attack Daily Fire Sheet " + getFilename() );
}
function sendSpreadsheetToPdf(sheetNumber, pdfName, email,subject, htmlbody) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = spreadsheet.getId()  
  var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;  
 var url_base = spreadsheet.getUrl().replace(/edit$/,'');



  var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf

      + (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId)) 
      // following parameters are optional...
      + '&size=A4'      // paper size
      + '&portrait=true'    // orientation, false for landscape
      + '&fitw=true'        // fit to width, false for actual size
      + '&sheetnames=true&printtitle=false&pagenumbers=true'  //hide optional headers and footers
      + '&gridlines=false'  // hide gridlines
      + '&fzr=false';       // do not repeat row headers (frozen rows) on each page

  var options = {
    headers: {
      'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken(),
    }
  }

  var response = UrlFetchApp.fetch(url_base + url_ext, options);
  var blob = response.getBlob().setName(pdfName + '.pdf');
  if (email) {
    var mailOptions = {
      attachments:blob, htmlBody:htmlbody
    }
MailApp.sendEmail(
      email, 
      subject+" (" + pdfName +")", 
      "html content only", 
      mailOptions);

MailApp.sendEmail(
      Session.getActiveUser().getEmail(), 
      " "+subject+" (" + pdfName +")", 
      "html content only", 
      mailOptions);
  }
}

您是否可以尝试以下操作,而不是当前的blob声明:

var blob = response.getBlob().getAs('application/pdf').setName(pdfName + ' .pdf');
参考资料:


我也有同样的问题,但我刚刚解决了。问题在于:

var url_base = ss.getUrl().replace(/edit$/,'') + "export?";
getUrl返回的url版本似乎与以前不同。它现在在url上追加以下内容:ouid=&urlBuilderDomain=YOURDOMAIN使用记录器自己检查它

这导致pdf导出出现问题。因此,我构建了自己的url地址,将该行替换为以下内容:

var url_base = "https://docs.google.com/spreadsheets/d/" + ss.getId() + "/" + "export?";
它现在似乎正在工作!以下是生成我的blob的完整代码:

function generatePDF(pdfName, sheet, portrait){
  var token = ScriptApp.getOAuthToken();
  var params = {
    headers: {
      'Authorization': 'Bearer ' + token,
    },
    'muteHttpExceptions' : true
  };
  
  var sheetId = sheet.getSheetId();
  var ss = sheet.getParent();
  
  
//  var url_base = ss.getUrl().replace(/edit$/,'') + "export?";
  var url_base = "https://docs.google.com/spreadsheets/d/" + ss.getId() + "/" + "export?";
  
  var url_ext = 'exportFormat=pdf'   //export as pdf
  + '&format=pdf'     //export as pdf
  + '&gid=' + sheetId
  + '&size=letter'      // paper size
  + '&portrait=' + portrait    // orientation, false for landscape
  + '&fitw=true'        // fit to width, false for actual size
  + '&sheetnames=false'  //optional headers and footers
  + '&printtitle=false'  //optional headers and footers
  + '&pagenumbers=true'  //page numbers
  + '&gridlines=true'  // gridlines
  + '&fzr=true'       // repeat row headers (frozen rows) on each page
  
  var response = UrlFetchApp.fetch(url_base + url_ext, params);
  var blob = response.getBlob().setName(pdfName + ".pdf");
  
  return blob;
}
试试这个:

function sendSpreadsheetToPdf(sheetNumber, pdfName, email,subject, htmlbody) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = spreadsheet.getId()  
  var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;  
  var url_base = "docs.google.com/spreadsheets/d" + spreadsheetId + "/export?";
  var url_ext = 'exportFormat=pdf&format=pdf'   //export as pdf
  
  + (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId)) 
  // following parameters are optional...
  + '&size=A4'      // paper size
  + '&portrait=true'    // orientation, false for landscape
  + '&fitw=true'        // fit to width, false for actual size
  + '&sheetnames=true&printtitle=false&pagenumbers=true'  //hide optional headers and footers
  + '&gridlines=false'  // hide gridlines
  + '&fzr=false';       // do not repeat row headers (frozen rows) on each page
  
  var options = {
    headers: {
      'Authorization': 'Bearer ' + ScriptApp.getOAuthToken(),
    },
    'muteHttpExceptions' : true
  }
  
  var response = UrlFetchApp.fetch(url_base + url_ext, options);
  var blob = response.getBlob().setName(pdfName + '.pdf');
  if (email) {
    var mailOptions = {
      attachments:blob, htmlBody:htmlbody
    }
    MailApp.sendEmail(
      email, 
      subject+" (" + pdfName +")", 
      "html content only", 
      mailOptions);
    
    MailApp.sendEmail(
      Session.getActiveUser().getEmail(), 
      " "+subject+" (" + pdfName +")", 
      "html content only", 
      mailOptions);
  }
}

我替换了这个:var blob=response.getBlob.setNamepdfName+'.pdf';有了这个:``var blob=response.getAs'application/pdf'.setNamepdfName+'.pdf,``然后我得到了这个错误:无效或意外的标记行49,文件Code.gsdismissunforty我的邮箱中仍然有一个损坏的pdf。代码运行正常,但PDF已损坏。同样的问题。它没有改变任何东西。你能提供一个PDF文档来提供这个错误消息吗?也许腐败的本质会给我们一个线索。@Davidvandriesche这里有一个PDF的链接,我无法打开。您可能需要从Google Drive下载它。你怀疑我和你有同样的问题吗?你怀疑我代码中的哪一行被关闭了?我怀疑。将此:[var url_base=spreadsheet.getUrl.replace/edit$/,;]更改为:[var url_base=+spreadsheet.getId+/;]现在我得到:异常:返回代码404的请求失败。截断服务器响应:修复了它!你的代码缺少a/导致了我的麻烦。var url_base=docs.google.com/spreadsheets/d/+spreadsheet.getId+/;很好的发现!!谢谢!我觉得我们很接近。我用你的那一半代码替换了我的那一半代码,然后它就执行了,但我现在根本没有收到电子邮件。我使用C6输入我要发送到的电子邮件地址。所以你的代码和我的不一样。我可能不得不从头开始。是的,我们正在以不同的方式处理实际的电子邮件过程,但将工作表作为pdf文件检索的概念已经存在。您只需要修改代码以满足您的需要。在执行url获取后,尝试记录响应变量,并查看其内容。如果有一个错误,它应该出现在那里,让你知道发生了什么。