2017-06-09 3 views
1

J'essaie de modifier mon code de manière à pouvoir envoyer un e-mail en fonction des valeurs d'une ligne spécifiée. Problème: plusieurs personnes utiliseront cette feuille en même temps lors des ventes et le script appelle pour envoyer un e-mail avec un ensemble de lignes ne contenant pas la valeur 'if' de email_sent. je voudrais insérer une ligne ou quelque chose qui enverra seulement l'email des rangées qui ont tous les critères remplis. Je voudrais également protéger les cellules APRÈS qu'elles soient envoyées de sorte qu'elles ne puissent pas être éditées ou supprimées par erreur. Enfin, je voudrais que les utilisateurs sans comptes google puissent déclencher le script.Envoi d'e-mails via des feuilles Google avec la ligne entièrement terminée

`// This constant is written in column L for rows for which an email 
`// has been sent successfully.` 
`var EMAIL_SENT = "EMAIL_SENT";` 

`function sendEmails2() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var startRow = 2; // First row of data to process 
    var numRows = 1; // Number of rows to process 
    // Fetch the range of cells A2:K2 
    var dataRange = sheet.getRange(2,1,3,12) 
    // Fetch values for each row in the Range. 
    var data = dataRange.getValues(); 
    for (var i = 0; i < data.length; ++i) { 
    var row = data[i]; 
    var emailAddress = row[0]; // First column 
    var message = Utilities.formatDate(row[1], "GMT" , "MM/dd/yyyy"); 
    var message1 = row[2]; // third column 
    var message2 = row[3]; 
    var message3 = row[4]; 
    var message4 = row[5]; 
    var message5 = row[6]; 
    var message6 = row[7]; 
    var message7 = row[8]; 
    var message8 = row[9]; 
    var message9 = Utilities.formatDate(row[10], "GMT" , "MM/dd/yyyy"); 
    var emailSent = row[12]; // 12th column 
    if (emailSent != EMAIL_SENT) { // Prevents sending duplicates 
     var subject = "Sending emails from a Spreadsheet"; 
     MailApp.sendEmail(emailAddress, subject, "\nSale date: " + message + "\nCustomer: " + message1 + "\nJob: " + message2 + "\nLender: " + message3 + "\nAged inventory: " + message4 + "\nreplacing CAN: " + message5 + "\nChange option: " + message6 + "\nSource: " + message7 + "\nRealtor: " + message8 + "\nClosing: " + message9); 
     sheet.getRange(startRow + i, 12).setValue(EMAIL_SENT); 
     // Make sure the cell is updated right away in case the script is interrupted 
     SpreadsheetApp.flush(); 
    } 
    } 
}` 
+0

Toute aide serait grandement appréciée! –

Répondre

0

Il est possible de le faire en une seule ligne en utilisant les FI et les & & mais il serait encombrant et beaucoup de temps à entretenir.

Au lieu de cela, ajoutez une nouvelle fonction pour tester la ligne.

Ajouter ces trois nouvelles lignes autour de votre boucle for:

var bool; 
for (var i = 0; i < data.length; ++i) { 
    bool = testData(data[i]) 
    if(bool){ 

et également ajouter une attelle à la ligne de fin de la fonction.

Ajoutez la fonction ci-dessous à votre fichier de script.

function testData(data) { 
    var bool = true; 
    for (var x = 0; x < data.length; x++) { 
     if (!data[x]) { 
      bool = false; 
      break; 
     } 
    } 
    return bool; 
} 

Cela fonctionne en passant la ligne à la fonction de test. Si une cellule est vide, elle renverra une valeur false et function sendEmails2() ignorera cette ligne et passera à la ligne suivante.

MISE À JOUR code de travail complet

// This constant is written in column C for rows for which an email 
    // has been sent successfully. 
    var EMAIL_SENT = "EMAIL_SENT"; 

    function sendEmails2() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var startRow = 2; // First row of data to process 
    var numRows = 2; // Number of rows to process 
    // Fetch the range of cells A2:K2 
    var dataRange = sheet.getRange(2,1,3,12) 
    // Fetch values for each row in the Range. 
    var data = dataRange.getValues(); 

    for (var i = 0; i < data.length; ++i) { 
    if(testData(data[i])){ // Pass the row of data to the testData function (testData will return true or false) 
     var row = data[i]; 
     var emailAddress = row[0]; // First column 
     var message = Utilities.formatDate(row[1], "GMT" , "MM/dd/yyyy"); 
     var message1 = row[2]; // third column 
     var message2 = row[3]; 
     var message3 = row[4]; 
     var message4 = row[5]; 
     var message5 = row[6]; 
     var message6 = row[7]; 
     var message7 = row[8]; 
     var message8 = row[9]; 
     var message9 = Utilities.formatDate(row[10], "GMT" , "MM/dd/yyyy"); 
     var emailSent = row[11]; // 12th column 
     if (emailSent != EMAIL_SENT) { // Prevents sending duplicates 
     var subject = "Sending emails from a Spreadsheet"; 
     MailApp.sendEmail(emailAddress, subject, "\nSale date: " + message + "\nCustomer: " + message1 + "\nJob: " + message2 + "\nLender: " + message3 + "\nAged inventory: " + message4 + "\nreplacing CAN: " + message5 + "\nChange option: " + message6 + "\nSource: " + message7 + "\nRealtor: " + message8 + "\nClosing: " + message9); 
     sheet.getRange(startRow + i, 12).setValue(EMAIL_SENT); 
     // Make sure the cell is updated right away in case the script is interrupted 
     SpreadsheetApp.flush(); 
     } 
    } 
    } 
    } 


    function testData(data) { // Function to test the data 
     for (var x = 0; x < data.length - 1; x++) { // Loop through each cell (length -1 because we don't want to check the email sent cell as that should be empty) 
      if (!data[x]) { // If a cell is empty return false 
       return false; 
      } 
     } 
     return true; // If no empty cells are found return true 
    } 
+0

sera-t-il important d'ajouter ces lignes? –

+0

J'ai reçu une erreur indiquant que testData n'est pas une fonction, il est indéfini –

+0

Pouvez-vous fournir une feuille d'échantillons? –