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
相关产品推荐
相关产品推荐

