2012-12-03 11 views
8

我已經使用googledocs設置了表單。我只是想通過電子郵件將輸入的實際數據發送給我,而不是通知回覆通知表格已完成。設置腳本以在電子郵件通知中包含Google文檔表單數據

我沒有技能或經驗與代碼等,但肯定我可以得到這個排序。我花了數小時+小時,並沒有運氣。

我的表單真的很basic.it有5個字段。其中4個僅僅是文字回覆,還有一個是多項選擇。

我在網上找到了這個tute(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」,具體表示其中一個表單域被提交爲空白。如果我不得不猜測,那麼我會說作者只是將它用於需要所有字段的表單或未定義的快速檢查。

像下面的內容將工作:

 
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方法之前定義的()的一個非常標準的方式,顯然不會工作。

這也可以解釋喬恩菲拉的答案。腳本盲目地假定響應中的所有標題行都是由表單發送的。如果任何字段不是必需的,或者電子表格中的字段不再處於表單中,則會收到大量未定義的對象。

該腳本本可以編碼得更好,但我不會對作者犯錯,因爲它顯然只是爲了證明概念。他們提到答覆要糾正的事實,但沒有給出任何實施方面的例子,這一點非常清楚。

相關問題