You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Sheets脚本存PDF到Drive格式异常问题技术咨询

Google Sheets脚本PDF导出归档解决方案

问题根因

  • 你现有的两套PDF生成逻辑不一致:邮件发送时调用Google Sheets官方导出接口生成PDF,完整保留了原表的单元格图片、数值格式、页面配置;而归档功能通过「复制表格+仅粘贴纯数值」的方式生成临时表再导出,丢失了图片、单元格格式,自然出现图片显示异常、数值精度不符的问题。

最优实现方案

直接复用邮件发送时的PDF导出逻辑,无需创建临时表格,生成的PDF和邮件附件100%一致,有两种实现方式可选:

方式1:将归档逻辑整合到邮件发送函数,一次操作同时完成发件+归档

修改后的envoiMail代码如下:

function envoiMail() {
  // 声明常量
  const classeur = SpreadsheetApp.getActiveSpreadsheet();
  const feuille = classeur.getSheetByName('SYNTHESE');
  // 归档用配置:可自行替换为目标文件夹ID
  const ARCHIVE_FOLDER_ID = "1sRkfgLO8C4ABcrzPBonGPJm3emzWD3Ct";

  // 声明变量
  var semaine = feuille.getRange('B5').getValue();
  var annee = feuille.getRange('B4').getValue();

  var auditeurMail = Session.getActiveUser().getEmail().split('@');
  var auditeurNomPrenom = auditeurMail[0].split('.');
  var auditeurPrenom = majString(auditeurNomPrenom[0]);
  var auditeurNom = majString(auditeurNomPrenom[1]);
  var signature = auditeurPrenom+' '+auditeurNom;

  var sujet = 'test ' + semaine + ' (' + annee +')';
  var corpsDuMail = '<p>Bonjour,</p>'
  + '<p> Veuillez trouver ci-joint le test de la semaine ' + semaine + '-'+annee+'.<\/b><\/p><br>'
  + '<\/p>Bonne réception,<\/p>'
  + signature;

 // 生成PDF附件
 var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", classeur.getId());
 var url_ext = 'exportFormat=pdf&format=pdf' + '&size=A4' + '&portrait=true' + '&fitw=true&source=labnol' 
            + '&sheetnames=false&printtitle=false' + '&pagenumbers=false&gridlines=false' + '&fzr=false' + '&gid=';
 var token = ScriptApp.getOAuthToken();
 var pdfMarge = UrlFetchApp.fetch(url + url_ext + feuille.getSheetId(),{headers : {
              'Authorization' : 'Bearer ' + token }}).getBlob().setName("Marge_previsionnelle_S"+semaine+"_"+annee+".pdf");


 // 发送邮件
 MailApp.sendEmail("email@gmail.com", sujet, corpsDuMail, {
 htmlBody : corpsDuMail,
 attachments : [pdfMarge]
 });

 // 新增:直接将同一PDF blob存入指定Drive文件夹完成归档
 DriveApp.getFolderById(ARCHIVE_FOLDER_ID).createFile(pdfMarge);

 // 操作完成提示
 SpreadsheetApp.getUi().alert("邮件发送+Drive归档均已完成!");
}

// 首字母大写工具函数
function majString(a){
   return (a+'').charAt(0).toUpperCase()+a.substr(1);
 }

方式2:单独优化归档函数,无需依赖邮件发送逻辑

重写后的sauvegardeDrive代码如下,完全去掉临时表格的冗余操作:

function sauvegardeDrive() {
  const classeur = SpreadsheetApp.getActiveSpreadsheet();
  const feuille = classeur.getSheetByName('SYNTHESE');
  const folderID = "1sRkfgLO8C4ABcrzPBonGPJm3emzWD3Ct";
  const folder = DriveApp.getFolderById(folderID);
  const semaine = feuille.getRange('B5').getValue();
  const annee = feuille.getRange('B4').getValue();
  const pdfName = "test"+semaine+"_"+annee+".pdf";

  // 复用邮件发送的PDF导出逻辑,参数完全一致确保PDF格式相同
  const url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", classeur.getId());
  const url_ext = 'exportFormat=pdf&format=pdf' + '&size=A4' + '&portrait=true' + '&fitw=true&source=labnol' 
            + '&sheetnames=false&printtitle=false' + '&pagenumbers=false&gridlines=false' + '&fzr=false' + '&gid=' + feuille.getSheetId();
  const token = ScriptApp.getOAuthToken();
  const pdfBlob = UrlFetchApp.fetch(url + url_ext,{
    headers : {'Authorization' : 'Bearer ' + token }
  }).getBlob().setName(pdfName);

  // 直接存入Drive
  folder.createFile(pdfBlob);
}

注意事项

  • 两种方式任选即可,第一种只需执行一次函数就能同时完成两个需求,效率更高
  • 首次运行时如果触发权限请求,按照提示完成脚本授权即可正常使用

内容的提问来源于stack exchange,提问作者Damien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:57:03