【问题标题】:Convert Google Sheets into Individual PDFs and Email Them将 Google 表格转换为单独的 PDF 并通过电子邮件发送
【发布时间】:2019-05-22 01:21:48
【问题描述】:

我有一个电子表格,其中始终包含名为“时间表”的表格,填写表格的人可以根据需要创建任意数量的额外笔记表格。

我需要将“时间表”表之外的所有表转换为单独的 PDF 并通过电子邮件发送到一个地址。

我在创建不能将它们合并为单个 PDF 的脚本时遇到问题。因此,它还包括 PDF 中的“时间表”表。

我需要将每个笔记表转换为单个 PDF,然后将所有 PDF 作为单独的附件通过电子邮件发送。填写它的人也可以将笔记重命名为他们想要的任何内容,这样我就无法按名称获取表。

我有一些代码可以组合所有工作表并将其重命名用于不同目的,如果有帮助,我将在下面包含它。

提前感谢您的帮助

function emailGoogleSpreadsheetAsPDF() {

  // Send the PDF of the spreadsheet to this email address
  var email = "email@gmail.com"; 

  // Get the currently active spreadsheet URL (link)
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // Custom
  var name = ss.getRange("Timesheet!J6:K6").getValue();
  var agency = ss.getRange("Timesheet!B4:C4").getValue();

  // Date
  var today = new Date();
  var dd = today.getDate();
  var mm = today.getMonth() + 1; //January is 0!
  var yyyy = today.getFullYear();

  if (dd < 10) {
    dd = '0' + dd;
  }

  if (mm < 10) {
    mm = '0' + mm;
  }

  today = mm + '/' + dd + '/' + yyyy;

  // Subject of email message
  var subject = name + " has Submitted Their Timesheet and Notes"; 

  // Email Body can  be HTML too 
  var body = "This was submitted on " + today;

  var blob = DriveApp.getFileById(ss.getId()).getAs("application/pdf");

  blob.setName(name + "_" + agency + "_" + today + "_" + "timesheet_notes.pdf");

  // If allowed to send emails, send the email with the PDF attachment
  if (MailApp.getRemainingDailyQuota() > 0) 
    GmailApp.sendEmail(email, subject, body, {
      htmlBody: body,
      attachments:[blob]     
    });
}

【问题讨论】:

  • 只需在 pdf 中隐藏所有不需要的工作表。
  • 仍然将它们全部组合成一个 PDF,我需要每张纸都是单独的 PDF。
  • 我今天早上会做这个,因为我想知道怎么做

标签: javascript google-apps-script google-sheets


【解决方案1】:

将电子表格的表格作为单独的 PDF 通过电子邮件发送

我无法通过创建 blob 并将它们放入数组来做到这一点。所以我为每个页面创建了单独的 PDF 文件,然后在最后将它们丢弃。我还添加了排除数组,以便您可以从整个过程中排除某些文件,并且只发送您希望的工作表。

当前版本包括在程序创建文件和发送电子邮件时跟踪程序进度的对话框提示。所以它和你的程序不完全一样。

这些行也是你的程序对我来说很难理解,因为你有一个 2 单元格数组,但你使用 getValue() 而不是 getValues();

 var name = ss.getRange("Timesheet!J6:K6").getValue();
 var agency = ss.getRange("Timesheet!B4:C4").getValue();

这是我的代码:

