以 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 格式保存到位置

如何把pdf文件转换为excel表格

如何通过html创建可以以pdf格式下载/打印的文档页面[重复]

如何在电脑中将Excel表格格式转换成PDF格式?

以编程方式提取 PDF 表

以适当的格式创建 pdf