正确保存为 PDF 以驱动 Google Sheet

Save correctly in PDF to Drive a Google Sheet

我正在 Sheet 下开发脚本,允许:

我成功完成了脚本的第一部分,没有任何问题。对于第二部分,我也成功地做了这个备份。但是,此信息中的信息不适合我。事实上,图像没有在文件中传输(我有“cellimage”而是出现)并且数据与我的 Sheet 中存在的数据不对应。事实上,它们在我的 sheet 中逗号后四舍五入为 3 位数,而在备份中,没有四舍五入。

我希望拥有与电子邮件附件相同的文件。我苦苦寻找,但找不到将我的附件保存在驱动器中的代码。

Here 是文件的 link。

这是允许您发送邮件的函数:

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);
 }

这是允许我在我的驱动器中存档我的 sheet 的功能:

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);
}

如果你有任何想法,我很感兴趣。

在此先感谢您,对于语法英语(或其他)的错误,我们深表歉意

注释掉(或删除)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);

你不需要它们。您已经复制了sheet,您不需要再次复制sheet数据。

更新

如果您的 sheet 包含引用日期,如果您在删除另一个 sheet 的循环之前添加这两行,则可以将其转换为静态日期(在注释 '//Suppression des onglets inutiles'):

var range = destSpreadsheet.getSheetByName('SYNTHESE').getDataRange(); 
range.setValues(range.getDisplayValues());

更新 2

如果邮件脚本适合您,您可以只使用相同的代码部分来保存 sheet。试试这个 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);
}