2016-05-16 13 views
0

Ich bin relativ neu in der Programmierung und habe kürzlich an einem Skript gearbeitet, um E-Mails aus einer Google-Tabelle zu senden, wenn eine Zelle in einer bestimmten Spalte geändert wird. Der Empfänger wird basierend auf einer E-Mail-Adresse in einer anderen Spalte in derselben Zeile wie die Änderung zugewiesen. Ich habe Schwierigkeiten, meinen Code nach der ersten E-Mail zu beenden. So wie es ist, läuft das Skript auf unbestimmte Zeit (zumindest bis ich keine E-Mails für den Tag mehr habe). HierGoogle Script E-Mail-Schleife

ist der Code:

function sendNotification() { 

     var sheet = SpreadsheetApp.getActiveSheet(); 
    //Get Active cell 
    var mycell = sheet.getActiveSelection(); 
    var cellcol = mycell.getColumn(); 
    var cellrow = mycell.getRow(); 
    var address = sheet.getRange("C" + cellrow).getValue(); 
    var streetAddress = sheet.getRange("F" + cellrow).getValue(); 
    var startRow = 2; 
    var numRows = 2000; 
    // Fetch the range of cells A2:O2000 
    var dataRange = sheet.getRange(startRow, 1, numRows, 15) 
    // Fetch values for each row in the Range. 
    var data = dataRange.getValues(); 
    for (i in data) { 
    var row = data[i]; 
    var emailAddress = address; // First column 
    var message = streetAddress +" Has been Submitted for permitting!";    // Second column 
    var subject = "The above Address has been Submitted For Permitting! We  will Follow up with you when it has been approved."; 
    //Check to see if column is H to trigger 
     if (cellcol == 8 && sheet.getName() == "Sheet1" && mycell !== "") 
     { 
    //Send the Email 
     MailApp.sendEmail(emailAddress, message, subject); 
     } 
    //End sendNotification 
    } 
    } 

Was kann ich tun, um dieses zu lösen? Wäre eine Schleife die beste Option? Wie würde ich das umsetzen?

Wie wäre es mit diesem Ansatz?

var EMAIL_SENT = "EMAIL_SENT";

function onEdit(e) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 
    var mycell = e.range; 
    var cellcol = mycell.getColumn(); 
    var cellrow = mycell.getRow(); 
    var emailAddress = sheet.getRange("C" + cellrow).getValue(); 
    var streetAddress = sheet.getRange("F" + cellrow).getValue(); 
    var subject = "The above Address has been Submitted For Permitting! We  will follow up with you when it has been approved." 
    // Fetch values for each row in the Range 
    var message = streetAddress +" Has been Submitted for permitting!"; 
    var emailSent = sheet.getRange("O" + cellrow).getValue();  
    if (cellcol == 8 && sheet.getName() == "Sheet1" && emailSent !=  EMAIL_SENT) { // Prevents sending duplicates 
     MailApp.sendEmail(emailAddress, subject, message); 
     sheet.getRange(cellrow, 15).setValue(EMAIL_SENT); 
     // Make sure the cell is updated right away in case the script is  interrupted 
     SpreadsheetApp.flush(); 
    } 
    } 
+0

Ihre Schleife wird 2000 Mal ausgeführt, da Sie 2000 Zeilen abrufen. Die IF-Kontrolle auf ** Zeile 22 ** sollte überprüfen, dass der Wert in der aktuellen Zeile und Spalte 8 (H) nicht leer ist, Zeile [8]! = "". Stattdessen überprüfen Sie 'mycell! =" "', Das auf eine Zelle außerhalb der Schleife verweist. Auch scheint 'cellcol == 8' nicht notwendig zu sein. – Fredster

+0

Die Sache ist, ich möchte nur die E-Mail senden, wenn sich die bearbeitete Zelle in Spalte 8 befindet. Ich denke, dass ich alles falsch angegangen bin. Sieht das besser aus? – AFliss

Antwort

0

Wenn Sie die onEdit() die Funktion wird jedes Mal, wenn Sie die Zelle bearbeiten ausgelöst werden. Ist das was du willst? Was ich nehme an, Sie suchen ein Skript, das:

  1. jede Zeile des aktiven Blattes Liest
  2. Wenn die achte Spalte nicht leer ist, sendet eine E-Mail an die Adresse in der ersten Spalte
  3. das gesamte Skript ist Auslöser auf den Benutzeranforderungen (nicht, wenn der Benutzer eine Zelle bearbeitet)

In diesem Fall ist der erste Ansatz besser ist, die sendNotification(). Auch eine Schleife ist notwendig, um alle Zeilen zu lesen. Und die IF-Anweisung sollte so etwas wie if (row[8] != "") sein, dann sende die E-Mail.

In diesem Fall row, die als row = data[i] in Ihrem ersten Skript definiert wurde, werden die Werte aller Zellen in der Zeile in der Schleife gelesen werden. So row[8] wird der Wert der achten (Spalte H), die Sie auf Leerheit überprüfen möchten, also if(row[8] != "").

Auch wenn ich richtig verstehe, sollte die E-Mail-Adresse innerhalb der Schleife emailAddress = row[1] sein, weil die E-Mail-Adresse jede Zeile anders ist.

0

Ihr zweiter Ansatz var EMAIL_SENT = "EMAIL_SENT"; ist fast ähnlich wie die einfache Erweiterung des Codes, um die Zellen in einer Spalte ‚email_sent‘ für jede Zeile setzt nach sendEmail in Section 2: Improvements gegeben genannt wird. Im Lernprogramm wurde jede Zelle in jeder Zeile markiert, wenn eine E-Mail gesendet wurde. Damit sollten Sie bearbeitete Zellen als nicht gesendet markieren, dann können Sie das Skript später erneut ausführen, vermeiden das Senden von E-Mail-Duplikaten und senden nur die bearbeiteten Zellen.

Um Ihren Code effizienter zu machen und Ihnen zu helfen, die Leistung Ihrer Skripte zu verbessern, gibt es auch eine Liste von best practices gegeben.