使用Apps Script在Google Sheet标签页间读写值遇TypeError报错求助
这个错误我之前处理过不少次,核心原因几乎都是你尝试访问的数组(或者范围值)根本没被正确获取到,变成了undefined,随后你又试图去读取它的索引(比如[0][0]这类操作),就会抛出这个报错。结合你是在POTemplate和POHistory两个标签页之间做范围读写操作,给你几个针对性的排查方向:
先检查工作表名称是否完全匹配:Google Sheets对工作表名称的大小写、空格、特殊符号极度敏感,比如你代码里写的是
POTemplate,但实际表名是PO Template(带空格),或者大小写不一致,getSheetByName()就会直接返回undefined,后续操作这个不存在的工作表对象自然会报错。建议先给获取工作表的代码加个校验:const potSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("POTemplate"); const pohSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("POHistory"); // 校验工作表是否存在 if (!potSheet || !pohSheet) { throw new Error("找不到指定的工作表,请检查名称是否完全匹配(注意大小写、空格)"); }确认getRange的范围是否有效:如果工作表没问题,那大概率是获取数据范围时出错了——比如动态计算的行号/列号为0、负数,或者超出了工作表实际有数据的范围。举个例子,如果你用
getLastRow()获取最后一行,但目标工作表是空的,getLastRow()会返回0,此时getRange(1,1,lastRow,lastCol).getValues()得到的是空数组,之后你试图访问data[0][0]就会触发这个错误。直接定位第39行代码:报错明确指向第39行,你可以直接查看这一行的具体操作。比如如果是
targetCell.setValue(sourceData[0][0])这种写法,那大概率sourceData是undefined或者空数组。建议在这行代码前加个日志输出,运行后查看日志就能快速定位问题:// 第39行前的日志 console.log("待读取的数据源:", sourceData); // 第39行代码 targetCell.setValue(sourceData[0][0]);
如果能把第39行附近的代码片段贴出来,我还能帮你更精准地定位问题~
内容的提问来源于stack exchange,提问作者Eric K.

