0

私はプログラミングが比較的新しく、特定の列のセルが変更されたときに、Googleスプレッドシートから電子メールを送信するスクリプトに最近取り組んでいます。受信者は、変更と同じ行にある別の列の電子メールアドレスに基づいて割り当てられます。最初のメールの後にコードの実行を停止するのが難しいです。スクリプトは無期限に実行されます(少なくとも、その日の電子メールがなくなるまで)。ここでGoogle Scriptのメールループ

はコードです:

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 
    } 
    } 

は、私はこれを解決するために何ができますか?ループが最善の選択肢でしょうか?私はこれをどのように実装しますか?

この方法はどうですか?

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

2000行をフェッチしているので、ループは2000回実行されます。 ** line 22 **のIF制御は、現在の行と列8(H)の値が空でないことを確認する必要があります。 'row [8]!=" "'。代わりに、ループ外のセルを参照する 'mycell!=" "'をチェックしています。また 'cellcol == 8'は必要ないようです。 – Fredster

+0

問題は、編集したセルが列8にある場合にのみ電子メールを送信したいと思います。私はこれがすべて間違っていると思います。これはもっと良く見えますか? – AFliss

答えて

0

onEdit()を使用すると、セルを編集するたびに機能が起動されます。これは、あなたの望むことですか?

  1. は、第八列が空でない場合は、アクティブなシート
  2. のすべての行を読み込み、最初の列のアドレスに電子メールを送信します。 私はあなたが探していると仮定すると、スクリプトです
  3. 全体スクリプトは、最初のアプローチが優れているsendNotification()この場合(ユーザーがセルを編集しない)ユーザ要求時にトリガー

あります。また、すべての行を読み取るにはループが必要です。 IF文はif (row[8] != "")のようなものにして、電子メールを送信します。

この場合、最初のスクリプトでrow = data[i]と定義されたrowには、ループ内のすべての行のセルの値が読み込まれます。だからrow[8]は、空であるかどうかを確認したい第8(列H)の値を持つでしょう。したがって、if(row[8] != "")です。

また、正しく理解すれば、電子メールアドレスはすべての行ごとに異なるので、ループ内にはemailAddress = row[1]の電子メールアドレスが必要です。

0

は、sendEmailが呼び出された後にSection 2: Improvementsで指定された行のセルを 'EMAIL_SENT'に設定するコードの単純な拡張とほぼ同じです。チュートリアルでは、電子メールが送信されるたびに各セルに各セルがマークされていました。これで、編集したセルを未送信としてマークし、後でスクリプトを再実行し、電子メールの複製を送信しないようにし、編集されたセルのみを送信します。

コードをより効率的にし、スクリプトのパフォーマンスを向上させるために、best practicesのリストもあります。