【问题标题】:PDF attachment corruptedPDF 附件损坏
【发布时间】:2022-01-14 12:48:32
【问题描述】:

在解决了 GmailApp 声明的问题后,我现在遇到了一个新问题,即我的 pdf 附件不可读。

bug 之前,pdf 附件运行良好。

我怀疑 var "blobresponse" 或 "pdfOpts" 是问题的根源,但也许我错了。

脚本出了什么问题?你能解释一下吗? 这是一个可重现的example

function emailAsPDF() {

 SpreadsheetApp.flush();
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 ss.setActiveSheet(ss.getSheetByName("Recherche"));
 var sheet = ss.getActiveSheet();
 var gid = sheet.getSheetId();
 var pdfOpts = 
    'exportFormat=pdf&format=pdf'+ // export as pdf
    '&size=0' + // paper size letter / You can use A4 or legal
    '&portrait=false' + // orientation portal, use false for landscape
    '&fitw=true' + // fit to page width false, to get the actual size
    '&sheetnames=false&printtitle=true' + // hide optional headers and footers
    '&pagenumbers=true&gridlines=false' + // hide page numbers and gridlines
    '&horizontal_alignment=CENTER&vertical_alignment=CENTER' +
    '&fzr=true' + // do not repeat row headers (frozen rows) on each page
    '&attachment=false' +
    gid;
// '&size=0&fzr=true&portrait=false&fitw=true&gridlines=false&printtitle=true&sheetnames=false&pagenumbers=true&attachment=false&gid='+gid;
 
 
 SourceSS = SpreadsheetApp.getActive();
 var SourceSheet = SourceSS.getSheetByName("Recherche");
 var url = 'https://docs.google.com/spreadsheets/d/' + SourceSS.getId().replace(/edit$/, '') + '/export?exportformat=pdf&format=pdf' + pdfOpts;
 //var url = 'https://docs.google.com/spreadsheets/d/'.replace(/edit$/, '') + '/export?exportformat=pdf&format=pdf' + pdfOpts;
 var token = ScriptApp.getOAuthToken();
 //var options = {
      
//options = {muteHttpExceptions: true};
 //var options = {
  var blobresponse = UrlFetchApp.fetch(url, {
    headers: {
        'Authorization': 'Bearer ' +  token,
      },
      muteHttpExceptions: true}
    );
  //options);
  var CandidateName = ss.getRangeByName("Nom.Candidat").getValue();
  var blob=blobresponse.getBlob().setName(ss.getName() + " - " + CandidateName +".pdf" );
  var emailAddress = Session.getActiveUser().getEmail();
  var signature = Gmail.Users.Settings.SendAs.get("me", emailAddress).signature; 
  var mess = "Voulez-vous envoyer votre rapport  à l'adresse : " + emailAddress;
  var ans= Browser.msgBox("Courriel", mess, Browser.Buttons.YES_NO);
  if (ans===Browser.Buttons.NO){return;}
  var mess="Votre rapport a été envoyé à l'adresse : " + emailAddress;
  //var ss=SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Recherche");
  var data = ss.getSheetByName("Données");
  const corps = data.getRange("A24:E27").getValues();
  const htmlTemplate = HtmlService.createTemplateFromFile("HtmlSigTemplate");
  htmlTemplate.corps = corps;
  var emailSubject = "Vérifications pré-emploi complétées" +" - "+ CandidateName;
  const htmlForEmail = htmlTemplate.evaluate().getContent() + "--" + "<br>" + signature;
  //console.log(htmlForEmail);
  GmailApp.sendEmail(
    emailAddress, 
    emailSubject, 
    corps,
    {htmlBody: htmlForEmail,
    attachments:[blob]});
  Browser.msgBox("Courriel", mess, Browser.Buttons.OK); 
}


function parentFolder() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var file = DriveApp.getFileById(ss.getId()); 
  var ParentFolder= file.getParents();
  while ( ParentFolder.hasNext() ) {
    var folder = ParentFolder.next();
    folderID=folder.getId();
     Logger.log(folderID);
  }
  return folderID;
}

【问题讨论】:

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


【解决方案1】:

经过漫长而痛苦的研究,我找到了罪魁祸首。您注意到变量 pdfOpts 中的最后一行缺少一些细节

旧代码:

var pdfOpts = 
    'exportFormat=pdf&format=pdf'+ // export as pdf
    '&size=0' + // paper size letter / You can use A4 or legal
    '&portrait=false' + // orientation portal, use false for landscape
    '&fitw=true' + // fit to page width false, to get the actual size
    '&sheetnames=false&printtitle=true' + // hide optional headers and footers
    '&pagenumbers=true&gridlines=false' + // hide page numbers and gridlines
    '&horizontal_alignment=CENTER&vertical_alignment=CENTER' +
    '&fzr=true' + // do not repeat row headers (frozen rows) on each page
    '&attachment=false' +
    gid;

新代码:

  const pdfOpts = '&top_margin=0.30&bottom_margin=0.30&left_margin=0.25&right_margin=0.25'
    +'&size=LETTER' // paper size letter / You can use A4 or legal
    +'&portrait=false' // orientation portal, use false for landscape
    +'&fitw=true' // fit to page width false, to get the actual size
    +'&sheetnames=false' // hide optional headers
    +'&printtitle=true' //and footers
    +'&pagenumbers=true' // hide page numbers 
    +'&gridlines=false' //and gridlines
    +'&horizontal_alignment=CENTER'
    +'&vertical_alignment=CENTER'
    +'&fzr=true' // do not repeat row headers (frozen rows) on each page
    +'&attachment=false'
    +'&gid='+gid;

【讨论】:

  • 很高兴您发现了这个问题,但如果您概述了新的细节也很好。沿着这些思路,细节看起来并不那么“微不足道”。有几个任务是不同的,并且有一些全新的领域。
【解决方案2】:

代码有几个问题。我建议您通过删除冗余语句并采用更好的现代 JavaScript 实践来开始清理您的脚本。即。

使用constlet 代替var。旧的 Google Apps 脚本代码一直使用 var,因为不支持 constlet。当前的 Google Apps 脚本默认运行时会执行此操作。

相关

代替

ss.setActiveSheet(ss.getSheetByName("Recherche"));
 var sheet = ss.getActiveSheet(); 

使用

 const sheet = ss.getSheetByName("Recherche");

代替

SourceSS = SpreadsheetApp.getActive();
 var SourceSheet = SourceSS.getSheetByName("Recherche");
 var url = 'https://docs.google.com/spreadsheets/d/' + SourceSS.getId().replace(/edit$/, '') + '/export?exportformat=pdf&format=pdf' + pdfOpts;

使用

const url = 'https://docs.google.com/spreadsheets/d/' + ss.getId() + '/export?exportformat=pdf&format=pdf' + pdfOpts;

注意事项:

  1. getId() 返回电子表格 id,不包括 edit
  2. 不必为要导出为 PDF 的电子表格和工作表声明新变量,因为之前声明的变量具有所需的对象。

此外,您可能会发现查看以前与使用 UrlFetchApp 创建 PDF 相关的问题会有所帮助,如下所示:

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2012-03-16
    • 2014-02-11
    相关资源
    最近更新 更多