如何仅向谷歌表格中选定的电子邮件发送电子邮件?

时间:2021-05-09 19:49:26

标签: google-apps-script google-sheets

刚接触谷歌脚本,我有一个谷歌脚本,工作表上有一个按钮,可以从谷歌工作表发送电子邮件,它工作正常。

但是我想将电子邮件发送到我手动选中的那些电子邮件,我有一列 (F) 带有选中标记,所以我想选中电子邮件,然后将电子邮件发送到那些只被选中的电子邮件。

我一直在完成复选标记部分的编码,感谢您的帮助。 我已经注释掉了用于过滤复选标记的 2 行代码。

发送电子邮件报价的代码检查以及每次发送电子邮件时写入时间戳和电子邮件发送注释。

谢谢。

这些是列,一个标题: A1:时间戳 B1:电子邮件地址 C1:姓名 D1:电子邮件已发送? E1:数据电子邮件发送 F1:复选框

function sendEmails(){           
var sheet = SpreadsheetApp.openById("mySheetid");
var ss = sheet.getSheetByName("Emails");  
var lr = ss.getLastRow();

var EMAIL_SENT = 'Email has been sent';
var messageSubject = 
 SpreadsheetApp.getActiveSpreadsheet().getSheetByName("BodyTextSheet").getRange(2, 1).getValue();
var messageText = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SubjectSheet").getRange(2, 2).getValue();
 
var quotaLeft = MailApp.getRemainingDailyQuota();
            if ((lr-1) > quotaLeft){
Browser.msgBox("you have " + quotaLeft + "left and you're trying to send " + (lr-1) + "emails. Emails were not sent.");
} else{
        for (var i = 2; i<=lr; i++){
        var currentEmail = ss.getRange(i, 2).getValue();
        var currentName = ss.getRange(i, 3).getValue();
        var messageBody = messageText.replace("{name}",currentName);
          

       //var selected = ss.getRange("F2:F" + ss.getLastRow()).getValues();
       //data = selected.filter(function(r){ return r[6] == true});     
          
       MailApp.sendEmail(currentEmail, messageSubject, messageBody); 
          
       var EmailSent  = ss.getRange(i, 4).setValue(EMAIL_SENT);
       var TimeEmailSent = ss.getRange(i, 5).setValue(new Date());
       SpreadsheetApp.flush();   
            
       }
      }
    }

1 个答案:

答案 0 :(得分:0)

当我测试它时,这解决了。在您的代码中,您有带有 var: messageSubject 和 viseversa 的 BodyTextSheet ......这有点令人困惑。因此,您需要更改此代码中的这些范围。

function sendEmails() {
  const ss = SpreadsheetApp.openById("mySheetid");
  const emailSheet = ss.getSheetByName("Emails");
  const bodyText = ss.getSheetByName("BodyTextSheet").getRange(2, 1).getValue()
  const subjectText = ss.getSheetByName("SubjectSheet").getRange(2, 2).getValue()
  const emails = emailSheet.getDataRange().getValues();

  const filterdRows = [];

  for (i = 0; i < emails.length; i++) {
    const row = emails[i]
    if (row[5] == true) {
      row.unshift(i+1)
      filterdRows.push(row)
    }
  }

  const quotaLeft = MailApp.getRemainingDailyQuota();

  if (filterdRows.length > quotaLeft) {
    Browser.msgBox(`you have ${quotaLeft} left and you're trying to send ${filterdRows.length} emails. Emails were not sent.`);
  } else {
      filterdRows.forEach(email => {
        const messageBody = bodyText.replace("{name}", email[3]);
        MailApp.sendEmail(email[2], subjectText, messageBody);
        emailSheet.getRange(email[0], 4, 1, 2).setValues([['Email has been sent', new Date()]])
      })
      SpreadsheetApp.flush();
  }
}

所以我做了一些修改:

  • const emails:一次获取所有电子邮件(更快)
  • 循环遍历数据并检查 F 列(数组索引为 0,因此第 5 列)是否为真
  • 如果为真,则将 i+1 (rownumber) 添加到数组的开头
  • 然后 forEach filtertEmail 发送邮件并在右行中设置设置文本和日期(在一次调用中)这就是我在开头推送行号的原因。