【问题标题】:I have to send emails taking data from some columns. If the email is repeated I would like to send only one email with the values from the other cells我必须发送电子邮件从某些列中获取数据。如果电子邮件重复,我只想发送一封电子邮件,其中包含其他单元格中的值
【发布时间】:2023-03-18 22:08:01
【问题描述】:

注意:我正在为我的脚本使用 Google Apps 脚本。

我有 A、B 和 C 列,其中包含要从 D 列(逐行)发送到电子邮件的数据。我已经按字母顺序对列表进行了排序,其中一些地址是重复的。

现在我的代码为 D 列中的每个地址发送一封电子邮件,但这意味着如果该值重复,此人将收到多封电子邮件。

如果记录重复,我如何只发送一条消息,其中包含 A、B 和 C 列中的相应值?

名字   姓氏      用户电子邮件             经理电子邮件

姓名 1      姓氏 1     user1@domain.com    manager1@domain.com

姓名 2      姓氏 2     user2@domain.com  ma​​nager2@domain.com

姓名 3     姓氏 3     user3@domain.com  ma​​nager2@domain.com

姓名 4      姓氏 4     user4@domain.com  ma​​nager2@domain.com

姓名 5      姓氏 5     user5@domain.com    manager3@domain.com

上表显示 ma​​nager2@domain.com 在列表中重复了 3 次。我想避免向同一个经理发送多封电子邮件,而只发送一封包含其他列值的消息。

例如

收件人:manager2@domain.com
主题:报告

----------------------------------- ---

早安,

以下人...

姓名 2 姓氏 2 和电子邮件 user2@domain.com

姓名 3 姓氏 3 和电子邮件 user3@domain.com

姓名 4 姓氏 4 与电子邮件 user4@domain.com

...

----------------------------------- ---

谢谢

 

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: google-apps-script


【解决方案1】:

试试这个:

我发现使用对象是对信息进行分组的好方法。

function concatColumn() {
  var mgrcol=4;
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var mgrA=[];
  var html='';
  for(var i=1;i<vA.length;i++) {
    if(mgrA.indexOf(vA[i][3])==-1) {
      mgrA.push(vA[i][3]); 
    }
  }
  var mgrObj={}
  for(var i=0;i<mgrA.length;i++) {
    for(var j=0;j<vA.length;j++) {
      if(mgrA[i]==vA[j][3]){
        if(mgrObj.hasOwnProperty(mgrA[i])) {
          mgrObj[mgrA[i]]+=Utilities.formatString('~~~FirstName: %s<br />LastName: %s<br />UserEmail: %s',vA[j][0],vA[j][1],vA[j][2]);
        }else{
          mgrObj[mgrA[i]]=Utilities.formatString('FirstName: %s<br />LastName: %s<br />UserEmail: %s',vA[j][0],vA[j][1],vA[j][2]);
        }                                               
      } 
    }
  }
  for(var i=0;i<mgrA.length;i++) {
    var tA=mgrObj[mgrA[i]].split('~~~');
    var s='User Information<br /></br />';
    for(var j=0;j<tA.length;j++) {
      s+=tA[j].toString() + '<br />'; 
    }
    s+='<hr widht="100" />';
    GmailApp.sendEmail(mgrA[i], 'User Names and Emails', null, {htmlBody:s})
    //html+=Utilities.formatString('Email Recipient: <strong>%s</strong><br />',mgrA[i]) + s;//debug 
  }
  //var ui=HtmlService.createHtmlOutput(html);//debug
  //SpreadsheetApp.getUi().showModelessDialog(ui, 'Emails');//debug
}

最后几行注释掉的行用于创建电子邮件的副本以显示在对话框中以调试脚本。

【讨论】:

  • 嗨@Cooper,我正在尝试解决我的问题,但我只能通过考虑两列(itemCode 和版本)中的数据来获取标识符键。在这里,我们有电子邮件地址。我将如何将这两列视为标识符键?感谢一百万 - 再一次!
  • 如果我理解您的问题,我想我会使用电子邮件作为标识符,并且我会将每行所需的所有信息作为对象放入数组中。
  • 为什么我有一个类型错误:无法读取未定义的属性“拆分”? if(productObj.hasOwnProperty(productList[i])) { productObj[productList[i]]+=Utilities.formatString('~~~%s%s%s',values[j][0],values[j] [2],值[j][18]); }else{ productObj[productList[i]]=Utilities.formatString('%s%s%s',values[j][0],values[j][2],values[j][18]); } } } } for(var i=0;i
  • 如果您想要一个工具来帮助您复制和编辑 CSV 数据,您可以轻松地将其发布到您的 SO 问题中。这是一个链接:sites.google.com/view/googlappsscript/so-utilities/csv-utility。给我一些数据,我看看。
  • 没有。那是行不通的。我认为您必须收集 mgrObj 中的行号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多