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
相关产品推荐
相关产品推荐