function savePDFFiles1() {
  var ss=SpreadsheetApp.getActive();
  var exclA=['Summary','Images','Globals','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21'];
  var fA=[];
  var html="";
  var shts=ss.getSheets();
  var pdfFldr=DriveApp.getFolderById('FolderId');//folder where I stored the files temporarily
  for(var i=0;i<shts.length;i++) {
    var sh=shts[i];
    var name=sh.getName();
    if(exclA.indexOf(name)==-1) {
      sh.showSheet();
      for(var j=0;j<shts.length;j++) {
        if(shts[j].getName()!=name) {
          shts[j].hideSheet();
        }
      }
      SpreadsheetApp.flush();//I dont know if this is required
      var file=pdfFldr.createFile(ss.getBlob().getAs('application/pdf').setName(Utilities.formatString('%s_%s.pdf',ss.getName(),name)));
      html+=Utilities.formatString('<br />File: %s Created',file.getName());
      var userInterface=HtmlService.createHtmlOutput(html);
      SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Files Created')                                          
      fA.push(file);
    }
  }
  GmailApp.sendEmail('recipient email', 'Plot Reports', 'Plot Reports Attached', {attachments:fA})
  html+='<br />Email Sent';
  var userInterface=HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Files Created');                                          
  for(var i=0;i<fA.length;i++ ) {
    fA[i].setTrashed(true);
  }
  html+='<br />Files Trashed and Process Complete';
  html+='<script>window.onload=function(){google.script.host.close();}</script>';
  var userInterface=HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Files Created');                                          
}

在我的示例中,我使用的工作表包含一些以数字命名的工作表,并且我通常将某些工作表用作哈希表,因此我通常始终将它们隐藏起来。

我现在回去看看更新你的脚本。

好的,我认为你的脚本应该是这样的:

function emailGoogleSpreadsheetAsPDF() {
  var email="email@gmail.com"; 
  var ss=SpreadsheetApp.getActive();
  var name=ss.getRange("Timesheet!J6").getValue();//trimmed the range down to match the getValue();
  var agency=ss.getRange("Timesheet!B4").getValue();//same here
  var fldr=DriveApp.getFolderById('folderId');
  var fA=[];
  var today=Utilities.formatDate(new Date(),Session.getScriptTimeZone(),"MM/dd/yyyy");
  var subject=Utilities.formatString('%s has Submitted Their Timesheet and Notes',name); 
  var body=Utilities.formatString('This was submitted on %s',today);
  var shts=ss.getSheets();
  for(var i=0;i<shts.length;i++) {
    var sh=shts[i];
    var name=sh.getName();
    sh.showSheet();
    for(var j=0;j<shts.length;j++) {
      if(shts[j].getName()!=name) {
        shts[j].hideSheet();
      }
    }
    SpreadsheetApp.flush();//this may not be necessary...not sure
    var file=fldr.createFile(ss.getBlob().getAs('application/pdf')).setName(Utilities.formatString('%s_%s_%s_timesheet_notes.pdf', name,agency,today));
    fA.push(file);
  }
  GmailApp.sendEmail(email,subject,body, {attachments:fA});
  for(var i=0;i<fA.length;i++) {
    fA[i].setTrashed(true); 
  }
}

注意:我没有测试过最后一个,所以可能需要进行一些调试,但它与另一个示例基本相同。经过测试。

还有另一种使用 UrlFetchApp 的方法来执行此操作,已在 here 上进行了讨论。就我个人而言,我宁愿只创建文件并在最后将它们丢弃。

请求更改:

function emailGoogleSpreadsheetAsPDF() {
  var email="email@gmail.com";
  var exclA=['TimeSheet'];//and others
  var ss=SpreadsheetApp.getActive();
  var name=ss.getRange("Timesheet!J6").getValue();//trimmed the range down to match the getValue();
  var agency=ss.getRange("Timesheet!B4").getValue();//same here
  var fldr=DriveApp.getFolderById('folderId');
  var fA=[];
  var today=Utilities.formatDate(new Date(),Session.getScriptTimeZone(),"MM/dd/yyyy");
  var subject=Utilities.formatString('%s has Submitted Their Timesheet and Notes',name); 
  var body=Utilities.formatString('This was submitted on %s',today);
  var shts=ss.getSheets();
  for(var i=0;i<shts.length;i++) {
    var sh=shts[i];
    var name=sh.getName();
    if(exclA.indexOf(name)==-1) {
      sh.showSheet();
      for(var j=0;j<shts.length;j++) {
        if(shts[j].getName()!=name) {
          shts[j].hideSheet();
        }
      }
      SpreadsheetApp.flush();//this may not be necessary...not sure
      var file=fldr.createFile(ss.getBlob().getAs('application/pdf')).setName(Utilities.formatString('%s_%s_%s_timesheet_notes.pdf', name,agency,today));
      fA.push(file);
    }
  }
  GmailApp.sendEmail(email,subject,body, {attachments:fA});
  for(var i=0;i<fA.length;i++) {
    fA[i].setTrashed(true); 
  }
  for(var i=0;i<shts.length;i++) {
    if(exclA.indexOf(shts[i].getName())==-1) {
      shts[i].showSheet();
    }
  }
}

