代码之家  ›  专栏  ›  技术社区  ›  BBGoober

使用两列创建一个电子邮件列表,每个人收到一封电子邮件

  •  -1
  • BBGoober  · 技术社区  · 8 年前

    我有一个格式化的电子表格,其中a栏是名称,B栏是电子邮件,C栏是事件。

    电子表格看起来像这样

       A            B             C
    person1  person1@gmail.com  party1
    person2  person2@gmail.com  party1
    person1  person1@gmail.com  party2
    

    使用谷歌应用程序脚本:

    创建邮件列表的最佳方式是什么,这样每个人只能收到一封电子邮件,并允许我在同一封电子邮件中提及他们参加过的所有活动?

    My current attempt is:
    function sendEmails() {
    SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
    var sheet = SpreadsheetApp.getActiveSheet();
    var startRow = 3;  // First row of data to process
    var numRows = sheet.getLastRow()-1;;   // Number of rows to process
    
    // Fetch the range of cells A2:B3
    var dataRange = sheet.getRange(startRow, 1, numRows, 5)
    var data = dataRange.getValues();
    for (i in data) {
      var row = data[i];
      var name = row[0];  // First column
      var department = row[1];       // Second column
      var emailAddress = row[2];
      var workshop = row[3];
      var date = row[4];
    
      MailApp.sendEmail(emailAddress, "Test Email" , message);
      }
    }
    

    这将向每个人发送一封电子邮件,但是如果个人被添加到多个事件中,他们将收到多封电子邮件。

    对需要进一步研究的主题有什么想法或建议?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Jeremy Kahan    8 年前

    我的目标是在电子表格中为每封电子邮件创建一次所需的事件列表。一旦有了这个列表,编写电子邮件脚本就会运行到事件列,在那里找到一个列表,然后返回给谁发送电子邮件。 我按电子邮件排序,所以事情通过电子邮件聚在一起(我们被告知不要担心多人使用同一封电子邮件,所以也不需要按此排序)。 我试着把答案分成几个部分,这样它就不会完全无法理解,这样我就可以测试各个部分。 第一步是将标题行添加到工作表中,这样首先我就不需要特殊情况来说明第一封电子邮件是新的。我也描述了这些。

    name    email   event   new email?  num events for this email   event range text
    

    A列至C列如所示。 D列,new email,指出这是否是此电子邮件的第一次出现,因为事情已排序,这相当于检查上面的行是否不同。我用的公式是

    =not((indirect("B"&Row()-1))=(indirect("B"&Row())))
    

    我需要电子邮件出现的次数来生成电子邮件的范围,因此我计算为:

    =countif(B:B,"="&B2)
    

    然后,对于出现特定电子邮件的第一行,我通过将此计数添加到当前行并减去1来计算范围。这是由以下人员完成的:

    =if(indirect("d"&row()),"C"&Row()&":C"& (row()+indirect("e"&row())-1),"")
    

    (从F栏往下一直都是一样的。最后在G栏,我把范围内每个项目的文本放在一起,同样只放在给定电子邮件的W第一行。公式是:

    =if(indirect("d"&row()),textjoin(", ",true,indirect(indirect("f"&row()))),"")
    

    哪里 indirect("d"&row())

    相反,可以将大部分或全部逻辑构建到函数中。

    现在我有一个例子可以在 https://docs.google.com/spreadsheets/d/1IxrkwlALO6MnyLA8Zs5LqUIMd-ePqZACNN92sDnuCnU/edit#gid=0 虽然我不能保证永远把它放在那里。