有没有办法在循环浏览邮件列表时从 google 工作表向多个用户发送多封电子邮件?

Is there a way to send multiple emails to multiple users from google sheets while looping through a list of messages?

嘿,这是我在 Whosebug 上的第一个问题。 我已经为这段代码苦苦挣扎了两天,并试图上下移动循环,但什么也没发生。该代码没有显示任何错误,但我没有收到邮件。 我想要做的是向多个用户 (sheet: Sheet1) 发送多条消息 (sheet: buysignals)。似乎每个人都将每封电子邮件作为唯一的收件人。 f.ex。如果 Buysignals sheet 中有文本,您会收到一封新邮件。 这里有人可以帮我解决吗?

function sendBuySignal() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Buysignals");
const dataRange = sheet.getRange("A2:R17");
const data = dataRange.getValues();

  
  data.forEach(function (rowData) {
    const ticker = rowData[0];
    
    // Stock info
    const kurtosis = rowData[1];
    const sigma = rowData[2];
    const mCap = rowData[17];
    const std = rowData[4];
    const timeStamp = rowData[6];
    const buyPrice = rowData[8];
    const buyIndicator = rowData[16];
    
    
    // Send Signal Mail
    if (buyIndicator > 0) {
      const greeting = 'The stock ' + ticker + ',\n'
      const buyMessage = 'Is at ' + timeStamp + ' in the buy zone at ' + buyPrice + '. With a kurtosis of ' + kurtosis + ', sigma ' + sigma + ', mcap in bill ' + mCap + '.';
      const greatJobMessage = 'Hurry up! Go buy it :)';
      
      const message = [greeting, buyMessage, greatJobMessage].join('\n');
      const subject = 'Test: New Buy ' + ticker;
      
      // Fetch the email address
      const emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
      const n=emailRange.getLastRow();
      for (var i = 2; i > n+1 ; i++ ) {
        const emailAddress = emailRange.getRange(i,1).getValue();   
      }
      MailApp.sendEmail(emailAddress, subject, message);
    }
      return

      })

}

问题与循环有关

  1. 语法for (var i = 2; i > n+1 ; i++ ) { 无法工作
  • 假设最后一行大于起始行(即大于 2),条件 i > n+1 永远不会满足,因此您不会进入循环 - 相反您应该指定 i < n
  • 它是 n 而不是 n+1 因为你从第二行开始而不是第一行 (i = 2)
  1. MailApp.sendEmail(emailAddress, subject, message); 位于 for 循环之外
  • 这意味着在每个循环中该函数都会覆盖 emailAddress 并且在退出循环后您将发送一封电子邮件 - 到最后保存的电子邮件地址
  • 这个问题可以通过在 for 循环中插入 MailApp.sendEmail(emailAddress, subject, message); 来解决

样本:

function sendBuySignal() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Buysignals");
  const dataRange = sheet.getRange("A2:R17");
  const data = dataRange.getValues();
  var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var n = sheet1.getLastRow();
  const emails = sheet1.getRange("A2:A" + n).getValues();
  
  data.forEach(function (rowData) {
    const ticker = rowData[0];
    
    // Stock info
    const kurtosis = rowData[1];
    const sigma = rowData[2];
    const mCap = rowData[17];
    const std = rowData[4];
    const timeStamp = rowData[6];
    const buyPrice = rowData[8];
    const buyIndicator = rowData[16];
    
    // Send Signal Mail
    if (buyIndicator > 0) {
      Logger.log("buyIndicator > 0");
      const greeting = 'The stock ' + ticker + ',\n'
      const buyMessage = 'Is at ' + timeStamp + ' in the buy zone at ' + buyPrice + '. With a kurtosis of ' + kurtosis + ', sigma ' + sigma + ', mcap in bill ' + mCap + '.';
      const greatJobMessage = 'Hurry up! Go buy it :)';
      
      const message = [greeting, buyMessage, greatJobMessage].join('\n');
      const subject = 'Test: New Buy ' + ticker;
      
      // Fetch the email address
      for (var i = 0; i < emails.length ; i++ ) {
        var emailAddress = emails[i][0];
        Logger.log("email: " + emailAddress);  
        MailApp.sendEmail(emailAddress, subject, message);
      }        
    }       
  })  
}

请注意,对于此示例,我允许自己在进入循环之前检索所有电子邮件。这比在每个循环迭代中多次调用 getRange()more efficient