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

Google Apps Script持续抛出“函数未定义”错误及表单脚本问题排查

Google Sheets脚本错误修复与功能完善

核心错误分析(触发"xxx is not a function"的原因)

  • 函数调用大小写不匹配:submitDerg中调用ClearBox(),但定义的函数是clearBox(),JavaScript严格区分大小写,导致找不到目标函数。
  • 错误使用concat函数:Google Apps Script无全局concat函数,字符串拼接应直接用+或模板字符串,该函数不存在会触发报错。
  • getRangeByName返回值处理错误:命名范围clear1若为单个区域,返回的是Range对象而非数组,调用forEach会报错(单个对象无此方法)。
  • 直接引用单元格变量:代码中直接写E13、G13等,未通过getRange获取值,这些变量未定义会触发错误。

其他关键问题

  • 赋值运算符替代比较运算符:所有if判断中使用=(赋值)而非===(严格比较),导致逻辑完全错误。
  • 二维数组嵌套错误:formSheet.getRange("F17:J17").getValues()返回二维数组,直接放入values会导致嵌套层级错误,无法正确写入单元格。
  • 范围列数不匹配:原代码中getRange(...,15)指定15列,但values数组实际元素数量不符,会触发写入错误。
  • 冗余的getRange()调用:range.getRange().clearContent()中,range已是Range对象,无需再次调用getRange()。

修正后的完整代码

/**
 * @OnlyCurrentDoc
 */

function clearBox() {
  const ss = SpreadsheetApp.getActive();
  const formSheet = ss.getActiveSheet();
  // 直接指定需要清除的单元格范围,避免命名范围问题
  const clearRanges = [
    "B13:F13", "H13:I13", "B15:C15", 
    "E15:F15", "H15:I15", "B17:D17", "F17:J17"
  ];
  clearRanges.forEach(rangeStr => {
    formSheet.getRange(rangeStr).clearContent();
  });
}

function submitDerg() {
  const ss = SpreadsheetApp.getActive();
  const formSheet = ss.getActiveSheet();

  // 获取表单各单元格值
  const f13Val = formSheet.getRange("F13").getValue();
  const e13Val = formSheet.getRange("E13").getValue();
  const g13Val = formSheet.getRange("G13").getValue();
  const i13Val = formSheet.getRange("I13").getValue();
  const h13Val = formSheet.getRange("H13").getValue();
  const j13Val = formSheet.getRange("J13").getValue();
  const c15Val = formSheet.getRange("C15").getValue();
  const d15Val = formSheet.getRange("D15").getValue();
  const f15Val = formSheet.getRange("F15").getValue();
  const e15Val = formSheet.getRange("E15").getValue();
  const g15Val = formSheet.getRange("G15").getValue();
  const i15Val = formSheet.getRange("I15").getValue();
  const h15Val = formSheet.getRange("H15").getValue();
  const j15Val = formSheet.getRange("J15").getValue();
  const d17Val = formSheet.getRange("D17").getValue();
  const c17Val = formSheet.getRange("C17").getValue();
  const e17Val = formSheet.getRange("E17").getValue();
  const l14Val = formSheet.getRange("L14").getValue();
  const l16Val = formSheet.getRange("L16").getValue();
  // 获取F17-J17的单个值,避免二维数组嵌套
  const f17Val = formSheet.getRange("F17").getValue();
  const g17Val = formSheet.getRange("G17").getValue();
  const h17Val = formSheet.getRange("H17").getValue();
  const i17Val = formSheet.getRange("I17").getValue();
  const j17Val = formSheet.getRange("J17").getValue();

  // 拼接各类数据
  let breedData;
  if (f13Val === 'price gem') {
    breedData = `${e13Val} - ${g13Val}g`;
  } else if (f13Val === 'price treasure') {
    breedData = `${e13Val} - ${g13Val}t`;
  } else {
    breedData = `${e13Val} - purchased`;
  }

  let eyeData;
  if (i13Val === 'price gem') {
    eyeData = `${h13Val} - ${j13Val}g`;
  } else if (i13Val === 'price treasure') {
    eyeData = `${h13Val} - ${j13Val}t`;
  } else {
    eyeData = `${h13Val} - purchased`;
  }

  let primData;
  if (c15Val === 'price gem') {
    primData = `${c15Val} - ${d15Val}g`;
  } else if (c15Val === 'price treasure') {
    primData = `${c15Val} - ${d15Val}t`;
  } else {
    primData = `${c15Val} - purchased`;
  }

  let secData;
  if (f15Val === 'price gem') {
    secData = `${e15Val} - ${g15Val}g`;
  } else if (f15Val === 'price treasure') {
    secData = `${e15Val} - ${g15Val}t`;
  } else {
    secData = `${e15Val} - purchased`;
  }

  let tertData;
  if (i15Val === 'price gem') {
    tertData = `${h15Val} - ${j15Val}g`;
  } else if (i15Val === 'price treasure') {
    tertData = `${h15Val} - ${j15Val}t`;
  } else {
    tertData = `${h15Val} - purchased`;
  }

  let poseData;
  if (d17Val === 'price gem') {
    poseData = `${c17Val} - ${e17Val}g`;
  } else if (d17Val === 'price treasure') {
    poseData = `${c17Val} - ${e17Val}t`;
  } else {
    poseData = `${c17Val} - purchased`;
  }

  // 构建要写入的一维数组,确保列数匹配
  const values = [
    breedData, eyeData, primData, secData, tertData, poseData,
    l14Val, l16Val, f17Val, g17Val, h17Val, i17Val, j17Val
  ];

  // 获取下一行并写入数据,自动匹配列数
  const nextRow = formSheet.getLastRow() + 1;
  formSheet.getRange(nextRow, 1, 1, values.length).setValues([values]);

  // 调用正确的清除函数
  clearBox();
}

修复说明

  1. 修正函数调用大小写,确保clearBox()正确调用。
  2. 替换concat为模板字符串${},实现字符串拼接。
  3. 直接指定清除范围数组,避免命名范围的不确定性问题。
  4. 所有单元格值通过getRange().getValue()获取,消除未定义变量错误。
  5. 将=替换为===,修正条件判断的逻辑错误。
  6. 拆分F17:J17的取值为单个单元格值,避免二维数组嵌套。
  7. 动态匹配写入范围的列数,确保数据正确写入。

内容的提问来源于stack exchange,提问作者Vynne Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:17:14