Google 将个人进度报告通过电子邮件发送给学生的脚本

Google Script to email individual progress reports to students

我在一所高中工作,我想编写一个脚本,将个人进度报告通过电子邮件发送给大约 1400 名学生。我可以将它们以 .pdf 格式保存在我的 Google 驱动器上的一个文件夹中,然后通过电子邮件 (Gmail) 将它们发送给我们所有的学生。我想用学号作为唯一标识。

我不是程序员,只是需要有关如何完成这项工作的指导。任何帮助表示赞赏。我正在搜索该网站,发现了一些通过电子邮件发送附件的脚本,但我找不到任何可以通过电子邮件将特定文件发送给特定个人的脚本;比如个性化的进度报告。

谢谢。

我找到了这段代码并尝试对其进行修改以满足我的需要,但它没有发送任何电子邮件。我有一个包含两列的 Google Sheet:文件名、电子邮件地址和三行数据。我也有相应的文件保存在我的驱动器上。

function sendEmailsTest2() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;
var numRows = 3;
var dataRange = sheet.getRange(startRow, 1, numRows, 2)
var data = dataRange.getValues();
for (i in data) {
    var row = data[i];
    var intakenumber = row[0];
    var emailaddress = row[1];
}
  
var files = DriveApp.getFilesByName(intakenumber);
var attachments = [];
while (files.hasNext()) {
var file = files.next();
attachments.push(file.getAs(MimeType.PDF));
Logger.log(attachments)
var message = "Hello. Your Progress Report is attached";
var subject = "Progress Report";
var attachment = (attachments);
    MailApp.sendEmail({
        to: emailaddress,
        subject: subject,
        htmlBody: message,
        attachments: attachments
        })
}

}`

试试下面的代码:

function generatePdf() {
  SpreadsheetApp.flush();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var data = ss.getRange('A1:B').getValues();
  var parents = DriveApp.getFileById(ss.getId()).getParents();
  // Get folder containing spreadsheet and PDF
  if (parents.hasNext()) {
    var folder = parents.next();
  } else {
    folder = DriveApp.getRootFolder();
  }
  for (i = 0; i < data.length; i++) {
    var pdfName = data[i][0] + '.pdf';
    var email = data[i][1];
    // Subject of email message
    const subject = `Progress Report Attachement: ${pdfName}`;
    // Email Body can  be HTML too with your logo image
    const body = "<p>Hello,</p><p>Your Progress Report is attached";
    var files = folder.getFilesByName(pdfName);
    if (files.hasNext()) {
      if (MailApp.getRemainingDailyQuota() > 0)
        GmailApp.sendEmail(email, subject, body, {
          htmlBody: body,
          attachments: [files.next().getAs(MimeType.PDF)]
        });
    };
  };

  sourceSpreadsheet.toast("Reports Emailed ", "Success");

}

我希望您现在可以通过电子邮件发送存储电子表格和 PDF 的驱动器文件夹中的所有 PDF。

您在循环中声明了 emailaddressintakenumber,但您在循环之后使用了它们。因此,它最多会发送一封电子邮件,对应于范围中的最后一行。

因此,代码应该是这样的:

function sendEmailsTest2() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;
  var numRows = sheet.getLastRow() - startRow + 1;
  var dataRange = sheet.getRange(startRow, 1, numRows, 2);
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; i++) {
    var row = data[i];
    var intakenumber = row[0];
    var emailaddress = row[1];
    var files = DriveApp.getFilesByName(intakenumber); // Might have to be changed to: var files = DriveApp.getFilesByName(intakenumber + ".pdf");
    var attachments = [];    
    while (files.hasNext()) {
      var file = files.next();
      attachments.push(file.getAs(MimeType.PDF));
      var message = "Hello. Your Progress Report is attached";
      var subject = "Progress Report";
      MailApp.sendEmail({
        to: emailaddress,
        subject: subject,
        htmlBody: message,
        attachments: attachments
      });
    }
  }
}

重要:

此外,确保 A 列包含有效的文件名,包括扩展名,如果它们存在(例如,如果 .PDF,单元格值应该是 file_name.pdf)。否则,getFilesByName.

将找不到该文件

或者将相应的行编辑为 var files = DriveApp.getFilesByName(intakenumber + ".pdf");

我认为这可能是您之前没有收到任何电子邮件的原因。