2012-12-03 10 views
8

googledocsを使用してフォームをセットアップしました。私はフォームに入力された実際のデータを電子メールで送付したいのですが、フォームが完成したという一般的な回答とは対照的です。電子メール通知にGoogleドキュメントのフォームデータを含めるスクリプトを設定する

私はコードなどのスキルや経験はありませんが、これを並べ替えることができると確信していました。私は何時間も過ごしてきたし、運がなかった。

私のフォームは本当にbasic.itに5つのフィールドがあります。そのうちの4つはテキスト応答であり、1つは複数選択です。

私はこれをオンラインで見つけました(http://www.labnol.org/internet/google-docs-email-form/20884/)。私は何をしようとしていると思っていますが、まだ行っていませんそれを働かせることができます。

私は次のコードを入力し、このサイトから:これに

function sendFormByEmail(e) 
{  
    var email = "[email protected]"; 

    var subject = "Google Docs Form Submitted"; 

    var s = SpreadsheetApp.getActiveSheet(); 
    var headers = s.getRange(1,1,1,s.getLastColumn()).getValues()[0];  
    var message = "";  

for(var i in headers) 
message += headers[i] + ' = '+ e.namedValues[headers[i]].toString() + "\n\n"; 

    MailApp.sendEmail(email, subject, message); 
} 

を、私は次の応答を得る: - >

あなたのスクリプト、お問い合わせフォームメーラーは、最近終了するのに失敗しました成功しました。障害の概要を以下に示します。このスクリプトのトリガーを設定する、または将来の障害通知を受信するための設定を変更するには、ここをクリックしてください。

このスクリプトは、100%クラブのドキュメントで使用されています。

詳細:

Start    Function  Error Message              Trigger  End 
12/3/12 11:06 PM sendFormByEmail TypeError: Cannot call method "toString" of undefined. (line 12) formSubmit 12/3/12 11:06 PM 

が私のために、この上でいくつかの光を当てる助けることができる誰か?私はちょっとしたデータを含めていないと思っていますが、私は正直なところ手がかりがありません。

答えて

-2

スクリプトを使用する必要はありません。 Googleスプレッドシートのツール→通知ルールに移動してください。ここでは、文書が変更されるたびに、必要な情報を含む電子メールを受信するように設定を変更することができます。

+0

残念ながら、誰かがフォームなどを記入したときに通知メールを送信しますが、そのメールには更新済みと表示されています。ここをクリックして確認してください。私は、通知メールに含まれているデータを入力したいと思っています。 – user1872449

4

回避方法http://www.labnol.org/internet/google-docs-email-form/20884/ データを電子メールで転送するには、アプリスクリプトをセットアップする必要があります。

+0

これは私のために働いたことを分かち合いたい。フォームを解析して実際に電子メールに記入するようにスクリプトを修正しました。私はコードを共有する答えを投稿しますが、私はこれが "私の解決された答え"であるとコメントしたいと思います。 –

0

Googleフォームの場合は、スプレッドシートにフォームにない余分な列がありますか?それらの余分な列を削除すると、それは私のために働き始めました。それは私のためにそれを解決した上で、私はコメントを指します

2

https://stackoverflow.com/a/14576983/134335

私はそれがさらに一歩を投稿しました:

  • 私は通常の通知を削除しました。アプリスクリプトはその一般的なテキストを今や冗長で無用にします
  • 実際に結果を解析してそれに応じてスクリプトを作成するようにスクリプトを修正しました。
 
function sendFormByEmail(e) 
{ 
    var toEmail = "changeme"; 
    var name = ""; 
    var email = ""; 

    // Optional but change the following variable 
    // to have a custom subject for Google Docs emails 
    var subject = "Google Docs Form Submitted"; 
    var message = ""; 

    // The variable e holds all the form values in an array. 
    // Loop through the array and append values to the body. 

    var s = SpreadsheetApp.getActiveSheet(); 
    var headers = s.getRange(1,1,1,s.getLastColumn()).getValues()[0]; 

    // Credit to Henrique Abreu for fixing the sort order 
    for(var i in headers) { 
    if (headers[i] = "Name") { 
     name = e.namedValues[headers[i]].toString(); 
    } 
    if (headers[i] = "Email") { 
     email = e.namedValues[headers[i]].toString(); 
    } 
    if (headers[i] = "Subject") { 
     subject = e.namedValues[headers[i]].toString(); 
    } 
    if (headers[i] = "Message") { 
     message = e.namedValues[headers[i]].toString(); 
    } 
    } 

    // See https://developers.google.com/apps-script/reference/mail/mail-app#sendEmail(String,String,String,Object) 
    var mailOptions = { 
    name: name, 
    replyTo: email, 
    }; 

    // This is the MailApp service of Google Apps Script 
    // that sends the email. You can also use GmailApp here. 
    MailApp.sendEmail(toEmail, subject, message, mailOptions); 

    // Watch the following video for details 
    // http://youtu.be/z6klwUxRwQI 

    // By Amit Agarwal - www.labnol.org 
} 

実施例で使用するスクリプトは、メッセージが送信されたフォームフィールドのキー/値のペアとして構築されているので、変更することは非常に一般的な、非常に弾性です。

スクリプトを使用している場合は、forループif文をそのままフィールドに合わせる必要があります。また、toEmail変数を編集することもできます。

質問と回答のお返事ありがとうございます。私はGoogleフォームを捨てようとしていました。一般的な対応は、私がやろうとしていたことに対して十分ではなかったからです。

最後に、上記の「toString of undefined」という実際の問題に対する応答として、具体的にはフォームフィールドの1つが空白として送信されたことを意味します。私が推測しなければならないのは、著者が、すべてのフィールドが必要なフォームや、未定義のクイックチェックが必要なフォームにしか使用していないと言うでしょう。

次のようなものが働くだろう:

 
for(var i in headers) { 
    var formValue = e.namedValues[headers[i]]; 
    var formValueText = ""; 
    if (typeof(formValue) != "undefined") { 
    formValueText = formValue.toString(); 
    } 
    message += headers[i] + ' = '+ formvalueText + "\n\n"; 
} 

私は正確にこれをテストしていませんが、それは、オブジェクトがのtoString(のような方法を試す前に定義されていることを確認することのかなりの標準的な方法です)というはっきりしません作業。

これはJon Filaの答えも説明します。このスクリプトは、レスポンス内のすべてのヘッダー行がフォームによって送信されることを想定しています。フィールドのいずれかが必須でない場合、またはスプレッドシートにもフォームに含まれていないフィールドがある場合は、未定義のオブジェクトがたくさんあります。

スクリプトはより良いコードになっている可能性がありますが、私は作者が誤りではないことを明確に示しています。彼らがreplyToの修正について言及しているが、それを実装する上で例を挙げていないという事実は、それを完全に明確にしました。