You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:28:27