【问题标题】:How to return a value in the only non-blank column in a range for sendEmail function in Google App Scripts如何在Google App Scripts中的sendEmail函数范围内的唯一非空白列中返回一个值
【发布时间】:2016-04-25 08:37:30
【问题描述】:

问题是:我找不到返回“课程”值的方法,因为每次提交表单都会生成一个新行,其中课程名称分布在 E 到 M 列(第 4 到 12 列)。

在每一行中,从 E 到 M 的一列中只有一个“课程”名称(例如仅在 F 中),所有其他列都是空白的。 (用户只能选择一门课程,所有其他列都将为空白。由于分页符,我必须将课程分类为 9 列,以便拆分用户从中选择课程的选项的绝对数量。) 怎么做我将 E 到 M 中唯一非空白单元格的值返回到电子邮件中?

我被建议在任何其他代码之前将整个 findCourse 函数插入到 sendEmail 函数中。我这样做了,但我仍然收到 Google App Scripts 的失败通知:TypeError: Cannot read property "values" from undefined. (line 14, file "Code")(指 var value = e.values[i])

完整代码如下:

function sendEmail(e) {
function findCourse (e){
      var courseToTake;
      //loop through values 
      for ( var i = 4; i <=12; i ++){
           //pull value into variable 
           var value = e.values[i]; 
         if (value != undefined){
               //if we find an actual string value, set the course to take variable 
               courseToTake = value; 
            }
     }
    return courseToTake; 
}

var Name = e.namedValues["Full name as appear in NRIC"];
var Course = findCourse();
var Start = e.values[14];
var End = e.values[15];
var StartTime = e.values[24];
var EndTime = e.values[25];
var Details = e.values[13];
var Cost = e.values[17];
var Email = e.values[18];
var ROname = e.values[19];
var ROemail = e.values[20];
var Location = e.values[23];
var subject = "Training Approval Request for " + Course;
var message = "<p >" + "Dear " + ROname + "<p />"
+ Name + " seeks your approval to attend the " + Course + ". The details are as follow:"
+ "<p >" + "<b>Date:</b> " + Start + " - " + End + " <br />"
+ "<b>Time:</b> " + StartTime + " - " + EndTime + " <br />"
+ "<b>Location:</b> " + Location + " <br />"
+ "<b>Course objectives and benefits:</b> " + Details + " <br />"
+ "<b>Course fees:</b> " + "$" + Cost + " <br />" + "<p />" 
+ "Please reply directly to this email for your approval or if you have any questions/comments. Thank you. "


MailApp.sendEmail(ROemail, Email, subject, message);
}

在将 findCourse 重新安排为自己的功能后:如果我在这里犯了任何错误,我很抱歉,但我会尽力遵循所有建议。如果我在 Logger.log(e) 中添加正确,这两个函数似乎都未定义

function sendEmail(e) {

 Logger.log(e);



var Name = e.values[2];
var Course = findCourse();
var Start = e.values[14];
var End = e.values[15];
var StartTime = e.values[24];
var EndTime = e.values[25];
var Details = e.values[13];
var Cost = e.values[17];
var Email = e.values[18];
var ROname = e.values[19];
var ROemail = e.values[20];
var Location = e.values[23];
var subject = "Training Approval Request for " + Course;
var message = "<p >" + "Dear " + ROname + "<p />"
+ Name + " seeks your approval to attend the " + Course + ". The details are as follow:"
+ "<p >" + "<b>Date:</b> " + Start + " - " + End + " <br />"
+ "<b>Time:</b> " + StartTime + " - " + EndTime + " <br />"
+ "<b>Location:</b> " + Location + " <br />"
+ "<b>Course objectives and benefits:</b> " + Details + " <br />"
+ "<b>Course fees:</b> " + "$" + Cost + " <br />" + "<p />" 
+ "Please reply directly to this email for your approval or if you have any questions/comments. Thank you. "


MailApp.sendEmail(ROemail, Email, subject, message);
}

 function findCourse (e){

  var courseToTake; 

  //loop through values 

  for ( var i = 4; i <=12; i ++){

       //pull value into variable 

       var value = e.values[i]; 



     if (value != undefined){

           //if we find an actual string value, set the course to take variable 

           courseToTake = value; 

        }

 }




  return courseToTake; 

 var courseToTake = findCourse(e);

Logger.log(e);

}

