【问题标题】:Consolidating multiple list entries into one email (where a row associates content with email address)将多个列表条目合并到一封电子邮件中(其中一行将内容与电子邮件地址相关联)
【发布时间】:2018-04-30 13:28:04
【问题描述】:

我的 google 表格系统会读取实时列表,并向指定行中的内容负责人发送自动电子邮件。

此列表包括日期、描述和受让人的电子邮件等变量。该列表逐行运行,因此由于我使用的代码,一个人可能会收到分配给他们的每一行的多封电子邮件。

我想更改代码,以便它编译列表中的类似电子邮件地址,并将每一行的内容发送到单个电子邮件中(理想情况下为表格格式)。我怎样才能做到这一点?

我目前使用的脚本如下:

function AssignmentEmail() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Assignments");
  var range = sheet.getRange("A3:G950");
  var info = range.getValues();
  for (i in info) {
    var col = info[i];
    var date = Utilities.formatDate(col[0], "PST", "YYYY-MMM-dd");
    var observation = col[1];
    var lab = col[2];
    var contact = col[3];
    var action = col[4];
    var email = col[6];
    if (email="distribution list address") {
      MailApp.sendEmail(email, "*Text and variables for group*");
    }
    else if (email!="") {
      MailApp.sendEmail(email,"*Text and variables for individual*");
    }
  }
}

感谢您的帮助!

【问题讨论】:

    标签: google-apps-script google-sheets google-apps email


    【解决方案1】:

    您可以使用电子邮件地址作为键将每一行推送到 dictionary 中的数组。您将使用 JavaScript object 来执行此操作。字典将以key:value 对的形式存储您的数据,电子邮件地址为keyvalues 数组,用于存储您要发送到该地址的数据。你最终会得到一个看起来有点像这样的字典:

    {"email.address@domain.tld": [['data row 1', 1, 'foo'],
                                  ['data row 2', 2, 'bar']
                                 ],
     "another.email@domain.tld": [['only one data row', 0, 'baz']],
     "group.email@domain.tld":   [['1st of many', 10, 'lorem'],
                                  ['2nd row', 20, 'ipsum'],
                                  ['3rd row', 30, 'dolor'],
                                  ['Nth row', 100, 'si amet']
                                 ]
    }
    

    因此,您从数据行中提取电子邮件地址并在字典的键中查找该电子邮件:

    • 如果电子邮件存在,则将新的数据行推送到 在那把钥匙上;
    • 如果没有,则创建一个新数组,电子邮件地址为 他们将数据行作为第一个元素。

    一旦字典被填充,您就可以使用for(var key in dictionary){} 构造遍历键。您可以以dictionary.keydictionary[key] 的形式访问每个键下的值。它只是一个带有名称而不是索引的数字的数组! (实际上不是,但类比就足够了。)因此,您可以以dictionary[key][0](或dictionary.key[0])的形式访问给定键下数组的第一个元素。 而且您仍然可以使用key 中的值(在您的情况下是电子邮件地址),因此您可以写Logger.log("key = %s, values = %s", key, dictionary[key])

    代码如下所示:

    /*...connect to your data source as above...*/
    var info = range.getValues();
    /* Create an empty JS Object to provide our dictionary.
     *+ we'll add each email address as a dict key as we see it.
     *+ each key will point to an array which will be the data 
     *+ to be entered into each email to the recipient address (the key) */
    var email_data_store = {}; 
    for (i in info) {
      var col = info[i];
    /*...variable assignments as above...*/
      var email = col[6];
      if(email != ""){
        if(!(email in email_data_store)){ // Does a key matching this email already exist?
          // if not, create it:
          email_data_store[email] = [];
          // so now we have an empty array under the key `email`
        }
        email_data_store[email].push(/* an array of your values */);
      }
    }
    
    // now iterate over the dict to format the emails & send
    for(var email in email_data_store){
      /* in here, iterate over the 2D arrays in email_data_store[email]
       *+ You can use array notation to address all items, 
       *+ so that you don't have the potential confusion of 
       *+ mixing array & object notation */
      for(var i = 0, lim = email_data_store[email].length; i < lim; ++i){
        /* format your data here */
      }
      MailApp.sendEmail(email, /* your formatted email body */);
    }
    /* whatever cleanup you want to do before ending your function */
    

    更多文档:MDN on JS Objects

    【讨论】:

    • 嗨,Dean,非常感谢您提供这个答案。你能为我澄清一些事情吗?这种方法是否需要我手动提供可以通过此功能输入的所有电子邮件地址的字典? “email_data_store[email].push(/* 你的值的数组 */);”还是它在运行时将电子邮件收集到字典中?作为一个侧面的想法,您如何看待将电子邮件注册到数组/字典中的函数,然后当范围内的新注册电子邮件 == 与以前的任何电子邮件相同时增加变量的计数(++)那些?
    • @AdamG - 我添加了更多解释和一些文档链接来解决您的问题。简而言之:代码通过根据需要创建字典键来动态创建字典。通过将数据存储在键下的数组中,您可以进行所需的表格格式设置。我认为不需要创建单独的地址字典:您可以通过查询email_data_store[email].length 来获取每个电子邮件地址的数据行数
    猜你喜欢
    • 2013-07-29
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    相关资源
    最近更新 更多