以 PDF 格式正确保存以驱动 Google 表格
Posted
技术标签:
【中文标题】以 PDF 格式正确保存以驱动 Google 表格【英文标题】:Save correctly in PDF to Drive a Google Sheet 【发布时间】:2021-08-24 15:27:00 【问题描述】:我正在Sheet下开发一个脚本,允许:
发送电子邮件并附上表格的 pdf 副本 将此工作表以 pdf 格式保存在我的云端硬盘中(使用文件夹 ID 定义)脚本的第一部分我成功了,没有任何问题。对于第二部分,我也成功地进行了这个备份。但是,此信息中的信息不适合我。事实上,图像没有在文件中传输(我有“cellimage”出现)并且数据与我的工作表中存在的数据不对应。事实上,它们在我的工作表中的逗号后四舍五入到 3 位,而在备份中,没有四舍五入。
我希望拥有与电子邮件附件相同的文件。我努力搜索,但找不到将附件保存在驱动器中的代码。
Here 是文件的链接。
这是允许您发送邮件的功能:
function envoiMail()
// Déclaration des constantes
const classeur = SpreadsheetApp.getActiveSpreadsheet();
const feuille = classeur.getSheetByName('SYNTHESE');
// Déclaration des variables
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;
// Pièce jointe
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");
// Fonction permettant d'envoyer le mail
MailApp.sendEmail("email@gmail.com", sujet, corpsDuMail,
htmlBody : corpsDuMail,
attachments : [pdfMarge]
);
// Pop-up pour informer que l'envoi de mails s'est déroulé correctement
SpreadsheetApp.getUi().alert("Le mail a bien été envoyé aux personnes concernées !");
// Fonction permettant de mettre en majuscule la première lettre de la chaîne de caractère
function majString(a)
return (a+'').charAt(0).toUpperCase()+a.substr(1);
这是允许我将工作表存档在驱动器中的功能:
function sauvegardeDrive()
// Déclaration des variables et constantes
const classeur = SpreadsheetApp.getActiveSpreadsheet();
const feuille = classeur.getSheetByName('SYNTHESE');
var sheetName = "SYNTHESE";
var folderID = "1sRkfgLO8C4ABcrzPBonGPJm3emzWD3Ct";
var sourceSpreadsheet = SpreadsheetApp.getActive();
var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
var folder = DriveApp.getFolderById(folderID);
var semaine = feuille.getRange('B5').getValue();
var annee = feuille.getRange('B4').getValue();
var pdfName = "test"+semaine+"_"+annee+".pdf";
//Copie de l'ensemble du Sheet
var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("copieFichier", folder));
//Suppression des onglets inutiles
var sheets = destSpreadsheet.getSheets();
for (i = 0; i < sheets.length; i++)
if (sheets[i].getSheetName() != sheetName)
destSpreadsheet.deleteSheet(sheets[i]);
var destSheet = destSpreadsheet.getSheets()[0];
var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
var sourcevalues = sourceRange.getValues();
var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
destRange.setValues(sourcevalues);
//Sauvegarde en pdf
var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
var newFile = folder.createFile(theBlob);
//Suppression du Sheet temporaire
DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
如果你有什么想法,我很感兴趣。
在此先感谢您,对于文法英语(或其他)的错误,我们深表歉意
【问题讨论】:
【参考方案1】:注释掉(或删除)sauvegardeDrive()
函数中的这些行:
// var destSheet = destSpreadsheet.getSheets()[0];
// var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
// var sourcevalues = sourceRange.getValues();
// var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
// destRange.setValues(sourcevalues);
你不需要它们。您已经复制了工作表,您无需再次复制工作表数据。
更新
如果您的工作表包含引用日期,您可以在删除另一张工作表的循环之前添加这两行(在注释“//Suppression des onglets inutiles”上方)将其转换为静态日期:
var range = destSpreadsheet.getSheetByName('SYNTHESE').getDataRange();
range.setValues(range.getDisplayValues());
更新 2
如果邮件脚本适合您,您可以使用相同的代码部分来保存工作表。试试这个 hew 函数sauvegardeDrive()
:
function sauvegardeDrive()
// Déclaration des variables et constantes
const classeur = SpreadsheetApp.getActiveSpreadsheet();
const feuille = classeur.getSheetByName('SYNTHESE');
var sheetName = "SYNTHESE";
var folderID = "1gZEWeG4XzZDuEqDDWKaMoVolMmeLWDRI";
var sourceSpreadsheet = SpreadsheetApp.getActive();
var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
var folder = DriveApp.getFolderById(folderID);
var semaine = feuille.getRange('B5').getValue();
var annee = feuille.getRange('B4').getValue();
var pdfName = "test"+semaine+"_"+annee+".pdf";
// Pièce jointe -- this part is stealed from envoiMail() function
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(pdfName);
folder.createFile(pdfMarge);
【讨论】:
感谢您的回答我的朋友,它运作良好!但是,如果我的工作表文件包含多个选项卡,它会将所有选项卡保存在我的 pdf 中。请问您知道解决方法吗? 你试过了吗?在制作 PDF 之前,您的脚本会从副本中删除除“SYNTHESE”之外的所有工作表。在评论//Suppression des onglets inutiles
之后有一个循环。它正是这样做的。我只是厌倦了添加几张纸,运行脚本,我在结果 PDF 中看不到这些额外的表格。
带有额外标签的电子表格:imgur.com/uSLaVQk.png PDF:imgur.com/XLY5njo.png
是的,它适用于我发给你的测试文件,我同意。但是,我忘了提及,并且很抱歉,真正的文件通过 SEARCHV 获取数据。因为我正在创建一个副本,所以我得到了#REF!而不是我的结果(数据未处理,文件无权访问此工作表)。真的很抱歉我之前忘了提这个,我认为它不会对结果产生影响(我是脚本的初学者)
不确定我是否正确理解了您的问题。试试我的更新。我认为它将保留电子表格中的所有引用数据。如果您在电子表格之间(而不是工作表之间)有引用,则可能需要执行其他操作。以上是关于以 PDF 格式正确保存以驱动 Google 表格的主要内容,如果未能解决你的问题,请参考以下文章
VBA MS 项目将多个自定义报告以 PDF 格式保存到位置