如何 select 特定 google sheet 并附加为 PDF 以使用 MailApp 发送电子邮件

How to select a specific google sheet and attach as a PDF for sending email using MailApp

我正尝试从传播sheet中select一个特定的sheet并在发送给收件人之前将其作为PDF附加到电子邮件中。

现在,下面的代码可以工作,但它是一种使用 for 循环和 if-else 来消除报告中所有其他不需要的 sheet 的变通方法。此代码还会关闭我的活动 sheet 并重新打开

我的主要问题是在附件中获取特定的 sheet,这样我就不必使用 for 循环

非常感谢任何帮助! :)

function sendReport() {

    var sheetName="Report";
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheets = ss.getSheets();

    for (var i = 0; i < sheets.length; i++) 
    if (sheets[i].getSheetName() !== sheetName) {
      sheets[i].showSheet();
    }

  var message = {
    to: "example@gmail.com",
    subject: "ICT Online Helpdesk Report",
    body: "Hi team,\n\nPlease find the monthly report attached.\n\nThank you,\nBob",
    name: "ICT Helpdesk", 
    attachments: [ ss.getAs(MimeType.PDF).setName("Monthly Ticket report")],
  }
 
   MailApp.sendEmail(message);

   for (var i = 15; i < sheets.length; i++) {
    sheets[i].showSheet()
  }

}

我不明白你为什么说:“下面的代码有效”。它以 PDF 格式发送所有 sheet。

如果您只需要发送一个 sheet,您必须将 sheet 复制到一个新的 Spreadsheet 中并发送新的 Spreadsheet.

可能您需要这样的东西:

function sendReport() {

  var ss = SpreadsheetApp.getActiveSpreadsheet(); // current spreadsheet
  var sheet = ss.getSheetByName('Report'); // get the sheet 'Report'

  var new_ss = SpreadsheetApp.create('Monthly Ticket report'); // create a new spreadsheet
  sheet.copyTo(new_ss); // copy the 'Report' to the new spreadsheet
  new_ss.deleteSheet(new_ss.getSheets()[0]); // remove the empty first sheet

  var message = {
    to: "example@mail.com",
    subject: "ICT Online Helpdesk Report",
    body: "Hi team,\n\nPlease find the monthly report attached.\n\nThank you,\nBob",
    name: "ICT Helpdesk", 
    attachments: [ new_ss.getAs(MimeType.PDF)] // send the new spreadsheet as PDF
  }
  MailApp.sendEmail(message);

  DriveApp.getFileById(new_ss.getId()).setTrashed(true); // delete the new spreadsheet

}

如果您在复制的 sheet 上有图表和单元格引用,则在发送之前需要另一种算法。

您必须复制整个传播sheet(不仅仅是一个sheet),将sheet 'Report'上的所有引用转换为纯文本并删除sheet 的其余部分。

代码如下:

function sendReport() {

  var ss = SpreadsheetApp.getActiveSpreadsheet(); // current spreadsheet
  
  var file = DriveApp.getFileById(ss.getId()).makeCopy(); // copy of current spreadsheet
  file.setName('Monthly Ticket report'); // rename the copy
  var new_ss = SpreadsheetApp.openById(file.getId()); // open the copy

  // convert all references into a plain text
  var range = new_ss.getSheetByName('Report').getDataRange();
  range.setValues(range.getDisplayValues());
  
  // get all sheets but 'Report'
  var sheets_to_remove = new_ss.getSheets().filter(x => x.getName() != 'Report');
  sheets_to_remove.forEach(x => new_ss.deleteSheet(x)); // remove them
  
  var message = {
    to: "example@gmail.com",
    subject: "ICT Online Helpdesk Report",
    body: "Hi team,\n\nPlease find the monthly report attached.\n\nThank you,\nBob",
    name: "ICT Helpdesk", 
    attachments: [ new_ss.getAs(MimeType.PDF)] // send the new spreadsheet as PDF
  }
  MailApp.sendEmail(message);

  DriveApp.getFileById(new_ss.getId()).setTrashed(true); // delete the new spreadsheet

}