2016-07-20 10 views
0

ユーザーはGoogleフォームをGoogleシートに送信するたびに、フォームフィールドの電子メールアドレスを使用して電子メール返信を自動的に送信するOnSubmit機能を起動し、正しい/間違った 'データ検証を行うことができる。最新のフォーム送信データがシートの最後の行に書き込まれたので、次のコードを使用して、シートから両方のデータを取り出そうとしました(電子メールアドレスに関数パラメータを使用することはできますが)。Googleフォームの投稿時にメールを送信

私はまた、フォーム提出イベントトリガーと電子メール認証を既に設定しています。しかし、電子メールは機能していないようです。フォーム提出時にトリガするように設定されている場合、スクリプトエディタでこの関数を実行する必要がありますか?私は実行をクリックしようとすると、コードは実行時間を超えています。

function OnSubmit(e) { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var startRow = sheet.getLastRow()-1; 
    var numRows = 1; // Number of rows altogether 


    // Fetch the range of cells A(last row):G(last row) 
    var dataRange = sheet.getRange(startRow, 1, numRows, 7); 

    // Fetch values for each row in the Range. 
    var data = dataRange.getValues(); 
    for (i in data) { 
    var row = data[i]; 
    var emailAddress = row[2]; // Column C of last row 
    var message = ""; 
    while(row[6] === "") {  // Delay until data verification is done 
    Utilities.sleep(10000); 
    } 
    var subject = row[6] // Column G (data verification cell) of last row 
    MailApp.sendEmail(emailAddress, subject, message); 
    } 
} 
+0

Loggerを使用して実行をトレースしてください –

+0

詳細を教えてください。 Google Appsスクリプトを初めて試してみます。私は、私がオンラインで読んだことに基づいてコードをまとめました。 –

+0

このコード部分は使用できません: 'while(row [6] ===" "){//データ検証が完了するまでの遅延 Utilities.sleep(10000); } 'は、スクリプトの実行中にデータが更新されないため、関数が呼び出されたときにrow [6]が空の場合、ループは常に無限になります。 –

答えて

0

計算が完了するまでスクリプトを待機させようとしています。

しかし、

while(row[6] === "") { 
Utilities.sleep(10000); 
} 

このついて行くには間違った方法である:変数rowは、ループ内で変更されていません。データ取り込みラインvar data = dataRange.getValues();whileループ内にあったとします。

しかし、保留中の変更が実際に起こるより確実にするために、より良い方法があるが:var data = dataRange.getValues();

SpreadsheetApp.flush(); 

を使用これは、保留中の計算を適用し、そのwhileループの必要性を排除します。結果:

function OnSubmit(e) { 
    SpreadsheetApp.flush(); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var dataRange = sheet.getRange(sheet.getLastRow(), 1, 1, 7); 
    var data = dataRange.getValues(); 
    var row = data[0]; 
    var emailAddress = row[2]; // Column C of last row 
    var message = ""; 
    var subject = row[6] // Column G (data verification cell) of last row 
    MailApp.sendEmail(emailAddress, subject, message); 
} 
+0

ループ問題を指摘してくれてありがとう!しかし、計算されたデータ(col G)はフォーム提出ではないため、関数パラメータではなくシートの最後の行から取り出す必要がありました。さらに、データをプルする前に計算が完了しているかどうかの確認が必要な計算遅延があります(したがって、ループの誤った使用)。私はこれを行う方法がありますか? –

+0

OnEditは、シートが開いている必要があるため、シートが閉じた状態で実行する必要があるため、どちらも機能していないようです。 –

+0

さて、私の答えを更新 –

関連する問題