Google Apps Script报错:Cannot set properties of undefined (setting 'FIRST_NAME')
问题原因
错误出在filter()方法的返回值上:filter()始终返回匹配元素组成的数组,哪怕只有一个匹配项,它也是数组类型。原代码中mail是数组,数组没有html属性,所以mail.html为undefined,尝试给undefined设置FIRST_NAME属性就会抛出TypeError。
解决方案
有两种修正方式:
方式1:使用find()代替filter()
find()会返回第一个匹配条件的单个对象,而非数组,直接可以访问html属性:
const EMAIL = [ { LANGUAGE : 'NL', HTML_TEMPLATE_FILE : 'MAIL_Invoice_NL', }, { LANGUAGE : 'EN', HTML_TEMPLATE_FILE : 'MAIL_Invoice_EN', } ] EMAIL.forEach((item) => { item.html = HtmlService.createTemplateFromFile(item.HTML_TEMPLATE_FILE) }) const customer = { language : 'EN', firstname: 'John' } // 用find获取单个匹配对象 const mail = EMAIL.find((item) => { return item.LANGUAGE == customer.language }) // 先判断是否找到匹配项,避免找不到时报错 if (mail) { mail.html.FIRST_NAME = customer.firstname }
方式2:保留filter(),但取数组第一个元素
如果需要保留filter()(比如可能有多个匹配项的场景),需要通过索引取数组内的对象:
// ... 前面代码不变 const mailList = EMAIL.filter((item) => { return item.LANGUAGE == customer.language }) // 检查数组是否有元素,再访问第一个元素的html属性 if (mailList.length > 0) { mailList[0].html.FIRST_NAME = customer.firstname }
为什么预先初始化
html属性没用 你之前尝试预先给EMAIL元素添加html: '',但问题的核心不是html属性是否存在,而是mail是数组,数组本身没有html属性,所以无论html是否预先初始化,mail.html始终是undefined,报错原因不会改变。
内容的提问来源于stack exchange,提问作者DarkLite1
相关产品推荐
相关产品推荐

