【问题标题】:How to loop an onEdit function to send emails from multiple rows in Google Sheets?如何循环 onEdit 函数以从 Google 表格中的多行发送电子邮件?
【发布时间】:2019-10-25 07:02:57
【问题描述】:

我对此很陌生,我的工作有一个 Google 表格,其中包含我们来自 FB 的所有潜在客户信息,我正在尝试拥有一个功能 (onEdit),它将根据以下内容向潜在客户发送电子邮件一个单元格的数据。例如,当 A2 包含“Follow Up”时,它会向 D2 中的地址发送一封电子邮件,正文来自 J2(“Follow Up”数据验证的预设响应)。现在这适用于第 2 行,但是当在任何其他行中输入“跟进”时,它会向列表中的每一行发送一封电子邮件。例如,当触发 A29 中的事件时,它将 J 列中的正文文本发送到列表中的每封电子邮件。我试图让活动一次只发送一封电子邮件(基于活动单元会议验证要求)。

我已尽我所能查看此处的其他帖子,使用 for 循环将这段代码拼凑在一起,同时检查新行(新行不断添加到工作表中)。三个 if 语句可能很草率,但我不知道如何将其清理为一个单数 if 语句。我正在考虑添加一个列,说明电子邮件是否已经发送,并更新 for 循环或 if 语句以不向这些行发送电子邮件。

  var sheetname = "Prometheus";
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname);
  var ac = sheet.getActiveCell();
  var endRow = sheet.getLastRow();
  var startRow = 1;

for (var i = endRow; i >= startRow; i--) {

  var rangeToCheck = sheet.getRange(i, 1, 1, 21);

  if (ac.getValue() == "Appt. Set (appointment is setup)") {
    data = rangeToCheck.getValues();
    Logger.log(data)
    MailApp.sendEmail({
      to: data[0][4],
      subject: "Appt. Confirmation",
      body: data[0][10]
    }); break;
  } else if (ac.getValue() == "Lead") {
    data = rangeToCheck.getValues();
    Logger.log(data)
    MailApp.sendEmail({
      to: data[0][4],
      subject: "Welcome",
      body: data[0][11]
    }); break;
  } else if (ac.getValue() == "Follow Up") {
    data = rangeToCheck.getValues();
    Logger.log(data)
    MailApp.sendEmail({
      to: data[0][4],
      subject: "Follow Up",
      body: data[0][12]
    });
  }
 }
}

我希望当我的活动单元格满足 if 语句中的条件时,只会向同一行中的联系信息发送一封电子邮件。现在它会在连续满足条件时向工作表中的每个人发送电子邮件。

【问题讨论】:

    标签: javascript for-loop google-apps-script google-sheets while-loop


    【解决方案1】:
    • 当活动单元格所在行的“B”列的值为“Appt. Set (appointment is setup)”、“Lead”和“Follow Up”时,您想使用以下值发送电子邮件行。
      • 您希望通过“B”列的值更改邮件正文。
    • 例如,当您将“Follow Up”放到“B”列时,您希望使用 OnEdit 事件触发器运行脚本。

    如果我的理解是正确的,那么这个修改呢?在此修改中,使用了可由 OnEdit 事件触发器检索的事件对象。请认为这只是几个答案之一。

    在使用此脚本之前,请为修改后的脚本的RunByOnEdit()安装OnEdit事件触发器。

    如何安装 OnEdit 触发器:

    • 打开脚本编辑器。
      • 编辑 -> 当前项目的触发器。
      • 点击“添加触发器”。
      • RunByOnEdit 设置为“选择要运行的函数”。
      • 为“选择事件源”设置“来自电子表格”。
      • 将“选择事件类型”设置为“编辑时”。

    修改脚本:

    function RunByOnEdit(e) {
      var sheetname = "Prometheus";
      var sheet = e.range.getSheet();
      var range = e.range;
      if (sheet.getSheetName() == sheetname && range.columnStart == 2) {
        var data = sheet.getRange(range.getRow(), 1, 1, 21).getValues()[0];
        var object = {
          to: data[4] // Column "E"
        };
        if (e.value == "Appt. Set (appointment is setup)") {
          object.subject = "Appt. Confirmation";
          object.body = data[10]; // Column "K"
        } else if (e.value == "Lead") {
          object.subject = "Welcome";
          object.body = data[11]; // Column "L"
        } else if (e.value == "Follow Up") {
          object.subject = "Follow Up";
          object.body = data[12];  // Column "M"
        }
        if (object.subject) MailApp.sendEmail(object);
      }
    }
    

    参考资料:

    如果我误解了您的问题并且这不是您想要的结果,我深表歉意。当时,为了正确了解您的情况,能否提供一个样本Spreadsheet?当然,请删除您的个人信息。

    【讨论】:

    • 这很完美!太感谢了。我只需要更改range.columnStart == 1 因为我正在查找A 列中的文本。抱歉,我没有说得很清楚。我需要通过事件侦听器进一步研究 e。
    • @Jonathan Houghton 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
    • 你能澄清一下你修改的最后一行代码吗?这是否只是检查上面的 if 语句中是否有一个主题为真,然后将对象参数传递给 MailApp?我正在尝试复制此代码以发送 SMS 消息,这就是我卡住的地方。
    • @Jonathan Houghton 感谢您的评论。不幸的是,我无法理解您的新问题。这是因为我的英语水平不好。我为此道歉。那么您可以通过包含详细信息将其作为新问题发布吗?它将帮助包括我在内的用户思考您的新问题。另外,我想尝试从中了解您的新问题。如果你能合作解决你的新问题。我很高兴。
    • 没问题,很高兴得到更多帮助!我刚刚发布了一个后续问题:stackoverflow.com/questions/56669749/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多