【问题标题】:Google Script send form values by email, error: cannot read property "namedValues"Google 脚本通过电子邮件发送表单值,错误:无法读取属性“namedValues”
【发布时间】:2015-03-11 21:28:05
【问题描述】:

项目密钥:MyvPlY2KvwGODjsi4szfo389owhmw9jII

我正在尝试运行一个脚本,该脚本在每次提交表单时通过电子邮件发送我的表单内容。我完全按照下面此链接中的说明进行操作,直到我开始遇到错误并收到建议更改我的脚本以按 id 打开电子表格:

http://www.snipe.net/2013/04/email-contents-google-form/

当我完成表格时,它应该将内容通过电子邮件发送到我的电子邮件。

我现在遇到的问题是通过表单值的函数不起作用。它返回错误“TypeError:无法从未定义中读取属性“namedValues”。(第 15 行,文件“代码”)”关于以下代码:

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

我对谷歌脚本不太熟悉,所以我也不确定如何解决这个问题。你有什么推荐的吗?我在下面包含了整个脚本。

function sendFormByEmail(e) 
{    
  // Remember to replace this email address with your own email address
  var email = "sample@email.com"; 

  var s = SpreadsheetApp.openById("1hOqnK0IVa2WT6-c-MY0jyGGSpIJIV2yzTXdQYX4UQQA").getSheets()[0];
  var headers = s.getRange(1,1,1,s.getLastColumn()).getValues()[0];    
  var message = "";
  var subject = "New User Form";

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

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

  // Insert variables from the spreadsheet into the subject.
  // In this case, I wanted the new hire's name and start date as part of the
  // email subject. These are the 3rd and 16th columns in my form.
  // This creates an email subject like "New Hire: Jane Doe - starts 4/23/2013"
  subject += e.namedValues[headers[2]].toString() + " - starts " + e.namedValues[headers[15]].toString();

  // Send the email
  MailApp.sendEmail(email, subject, message); 
}

【问题讨论】:

  • 将Logger.log('value of e is: ' + e); 语句作为sendFormByEmail 函数的第一行代码。提交表单,然后在代码编辑器中,使用 VIEW 菜单和 LOGS 菜单项。应该有一些东西打印到日志中。如果您在代码编辑器中运行此代码,则 e 将未定义。 e 接收值的唯一方法是使用已安装的 On Submit 触发器,并实际提交表单。

标签: javascript google-apps-script triggers google-forms google-apps


【解决方案1】:

函数似乎未定义,因为“e”未作为函数上下文的一部分接收。您需要设置提交表单的触发器,并将信息发送到函数。您可以使用以下代码:

/* Send Confirmation Email with Google Forms */
function Initialize() {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i in triggers) {
    ScriptApp.deleteTrigger(triggers[i]);
  }
  ScriptApp.newTrigger("SendConfirmationMail")
  .forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet())
  .onFormSubmit()
  .create();
}


function SendConfirmationMail(e) {
  try {
    var ss, cc, sendername, subject, columns;
    var header, message, value, textbody, sender, itemID, url;

// This is your email address and you will be in the CC
cc = "name@email.com";

// This will show up as the sender's name
sendername = "name to be displayed as sender";

// Optional but change the following variable
// to have a custom subject for Google Docs emails
subject = "Choose an approppiate subject";

// This is the body of the auto-reply
message = "";

ss = SpreadsheetApp.getActiveSheet();
columns = ss.getRange(1, 1, 1, ss.getLastColumn()).getValues()[0];

// This is the submitter's email address
sender = e.namedValues["Username"].toString();

// Only include form values that are not blank
for ( var keys in columns ) {
  var key = columns[keys];
//Use this to look for a particular named key
  if ( e.namedValues[key] ) {
    if ( key == "Username" ) {
      header = "The user " + e.namedValues[key] + " has submitted the form, please review the following information.<br />";
    } else {
        message += key + ' ::<br /> '+ e.namedValues[key] + "<br />"; 
      }
    }
  }
}

textbody = header + message;
textbody = textbody.replace("<br>", "\n");

Logger.log("Sending email");
GmailApp.sendEmail(cc, subject, textbody, 
                   {cc: cc, name: sendername, htmlBody: textbody});



} catch (e) {
    Logger.log(e.toString());
  }
}

【讨论】:

    【解决方案2】:

    我有同样的错误,我花了一些时间才弄清楚如何解决它。

    问题是您在表单中编写代码,并且应该在电子表格中进行。

    当我在表单中创建函数并注册事件时,它被调用但参数没有相同的结构(并且没有字段namedValues,因此错误“无法读取属性“namedValues”不明确的”)。更好的检查方法是将对象记录为 JSON 字符串:

    Logger.log("e:  " + JSON.stringify(e));
    

    所以,我为纠正这个问题所采取的步骤:

    1. 创建电子表格
    2. 通过电子表格创建表单(在电子表格中选择工具->创建表单),然后创建您的表单
    3. 返回您的电子表格,然后创建脚本(工具->脚本编辑器)
    4. 编写你的函数
    5. 注册函数(编辑->当前项目的触发器):函数 sendFormByEmail,事件:来自电子表格 -> 提交表单

    希望对你有帮助

    【讨论】:

    • 这是正确的。我也挣扎了一段时间才能从提交中获得结果,而使用 logger 是找出你所拥有的东西的好方法得到。
    【解决方案3】:

    这行代码有错误:

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

    就是这个部分:

    e.namedValues[headers[i]].toString()
    

    我只是猜你想要:

    e.namedValues + [headers[i]].toString()
    

    如果要连接这些值,则缺少一个加号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 2013-08-15
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多