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

Google Apps Script中setValues因length未定义报错的解决方案咨询

解决Google Apps Script中setValues因空数组抛出TypeError的问题

这个报错的核心原因很清晰:当你的某个列表(比如dsmSO)没有新增内容时,它会变成空数组[],此时你尝试访问dsmSO[0].length,但dsmSO[0]是undefined,自然找不到length属性,直接抛出错误中断函数执行。

可行的规避方案

我们只需要在调用setValues之前,先判断目标数组是否非空。如果数组为空,要么跳过该部分的写入操作,要么主动清空对应的数据区域(避免旧数据残留),这样就能彻底避免报错。

修改后的完整代码

function finalCode(){
 var ss = SpreadsheetApp.getActive();
 var control = ss.getSheetByName("Control");
 var sold = ss.getSheetByName("Sold");
 // Speacial Order Parts Range
 var newPart = control.getRange(2,2,control.getLastRow() -1,9).getValues();
 // Sold Parts Range
 var soldPart = sold.getRange(2,3,sold.getLastRow() - 1,4).getValues();
 // Results Sheet
 var rs = ss.getSheetByName("Results")
 var dsmReorder = [];
 var dsmSO = [];
 var oReorder = [];
 var oSO = [];
 // DsM Sold Loop
 for(var i = 2; i<soldPart.length;i++){
 if(soldPart[i][3] == ''){
 if(soldPart[i][0] != 'Kurt'){
 dsmReorder.push([soldPart[i][0],soldPart[i][1],soldPart[i][2]])}
 else if(soldPart[i][0] == 'Kurt'){
 oReorder.push([soldPart[i][1],soldPart[i][2]])}
 var d = new Date();
 sold.getRange(i + 2,6).setValue(d);
 }
 }
 for(var l = 2; l<newPart.length;l++){
 if(newPart[l][7] == ''){
 if(newPart[l][1] == 'New Item/Special Order'){
 if(newPart[l][0] != 'kurt@metrolockdm.com'){
 dsmSO.push([newPart[l][0],newPart[l][6]])}
 else if(newPart[l][0] == 'kurt@metrolockdm.com'){
 oSO.push([newPart[l][6]])}
 var d = new Date();
 control.getRange(l + 2,9).setValue(d)
 }
 }
 }

// 处理dsmSO:先判断数组是否非空
if (dsmSO.length > 0) {
  rs.getRange(2,2,dsmSO.length,dsmSO[0].length).setValues(dsmSO);
} else {
  // 可选:清空B2:C区域的旧数据,避免残留
  rs.getRange("B2:C" + rs.getLastRow()).clearContent();
}
rs.getRange("B2:C").sort(3);

// 处理dsmReorder
if (dsmReorder.length > 0) {
  rs.getRange(2,6,dsmReorder.length,dsmReorder[0].length).setValues(dsmReorder);
} else {
  rs.getRange("F2:H" + rs.getLastRow()).clearContent();
}
rs.getRange("F2:H").sort(7);

// 处理oSO
if (oSO.length > 0) {
  rs.getRange(2,10,oSO.length,oSO[0].length).setValues(oSO);
} else {
  rs.getRange("J2:J" + rs.getLastRow()).clearContent();
}
rs.getRange("J2:J").sort(10);

// 处理oReorder
if (oReorder.length > 0) {
  rs.getRange(2,12,oReorder.length,oReorder[0].length).setValues(oReorder);
} else {
  rs.getRange("L2:O" + rs.getLastRow()).clearContent();
}
rs.getRange("L2:O").sort(12);
}

额外小提示

你的循环起始索引从2开始(比如for(var i = 2; i<soldPart.length;i++)),这会跳过数组的前两个元素(索引0和1),如果这不是你的预期逻辑,可能需要调整起始值为0哦。

内容的提问来源于stack exchange,提问作者Kurt Bingham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:07:41