首页 > 解决方案 > 我正在尝试使用脚本将 Google Drive 附件发送到不同的电子邮件地址,但努力使其工作

问题描述

我是编码新手,想自动发送带附件的电子邮件。基本上我想做的是将消息和 Google Drive 附件发送到我的电子表格中的特定电子邮件地址。每个电子邮件地址的每个附件(谷歌驱动器链接)都不同,我将所有内容都放在电子表格中。

电子表格由三张表组成,我只想从第一张表中获取信息(称为完整数据)。列的结构如下:

我想发送一封带有以“Hello {Full Name}”开头的模板的电子邮件,并在下面的行中开始消息。

这是我现在拥有的代码:

// This constant is written in column C for rows for which an email
// has been sent successfully.
var EMAIL_SENT = 'EMAIL_SENT';

/**
 * Sends non-duplicate emails with data from the current spreadsheet.
 */
function sendEmails2() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var numRows = sheet.getLastRow() - startRow + 1; // Number of rows to process
  var startCol = 1;
  var numCols = 4; // Number of columns to process (should include column D)
// Fetch the range of cells A2:D
var dataRange = sheet.getRange(startRow, startCol, numRows, numCols);
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[3]; // Third column
    var message = row[7]; // Eigth column
    var emailSent = row[8]; // Ninth column
    if (emailSent !== EMAIL_SENT) { // Prevents sending duplicates
      var subject = 'Sending emails from a Spreadsheet';
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(startRow + i, 8).setValue(EMAIL_SENT);
      // Make sure the cell is updated right away in case the script is interrupted
      SpreadsheetApp.flush();
    }
  }
}

我意识到我没有为附件设置变量。附件应取自 E 列(对应于行)。例如,A2 中的 John Apple 在 E2 中具有附件 X,而 A3 中的 Mick Orange 在 E3 中具有附件 Y,依此类推……数据范围下降到 130 行,但如果有总是能得到的东西就好了直到有数据的范围(无论行数)。

有没有人知道如何进行这项工作?

非常感谢提前!!

标签: google-apps-scriptgoogle-sheets

解决方案


如果我理解正确,您当前的问题与您之前的问题不同之处在于:

  • 消息正文以“Hello {Full Name}”开头。
  • 您不是在寻找与工作表中名称相同的文件,而是在寻找具有特定 URL 的文件。
  • 从中获取数据的列不同。

考虑到所有这些,我重新设计了我在您之前的问题中提出的解决方案,以便它可以完成您现在假装的工作(阅读内联注释以了解代码在做什么,逐步进行):

var EMAIL_SENT = "EMAIL_SENT";

function sendEmails2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Full Data");
  var startRow = 2;  // First row of data to process
  var numRows = sheet.getLastRow() - startRow + 1; // Number of rows to process
  var startCol = 1;
  var numCols = 9; // Number of columns to process (should include column D)
  // Fetch the range of cells A2:D
  var dataRange = sheet.getRange(startRow, startCol, numRows, numCols);
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; i++) {
    var row = data[i];
    var emailAddress = row[3];
    var fullname = row[0];
    var messageBody = row[7];
    var message = "Hello ".concat(fullname, "\n", messageBody); // Creating message body
    var emailSent = row[8];
    var fileURL = row[4];
    var fileId = fileURL.match(/[-\w]{25,}/); // Extracts file id from file url
    if (emailSent != EMAIL_SENT) {  // Prevents sending duplicates
      var subject = "Sending emails from a Spreadsheet";
      var file = DriveApp.getFileById(fileId);
      MailApp.sendEmail(emailAddress, subject, message, {
        attachments: [file], // No need to use getAs if your file is already a PDF
        name: 'Custom email Team'
      });
      sheet.getRange(startRow + i, 9).setValue(EMAIL_SENT);
      // Make sure the cell is updated right away in case the script is interrupted
      SpreadsheetApp.flush();
    }
  }
}

DriveApp没有getFileByUrl方法,因此要获取文件,代码首先使用正则表达式从 url 中提取文件 id,然后调用getFileById

让我知道这是否适合你。


推荐阅读