在Google App脚本的每一行中发送带有附件的邮件

时间:2019-11-05 11:24:28

标签: google-apps-script

我在每个单元格中使用附件自动发送邮件。

注意:

列0:名字列4:电子邮件地址列5:年份列6:文件附件。

var EMAIL_SENT = 'EMAIL_SENT';

//Sends non-duplicate emails with data from the current spreadsheet.
function autosendEmails() { 
  var ws = SpreadsheetApp.openById('Your Sheet Id'); 
  var sheet= ws.getSheetByName('Mail Merge'); 
  var startRow = 2; // First row of data to process 
  var numRows = ws.getLastRow(); // Number of rows to process // Fetch the range of cells E2:H3 
  var dataRange = sheet.getRange(startRow, 1, numRows, 7);

  // Fetch values for each row in the Range. 
  var data = dataRange.getValues();

  // var FileID = DriveApp.getFileById('Your File Id')
  for (var i = 0; i < data.length; i++) { 
    var row = data[i]; var emailAddress = row[4]; // First column
    var Subjectmail ="Test mail"
    var bodyemail = "Dear" 
    var pdfname = row[6]; 
    var emailSent = row[7]; // Four column 
    if (emailSent !== EMAIL_SENT) { 
      // Prevents sending duplicates 
      var subject = 'Test mail'; 
      MailApp.sendEmail(emailAddress, Subjectmail, bodyemail, {attachments: pdfname}); 
      sheet.getRange(startRow + i, 8).setValue(EMAIL_SENT); // Make sure the cell is updated right away in case the script is interrupted SpreadsheetApp.flush();
    } 
  } 
}

3 个答案:

答案 0 :(得分:1)

这是我通常使用的示例

function SendMailFC() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  
  var message ="HELLO" 
  for (var i = 2; i <= 3; i++) {
    var row = values[i];
    var mail = row[7];
    var name = row[4].substring(0,row[4].indexOf(" ",row[4].indexOf(" ")+1));
    var company = row[1].substring(0,row[1].indexOf(","));
    
    var Greeting = 'Hello ' + name+',<br><br>';
    var stat = row[10];
    
    var subject = "SUBJECT";
    if(stat){
      GmailApp.sendEmail(FROM, subject, "", {htmlBody: '<html>'+greeting+message+'</html>'} );
    }
  }

答案 1 :(得分:0)

这可能对您更好:

阅读注释以进行解释。

function autosendEmails() { 
  var ws = SpreadsheetApp.openById('Your Sheet Id'); 
  var sheet= ws.getSheetByName('Mail Merge'); 
  var startRow = 2; // First row of data to process 
  var dataRange = sheet.getRange(startRow, 1, sheet.getLastRow()-1,sheet.getLastColumn());//you were missing your last column and you were grabbing an empty row and the end of your list because the third parameter is the number of rows in the data not the number of rows in the sheet.
  var data=dataRange.getValues();
  for (var i=0;i<data.length;i++) { 
    var row=data[i]; 
    var emailAddress = row[4]; // First column
    var Subjectmail ="Test mail"
    var bodyemail = "Dear" 
    var pdfname = row[6]; 
    var emailSent = row[7]; // Four column 
    if (emailSent !== "EMAIL_SENT") { 
      MailApp.sendEmail(emailAddress, Subjectmail, bodyemail, {attachments: ["an array of files"]});//attachments should be an array of files not an array of filenames 
      sheet.getRange(startRow + i, 8).setValue(EMAIL_SENT); 
    } 
  } 
}

答案 2 :(得分:0)

考虑到您要从var pdfname = row[6];检索文件名,然后将文件附加到邮件并发送,必须执行的操作是从驱动器中检索实际文件并将其放入数组,就像我在此示例中所做的那样:

// Inside your function, just change this line 
function autosendEmails() { 
...
MailApp.sendEmail(emailAddress, Subjectmail, bodyemail, {
        attachments: buildAttachment(pdfname) // Call this function to be able to send an attachment file 
      }); 
...
}

// Add this function to your code
function buildAttachment(pdfname){
  // Initialize the array
  var fileArr = [];
  // Get the file form your drive
  var getMyFile = DriveApp.getFilesByName(pdfname).next();
  // build an array
  fileArr.push(getMyFile);
  // return the file within an array
  return fileArr;
}

参考

This post也可以为您提供帮助。

文档