首页 文章

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

提问于
浏览
1

我是编码的初学者,我尝试了很多东西(解决方案),但没有运行脚本 . 我正在使用现有的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 回答

  • 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");
        } 
      }
    }
    
  • 0

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

    function ssForward() {
    
        // DEFINE YOUR MAIN SPREADSHEET
        var ss = SpreadsheetApp.openById("SPREADSHEET_ID_ITS_IN_THE_SS_URL");
    
        // DEFINE THE DATA SHEET THAT RECIEVES THE SUBMISSIONS HERE
        var dataSheet = ss.getSheetByName("data");
    
        // DEFINE THE TEMPLATE SHEET THAT HAS THE EMAIL TEMPLATE INSIDE OF IT
        var templetSheet = ss.getSheetByName("template");
    
        //DEFINE THE CELLS THAT CONTAIN THE TEMPLATE TEXT FOR THE SUBJECT
        var templateSubject = templetSheet.getRange(1, 2).getValue();
    
        //DEFINE THE CELLS THAT CONTAIN THE TEMPLATE TEXT FOR THE SUBJECT
        var templateBody = templetSheet.getRange(2, 2).getValue();
    
        //NOW RUN A FOR LOOP THAT GOES THROUGH EACH ENTRY IN EACH ROW (var i = the row in your spreadsheet )      
        for (var i = 2; i <= dataSheet.getLastRow(); i++) {
    
            // ADD CURRENTLY VIEWED ENTRY TO VAR (var phone = the sheet in row i, column 3)
            // all 3 of these var work the same way    
            var phone = dataSheet.getRange(i, 3).getValue();
            var location = dataSheet.getRange(i, 4).getValue();
            var status = dataSheet.getRange(i, 10).getValue();
    
            // NOW USE THE templetSheet VAR DEFINED ABOVE AND REPLACE THE PLACEHOLDER TEXT WITH THE APPROPRIATE VARIABLE
    
            //REPLACE THE SUBJECT TEMPLATE TEXT <<phone>> WITH THE CONTENTS OF THE VAR 'phone' defined above.
            var subject = templateSubject.replace("<<phone>>", phone);
    
            //REPLACE THE 'SUBJECT TEMPLATE' TEXT: <<location>> - WITH THE CONTENTS OF THE VAR 'location' defined above.
            var body = templateBody.replace("<<location>>", location);
    
            //REPLACE THE 'SUBJECT TEMPLATE' TEXT: <<phone>> - WITH THE CONTENTS OF THE VAR 'phone' defined above.
            body = body.replace("<<phone>>", phone);
    
            // IF OUR STATUS CELL IS EMPTY
            if (status == "") {
    
                // SEND THE EMAIL FROM 'DESIRED@EMAIL.com', USE THE 'subject' VAR FOR THE SUBECT, AND THE VAR 'templateBody' FOR THE MESSAGES BODY
                MailApp.sendEmail('YOUR@EMAIL.com', subject, body);
    
                // MARK THE ROW AS COMPLETED
                dataSheet.getRange(i, 10).setValue("Email Notification Sent");
            }
        }
    }
    
  • 1

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

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

    这是我为某人编写的类似脚本的链接,如果脚本看到“已取消”这个词,该脚本将通过电子邮件发送人员列表 .

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

    -bj

  • 0

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

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

    尝试简单地用这个替换 var emailSent;

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

    它应该按预期工作 .

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

    edit : 最后注意事项,请删除第一行 var EMAIL_SENT = "EMAIL_SENT" ,我知道它来自一个Google示例,但它知道EMAIL_SENT是变量还是值...,将条件更改为

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

相关问题