Google Apps Script运行报错ReferenceError: wsd未定义问题咨询
错误原因
你遇到的ReferenceError: wsd is not defined报错本质是变量作用域限制:
你定义的wsd是importazione函数内的局部常量,它的可访问范围仅局限于importazione函数内部,包括函数内部嵌套的作用域。而scriviElenco是独立于importazione之外的顶层函数,没有权限访问其他函数内部定义的局部变量。
你之前的脚本能正常运行,大概率是之前的wsd是定义在所有函数之外的全局变量,全局变量可以被当前文件内的所有函数访问。
修复方案
方案1:将wsd作为参数传递给scriviElenco
修改两处代码即可:
- 调用
scriviElenco时传入wsd变量 - 定义
scriviElenco时新增参数接收wsd
修改后完整代码:
function importazione() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const wsd = ss.getSheetByName("morosi"); wsd.getRange(2,1,1000,10).clearContent(); SpreadsheetApp.flush(); const ws = ss.getSheetByName("importa"); const max_riga = ws.getLastRow(); var dati = ws.getRange(2, 1, max_riga-1, 6).getValues(); dati.forEach(r => { // 调用时传入wsd scriviElenco(wsd, { corso: r[0], ciclo: r[1], studente: r[2], status: r[4], id_matr: r[5] }); }); } // 新增wsd参数 function scriviElenco(wsd, passa) { if (passa.status === "NO PAGÓ") { var daSplittare = passa.corso+"|"+passa.studente+"|"+passa.id_matr; var riga = daSplittare.split("|"); wsd.appendRow(riga); }; }
方案2:合并逻辑到循环内,无需单独抽函数
如果scriviElenco没有其他地方复用,可以直接把逻辑写到forEach循环中,直接访问wsd变量,同时还能省略不必要的字符串拼接+拆分操作,提升运行效率:
function importazione() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const wsd = ss.getSheetByName("morosi"); wsd.getRange(2,1,1000,10).clearContent(); SpreadsheetApp.flush(); const ws = ss.getSheetByName("importa"); const max_riga = ws.getLastRow(); var dati = ws.getRange(2, 1, max_riga-1, 6).getValues(); dati.forEach(r => { if (r[4] === "NO PAGÓ") { const riga = [r[0], r[2], r[5]]; wsd.appendRow(riga); } }); }
内容的提问来源于stack exchange,提问作者LUCA DELLA GHEZZA
相关产品推荐
相关产品推荐

