Google Apps脚本:仅针对新条目的电子邮件触发器(不使用Google表单)

时间:2014-09-25 16:14:58

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

我是编码的初学者,我尝试了很多东西(解决方案),但没有运行脚本。 我正在使用现有的sendEmail脚本(见下文)将电子邮件发送到新的电子表格条目。

https://docs.google.com/spreadsheet/ccc?key=0At8yp_w7-gFwdHdhS0RDa2hXUUMyU2lfRFJ1NU1iNEE&usp=sharing

我没有使用Google表单。我正在从另一个电子表格表中复制所需的信息。使用onEdit触发器,脚本将向新条目发送电子邮件。

我遇到的问题是脚本会向电子表格的每一行发送一封电子邮件,即使该信息已经发送过。

我尝试了一些解决方法,虽然它们在论坛中命名,但在我的案例中没有任何帮助。我不想只向最后一个条目发送电子邮件。我想将电子邮件发送到不同数量的新条目,如果可能的话,这应该是onEdit事件的triggert。 我希望,有人可以尽快帮助我......

  var EMAIL_SENT = "EMAIL_SENT";

  function sendEmails(onlyLast) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var dataSheet = ss.getSheets()[0];
  var startRow = 2;
  var lastRow = datasheet.getlastRow()-1;
  if (onlyLast)
  startRow = endRow;
  var dataRange = dataSheet.getRange(startRow, 1, lastRow, 4);

  var templateSheet = ss.getSheets()[1];
  var emailTemplate = templateSheet.getRange("A1").getValue();

  // Create one JavaScript object per row of data.
  var objects = getRowsData(dataSheet, dataRange);

  // For every row object, create a personalized email from a template and send
  // it to the appropriate person.
  for (var i = 0; i < objects.length; ++i) {
    // Get a row object
    var rowData = objects[i];


    var file = DriveApp.getFileById('');
    // Generate a personalized email.
    // Given a template string, replace markers (for instance ${"First Name"}) with
    // the corresponding value in a row object (for instance rowData.firstName).
    var emailText = fillInTemplateFromObject(emailTemplate, rowData);
    var emailSubject = "Tutorial: Simple Mail Merge";
    var emailSent;   
    if (emailSent != EMAIL_SENT) {  
      var subject = "Tutorial: Simple Mail Merge";
      MailApp.sendEmail(rowData.emailAddress, emailSubject, emailText, {attachments:[file.getAs(MimeType.PDF)]});
      dataSheet.getRange(startRow + i, 5).setValue(EMAIL_SENT);
      SpreadsheetApp.flush();
    }
  }
}

4 个答案:

答案 0 :(得分:1)

以下是电子表格示例:https://docs.google.com/spreadsheets/d/1RdwZcK6tsOr1m44ZyawWsWXGa26zhd8J1ZZs_GsRRtY/edit?usp=sharing

把它放在定时触发器上:

function sendNew(){
  var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data");
  var templetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("template");
  var templateSubject = templetSheet.getRange(1, 2).getValue();
  var templateBody = templetSheet.getRange(2, 2).getValue();

  for (var i =2; i<= dataSheet.getLastRow(); i++){
    var name = dataSheet.getRange(i, 1).getValue();
    var color = dataSheet.getRange(i, 2).getValue();
    var status = dataSheet.getRange(i, 3).getValue();

    var subject = templateSubject.replace("<<Name>>", name);
    var body = templateBody.replace("<<Name>>", name);
    body = body.replace("<<Color>>", color);

    if (status == ""){
      MailApp.sendEmail('youremail@gmail.com', subject, body);
      dataSheet.getRange(i,3).setValue("Email Sent");
    } 
  }
}

答案 1 :(得分:1)

这对我来说很有意义,它改变了Bjorn在那里所做的事情。脚本Bjorn的道具谢谢你,希望这个帖子可以帮助别人,就像今晚帮助我一样。谢谢你们!

setTimeout(function(){
    $('.searchable').blur();
},1500);

答案 2 :(得分:0)

首先,我建议不使用onEdit,而是使用时间驱动的触发器来检查更改。这样,即使您错过了输入内容,您的脚本也会不断尝试发送电子邮件。

其次,您需要某种方式来指示数据处理过的天气与否。您可以让脚本Bold处理所有已处理的信息,然后通过电子邮件发送任何非粗体的内容。

这是我为某人编写的类似脚本的链接,如果脚本看到“#34;取消&#34;”这样的话会通过电子邮件发送人员列表。

https://docs.google.com/a/askbj.net/spreadsheets/d/1Y82TwZWC8Nh2HQhpKWcdxgnrU0ANo8d2JLenK3gWyY4/edit?usp=sharing

-bj

答案 3 :(得分:0)

在您的代码中定义var emailSent;,但不要为其指定任何值...

所以以下比较总是返回 true if (emailSent != EMAIL_SENT) {

尝试使用以下内容替换var emailSent;

var emailSent = dataSheet.getRange(startRow + i, 5).getValue();

它应该按预期工作。

最后,正如其他答案中所提到的,在计时器触发器上运行此函数而不是onEdit以避免部分电子邮件发送(如果用户更改了单元格内容或错误输入了某些内容......)

编辑 最终备注,请删除第一行var EMAIL_SENT = "EMAIL_SENT",我知道它来自Google的一个例子,但它在这里没用(恕我直言)非常混乱,因为最后你不知道EMAIL_SENT是变量还是值...,将条件改为

if (emailSent != 'EMAIL_SENT') { // which compares a value to a string, clearly ;-)