我将非常感谢这里的任何帮助或替代解决方案。

谢谢!

【问题讨论】:

  • 'e' 很可能是未定义的,因为没有参数传递给 findCourse() 函数。什么叫这个函数,你能把剩下的代码贴出来吗?
  • 这是完整的代码: function sendEmail(e) { function findCourse (e){ var courseToTake; //循环遍历值 for ( var i = 4; i
  • 您可以将此代码发布到您的帖子中,格式化吗?复制/粘贴非格式化代码很痛苦,尤其是当它包含 cmets 时。
  • 假设sendEmail 在表单提交时被调用,从sendEmail 函数中移除findCourse 函数并调用findCourse,将e 作为对象传入。在调用findCourse 之前,还要在你的sendEmail 函数中添加一个Logger.log(e),并检查日志以查看是否在那里定义了e,还要在findcourse 内记录e。回复您的发现
  • Yepp sendEmail 被表单提交触发器调用。抱歉,我能否澄清一下您调用 findCourse 的意思,将 e 作为对象传入?

标签: javascript google-apps-script


【解决方案1】:

我在您的代码中进行了哪些更改以解决您的问题:

  • 我将onFormSubmit 触发器分配给您的sendEmail 函数,因此事件对象将不再是未定义的
  • 我添加了对findCourse() 的调用,因此您的course 变量将不再是未定义的
  • 我通过将if(value != undefined) 更改为if(typeof value !== 'undefined') 来修复未定义检查
  • 我添加了一个空值检查(这是错误未定义检查后逻辑中的重要位)if(value != '')

解释:

要触发该事件,需要为指向您的sendEmail 函数的On Form Submit 事件设置一个可安装的触发器。这可以在Resources -&gt; Current Project Triggers中找到

要检索课程,您需要调用函数findCourse() 并传入e 事件对象。示例:var course = findCourse(e);。这会将findCourse(e); 的返回值分配给course 变量。然后,您可以在其余语句中正常使用此变量。

在检查undefined时,需要先使用typeof,然后再检查'undefined'这个字符串,否则你的检查会讽刺地抛出一个未定义的异常。

表单提交的值不应该是undefined,空值应该只是空字符串。因此需要检查非空字符串以从值数组中获取课程名称。

固定代码:

function sendEmail(e) {

 Logger.log(e) 


  var course = findCourse(e);

  var Name = e.values[19];
  var Start = e.values[12];
  var End = e.values[14];
  var StartTime = e.values[13];
  var EndTime = e.values[15];
  var Details = e.values[11];
  var Cost = e.values[17];
  var Email = e.values[20];
  var ROname = e.values[21];
  var ROemail = e.values[22];
  var Location = e.values[16];
  var subject = "Training Approval Request for " + course;
  var message = "<p >" + "Dear " + ROname + "<p />"
  + Name + " seeks your approval to attend the " + course + ". The details are as follow:"
  + "<p >" + "<b>Date:</b> " + Start + " - " + End + " <br />"
  + "<b>Time:</b> " + StartTime + " - " + EndTime + " <br />"
  + "<b>Location:</b> " + Location + " <br />"
  + "<b>Course objectives and benefits:</b> " + Details + " <br />"
  + "<b>Course fees:</b> " + "$" + Cost + " <br />" + "<p />" 
  + "Please reply directly to this email for your approval or if you have any questions/comments. Thank you. "

  MailApp.sendEmail(ROemail, Email+";" + "redactedEmail", subject, message);
}

function findCourse (e){
  var courseToTake; 

  //loop through values 
  for ( var i = 2; i <=10; i ++){   
    //pull value into variable 
    var value = e.values[i];             
    if (typeof value !== 'undefined'){ //If value is defined
      if(value != ''){ //If value is not blank
        //if we find an actual non-blank string value, set the course to take variable       
        courseToTake = value;           
      }   
    }   
  }  
  return courseToTake; 
}

【讨论】:

  • 感谢一百万用这些解释修复它,道格拉斯!
猜你喜欢
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多