Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌脚本通过电子邮件发送表单值,错误:无法读取属性;“名称价值”;_Javascript_Google Apps Script_Triggers_Google Forms_Google Apps - Fatal编程技术网

Javascript 谷歌脚本通过电子邮件发送表单值,错误:无法读取属性;“名称价值”;

Javascript 谷歌脚本通过电子邮件发送表单值,错误:无法读取属性;“名称价值”;,javascript,google-apps-script,triggers,google-forms,google-apps,Javascript,Google Apps Script,Triggers,Google Forms,Google Apps,项目编号:MyvPlY2KvwGODjsi4szfo389owhmw9jII 我试图运行一个脚本,在每次提交表单时通过电子邮件发送表单内容。我一直按照下面链接中的说明进行操作,直到我开始出现错误,并收到了将脚本更改为按id打开电子表格的建议: 当我完成表格时,它应该将内容通过电子邮件发送到我的电子邮件中 我现在遇到的问题是,通过表单值的函数不起作用。对于下面的代码段,它返回错误“TypeError:Cannotreadproperty”namedValues(第15行,文件“Code”): f

项目编号:MyvPlY2KvwGODjsi4szfo389owhmw9jII

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

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

我现在遇到的问题是,通过表单值的函数不起作用。对于下面的代码段,它返回错误“TypeError:Cannotreadproperty”namedValues(第15行,文件“Code”):

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

函数似乎未定义,因为“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());
  }
}
/*使用谷歌表单发送确认电子邮件*/
函数初始化(){
var triggers=ScriptApp.getProjectTriggers();
for(触发器中的var i){
ScriptApp.deleteTrigger(触发器[i]);
}
ScriptApp.newTrigger(“发送确认邮件”)
.forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet())
.onFormSubmit()
.create();
}
功能SendConfirmationMail(电子邮件){
试一试{
变量ss、cc、发送者名称、主题、列;
变量头、消息、值、文本体、发件人、项目ID、url;
//这是您的电子邮件地址,您将进入CC
cc=”name@email.com";
//这将显示为发件人的名称
sendername=“要显示为发件人的名称”;
//可选,但更改以下变量
//为谷歌文档电子邮件设置自定义主题
subject=“选择合适的主题”;
//这是自动回复的主体
message=“”;
ss=电子表格app.getActiveSheet();
columns=ss.getRange(1,1,1,ss.getLastColumn()).getValues()[0];
//这是提交者的电子邮件地址
sender=e.namedValues[“Username”].toString();
//仅包括非空的表单值
for(列中的变量键){
var key=列[键];
//使用此选项可查找特定的命名密钥
如果(例如,名称值[键]){
如果(键==“用户名”){
header=“用户”+e.namedValues[key]+“已提交表单,请查看以下信息。
”; }否则{ message+=key+'::
'+e.namedvalue[key]+“
”; } } } } textbody=标题+消息; textbody=textbody.replace(“
”,“\n”); Logger.log(“发送电子邮件”); GmailApp.sendmail(抄送、主题、正文、, {cc:cc,name:sendername,htmlBody:textbody}); }捕获(e){ Logger.log(例如toString()); } }
这行代码中有一个错误:

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

e.namedValues[headers[i]].toString()
我只是猜测你想要:

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

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

我也有同样的错误,我花了一些时间才找到解决方法

问题是,您正在表单中编写代码,应该在电子表格中完成

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

Logger.log("e:  " + JSON.stringify(e));
因此,我采取了以下步骤来纠正此问题:

  • 创建电子表格
  • 通过电子表格创建表单(在电子表格中选择工具->创建表单),然后创建表单
  • 返回电子表格,创建脚本(工具->脚本编辑器)
  • 写下你的函数
  • 注册函数(编辑->当前项目的触发器):函数sendFormByEmail,事件:从电子表格->表单提交
  • 希望这有助于

    放置一个
    Logger.log('e的值为:'+e)语句作为
    sendFormByEmail
    函数中的第一行代码。提交表单,然后在代码编辑器中使用“视图”菜单和“日志”菜单项。日志中应该有东西印出来。如果在代码编辑器中运行此代码,则
    e
    将是未定义的。
    e
    接收值的唯一方法是安装提交触发器,并实际提交表单。这是即时的。我也花了一段时间才从提交中得到结果,使用logger是一个很好的方法来了解您得到了什么。