添加整个电子表格的 PDF(排除的隐藏工作表除外):

function emailGoogleSpreadsheetAsPDF() {
  var email="email@gmail.com";
  var exclA=['TimeSheet'];//and others
  var ss=SpreadsheetApp.getActive();
  var name=ss.getRange("Timesheet!J6").getValue();//trimmed the range down to match the getValue();
  var agency=ss.getRange("Timesheet!B4").getValue();//same here
  var fldr=DriveApp.getFolderById('folderId');
  var fA=[];
  var today=Utilities.formatDate(new Date(),Session.getScriptTimeZone(),"MM/dd/yyyy");
  var subject=Utilities.formatString('%s has Submitted Their Timesheet and Notes',name); 
  var body=Utilities.formatString('This was submitted on %s',today);
  var shts=ss.getSheets();
  for(var i=0;i<shts.length;i++) {
    var sh=shts[i];
    var name=sh.getName();
    if(exclA.indexOf(name)==-1) {
      sh.showSheet();
      for(var j=0;j<shts.length;j++) {
        if(shts[j].getName()!=name) {
          shts[j].hideSheet();
        }
      }
      SpreadsheetApp.flush();//this may not be necessary...not sure
      var file=fldr.createFile(ss.getBlob().getAs('application/pdf')).setName(Utilities.formatString('%s_%s_%s_timesheet_notes.pdf', name,agency,today));
      fA.push(file);
    }
  }
  for(var i=0;i<shts.length;i++) {
    if(exclA.indexOf(shts[i].getName())==-1) {
      shts[i].showSheet();
    }
  }
  SpreadsheetApp.flush();//this may not be necessary...not sure
  var file=fldr.createFile(ss.getBlob().getAs('application/pdf')).setName(Utilities.formatString('%s.pdf',ss.getName()));
  fA.push(file)
  GmailApp.sendEmail(email,subject,body, {attachments:fA});
  for(var i=0;i<fA.length;i++) {
    fA[i].setTrashed(true); 
  }
}

【讨论】:

  • 哇,感谢您对这个问题的关注,我今晚回家后会测试它。而且你的代码中可能有一些奇怪的东西,我不是开发人员,所以它是我在网上找到并拼接在一起的一堆代码。再次感谢!
  • 所以到目前为止它运行良好,它以个人身份向我发送所有 PDF。有两个小问题我认为不会很难解决。第一个是当它循环浏览所有的工作表时,它会隐藏其他的工作表。最后,显示最后一张纸,其余部分隐藏。我需要它仍然显示所有正在显示的工作表。第二个问题是“时间表”表和两个隐藏表,用于数据和设置,包含在电子邮件中。好消息是我需要排除的所有工作表都有固定的名称。那么是否可以添加一些额外的代码来按名称排除工作表?
  • 效果很好!非常感谢。我做的最后一件事是我将我的一些原始代码将整个电子表格捆绑到一个 PDF 中并将其添加到您的文件中(我需要发送捆绑包和单个 PDF)。这就是我添加的内容:var ssa = SpreadsheetApp.getActiveSpreadsheet(); var blob = DriveApp.getFileById(ssa.getId()).getAs("application/pdf"); blob.setName('name of file'); 然后我将 {attachments:fA} 更改为 {attachments:[fA, blob]} 但得到 Invalid argument: attachments 错误。如何在我的电子邮件中发送这两个附件?
  • 问题在于附件被描述为文件数组而不是 blob。我认为只显示除排除项之外的所有表格并推动 fA 应该可以解决问题。
  • 哦,这是一种更好的方法。这一切都很好!非常感谢您的帮助,也感谢您优化我的原始代码。我从中学到了很多东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多