【问题标题】:Avoid Having Duplicate Email Everytime Googlesheet is edited by Users (Google Script)每次用户编辑 Google 表格时避免重复电子邮件(Google 脚本)
【发布时间】:2021-11-10 23:06:25
【问题描述】:

我是 javascript 新手,还在学习。我制作了一个电子表格作为工作数据的跟踪器,有多个用户在处理它。 WorkArea tabWorkArea 是我们标记时间和是否完成的地方。另一个选项卡是错误选项卡ErrorTAB 是一个查询选项卡,如果标记不正确(没有时间输入并且标记完成),则会显示信封号。在错误选项卡中,单元格“S3”上有一个计数公式,它将确定是否存在错误并显示“TRUE”。我的问题是每次用户进行编辑时我的代码都会发送太多电子邮件。如果可能的话,我希望它发送一次电子邮件。你能帮我解决这个问题吗?

这是我使用 onEdit 触发器编写的代码

function sendEmail(e) {
  var sp = PropertiesService.getScriptProperties();
  var errorTab = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Error');
  var cellRef = errorTab.getRange('S3').getValue();
  var dataRef = "Kindly Check " +  errorTab.getRange('B3').getValue() +  errorTab.getRange('H3').getValue() + errorTab.getRange('N3').getValue();
  var oldValue  = sp.getProperty('S3') || 0;

  if(cellRef == false && cellRef == oldValue) return;
  else 
  var option = {
    cc: "admin1@gmail.com",
  }
  {GmailApp.sendEmail("admin@gmail.com",
  "Dating Contracts Email Notification for Error Tab",
   dataRef,option);
   sp.getProperty('S3', cellRef);
  }
}

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,我无法理解My problem is that my code is sending too many emails every time users make an edit. If possible, I want it to send email once.。我可以问一下您当前问题的详细信息和您的目标吗?
  • 工作表中有 11 个用户。在错误选项卡中,一旦满足条件,S3 将显示 True 将触发代码。我的目标是防止代码发送太多电子邮件,我希望它仅在满足条件后才发送 1 封电子邮件。谢谢
  • 感谢您的回复。在您当前的脚本中,当“错误”表的单元格“S3”为TRUE 时,运行GmailApp.sendEmail。在您的目标中,发送电子邮件后,即使“错误”表的单元格“S3”为TRUE,您也不想发送电子邮件。我的理解正确吗?
  • 是的,你没看错。我希望它只发送 1 封电子邮件。这只是为了通知管理员标记不正确。
  • 感谢您的回复。在这种情况下,将sent 放在“T”列并检查它怎么样?这样,在发送电子邮件后,通过在“T”列检查sent 不会发送下一封电子邮件。而且,您可以将其视为浏览器的状态。如果这不是您期望的方向,我很抱歉。

标签: javascript google-apps-script google-sheets gmail


【解决方案1】:

根据您的以下回复,

我希望您的想法是,如果发送了电子邮件,它将在 T 上显示已发送。

当您想在发送电子邮件后将sent 放入“T”列(在您的情况下为“T3”单元格),如何进行以下修改?

顺便说一句,我认为sp.getProperty('S3', cellRef); 发生了错误。因为getProperty 只是一个参数。我想你可能想成为sp.setProperty('S3', cellRef);

修改脚本:

function sendEmail() {
  var sp = PropertiesService.getScriptProperties();
  var errorTab = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Error');
  var [cellRef, sent] = errorTab.getRange('S3:T3').getValues()[0];
  if (sent == "sent") return;
  var [b3,,,,,,h3,,,,,,n3] = errorTab.getRange('B3:N3').getValues()[0];
  var dataRef = "Kindly Check " + b3 + h3 + n3;
  var oldValue = sp.getProperty('S3') || 0;
  if (cellRef == false && cellRef == oldValue) return;
  var option = { cc: "admin1@gmail.com" }
  GmailApp.sendEmail("admin@gmail.com", "Dating Contracts Email Notification for Error Tab", dataRef, option);
  errorTab.getRange("T3").setValue("sent")
  sp.setProperty('S3', cellRef);
}

【讨论】:

  • 是的,你说得对,我错了。它应该是 setProperty。感谢您的纠正。
  • 这是我遇到的问题,即使 b3、h3、n3 上的值是空白的,它总是在 t3 中显示“已发送”,这会在 b3、h3 上显示值时阻止代码发送电子邮件, n3
  • @Mr.探险家感谢您的回复。关于even if the values on b3, h3, n3 are blank it always shows "sent" in t3 which stops the code from sending email when a values shows on b3, h3, n3,当单元格“b3、h3、n3”为空时,您不想发送电子邮件。我的理解正确吗?从您的问题和脚本中,我无法理解。所以,首先,我想确认一下我的理解是否正确。我为我糟糕的英语水平道歉。
  • 田池你好!抱歉,这件事迟到了。您提供的想法和代码现在可以正常工作,我只是排除了 set/getPropreties 并且效果很好。感谢您的帮助
  • @Mr.欢迎探索者。谢谢你让我知道。我很高兴你的问题得到了解决。如果您的问题已解决,请按接受按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。我认为您的问题和解决方案将对他们有用。如果找不到按钮,请随时告诉我。 stackoverflow.com/help/accepted-answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
相关资源
最近更新 更多