Google Apps Script中getRange()报错排查求助
问题:执行ajouter_date_HT函数时循环i=4触发范围异常
执行ajouter_date_HT函数时,当循环变量i=4时,无论使用哪种方式获取工作表范围(getDataRange()、结合getLastRow/getLastColumn的getRange()或当前代码实现),都会抛出异常:
Exception: Click here and enter one of the range values Ajouter date HT.gs:35
尝试多种范围获取方式均无法解决,求助定位问题根源。
完整代码
function ajouter_date_HT() { // 此代码用于根据特定条件在协作标签页中添加HT和名义日期 var ss = SpreadsheetApp.getActiveSpreadsheet(); var onglets = ss.getSheets(); // 获取文件中的所有标签页 var nom_onglets = []; var onglets_a_retirer = ["Param", "HT", "Compilation", "FLArchivDe", "ANDON", "Liste", "Dérogations", "Base Formules", "ImportedData"]; // 指定需要排除的标签页 var date = new Date(); date.toLocaleDateString("fr"); var lignes_changees = ""; var formule_prio = '=IF(IFERROR(VLOOKUP("/!\\";F2;1;0)>0);"HOT Topic";IF(ISBLANK(N2);"";IFERROR(VLOOKUP(N2;ANDON!A:F;6;FALSE); "Nominal")))'; var formule_supplier = "=IF(E2=\"\";"";VLOOKUP(E2;'Base Formules'!A$2:B$241;2;FALSE))"; var formule_appareil = '=IF(ISBLANK(N2);"";IFNA(VLOOKUP(LEFT(N2;1);\'Base Formules\'!L$2:M$16;2;FALSE);IF(COUNTIF(\'Base Formules\'!L:M; LEFT(N2;2)*1)=0;"Divers";VLOOKUP(LEFT(N2;2)*1;\'Base Formules\'!L$2:M$16;2;FALSE))))'; var formule_BE = '=IF(ISBLANK(O2);"";IFERROR(IF(ISNUMBER(VALUE(LEFT(O2;1)));IFERROR(VLOOKUP(CONCATENATE(MID(O2;5;2);"-";MID(O2;1;3));IMPORTRANGE("https://docs.google.com/spreadsheets/d/1ZgkOBXbnZE3ZCMVzdAjsvsBTSZgplpnkkATOHb4TeNE/edit#gid=1697538978";"BNAé!$A$2:$H$500");8;FALSE);VLOOKUP(CONCATENATE(MID(O2;5;2);"-");IMPORTRANGE("https://docs.google.com/spreadsheets/d/1ZgkOBXbnZE3ZCMVzdAjsvsBTSZgplpnkkATOHb4TeNE/edit#gid=1697538978";"BNAé!$A$2:$H$500");8;FALSE));IFERROR(VLOOKUP(CONCATENATE(MID(O2;2;3);"-";MID(O2;1;1));IMPORTRANGE("https://docs.google.com/spreadsheets/d/1ZgkOBXbnZE3ZCMVzdAjsvsBTSZgplpnkkATOHb4TeNE/edit#gid=1697538978";"ATA!$A$2:$H$500");6;FALSE);IFERROR(VLOOKUP(MID(O2;2;3);IMPORTRANGE("https://docs.google.com/spreadsheets/d/1ZgkOBXbnZE3ZCMVzdAjsvsBTSZgplpnkkATOHb4TeNE/edit#gid=1697538978";"ATA!$A$2:$H$500");6;FALSE);VLOOKUP(MID(O2;2;2);IMPORTRANGE("https://docs.google.com/spreadsheets/d/1ZgkOBXbnZE3ZCMVzdAjsvsBTSZgplpnkkATOHb4TeNE/edit#gid=1697538978";"ATA!$A$2:$H$500");6;FALSE))));;"BE pas trouvé"))'; var formule_NC_mere = '=IF(D2<>"";"";IFERROR(IF(INDEX(ImportedData!M:M; MATCH(E2&"-"&O2&"-"&W2&"-"&X2; ImportedData!AP:AP; 0)) = L2; ""; INDEX(ImportedData!M:M; MATCH(E2&"-"&O2&"-"&W2&"-"&X2; ImportedData!AP:AP; 0))); "Pas de NC mère"))'; var formule_drive = '=IF(A2="Nominal"; ""; ' + 'IF(ISBLANK(L2); ""; ' + 'IFERROR(IF(COUNTIF(IMPORTRANGE("https://docs.google.com/spreadsheets/d/1VTyKEcgNiHfj3KUOAWqn_qIohGtWt4JOUMIarzo-Hkk/edit#gid=0"; "HT follow-up!E:E"); L2)>=1; "OUI"; "NON"))))'+ ''; var lien_fichier_BE = '=HYPERLINK("' + "https://docs.google.com/spreadsheets/d/1ZgkOBXbnZE3ZCMVzdAjsvsBTSZgplpnkkATOHb4TeNE/edit#gid=0" + '"; "' + "Responsable action NOM" + '")'; onglets.forEach(function (sheet) { // 仅获取标签页名称存入nom_onglets数组 nom_onglets.push(sheet.getName()); }); for (let i = 0; i <= onglets_a_retirer.length; i++){ // 循环排除不需要处理的标签页 let index = nom_onglets.indexOf(onglets_a_retirer[i]); if (index > -1) { // 仅当找到对应元素时移除 nom_onglets.splice(index, 1); }; }; for (let i = 0; i < nom_onglets.length; i++){ // 循环处理每个目标标签页 let onglet_collab = ss.getSheetByName(nom_onglets[i]); Logger.log(nom_onglets[i]); let numRows = onglet_collab.getRange("A:A").getValues().filter(String).length; let numCols = onglet_collab.getLastColumn(); let onglet_data_range = onglet_collab.getRange(1, 1, numRows, numCols); let onglet_boucle = onglet_data_range.getValues(); for (let j = 1; j < onglet_boucle.length; j++){ // 循环处理标签页的每一行 if(onglet_boucle[j][3] == "" && onglet_boucle[j][32] == "" && onglet_boucle[j][34] != "DA Refused"){ // 排除CO、已关闭或已拒绝的行 let prio = onglet_boucle[j][0]; // 获取行的优先级 let date_HT = onglet_boucle[j][1]; // 获取行的HT日期 let date_nominale = onglet_boucle[j][2]; // 获取行的名义日期 if (prio == "" && date_HT == "" && date_nominale == ""){ // 空行不处理 } else if (prio != "Nominal" && date_HT != "" && date_nominale != ""){ // HT行同时有HT日期和名义日期时,删除名义日期 onglet_boucle[j].splice(2, 1, ""); lignes_changees += "- onglet " + nom_onglets[i] + " ligne " + (j + 1) + "\n"; } else if (prio != "Nominal" && date_HT == ""){ // HT行无HT日期时,添加当前日期 onglet_boucle[j].splice(1, 1, date); lignes_changees += "- onglet " + nom_onglets[i] + " ligne " + (j + 1) + "\n"; } else if (prio == "Nominal" && date_HT != "" && date_nominale == ""){ // Nominal行有HT日期但无名义日期时,添加当前日期 onglet_boucle[j].splice(2, 1, date); lignes_changees += "- onglet " + nom_onglets[i] + " ligne " + (j + 1) + "\n"; } } } Logger.log(onglet_boucle.length + " " + onglet_boucle[0].length); onglet_collab.getRange(1, 1, onglet_boucle.length, onglet_boucle[0].length).setValues(onglet_boucle); if(nom_onglets[i] != "Damien" && nom_onglets[i] != "Christophe"){ // Damien和Christophe标签页不应用此公式 onglet_collab.getRange("U2:U").setFormula(formule_BE); } onglet_collab.getRange("A2:A").setFormula(formule_prio); onglet_collab.getRange("F2:F").setFormula(formule_supplier); onglet_collab.getRange("P2:P").setFormula(formule_appareil); onglet_collab.getRange("AA2:AA").setFormula(formule_NC_mere); onglet_collab.getRange("AN2:AN").setFormula(formule_drive); onglet_collab.getRange("U1").setFormula(lien_fichier_BE); } Logger.log(lignes_changees); }
问题排查与修复建议
- 修复循环越界
第一个排除标签页的循环使用i <= onglets_a_retirer.length,会导致i等于数组长度时访问undefined值,应改为:
for (let i = 0; i < onglets_a_retirer.length; i++){ let index = nom_onglets.indexOf(onglets_a_retirer[i]); if (index > -1) { nom_onglets.splice(index, 1); }; };
- 修正行计数逻辑
当前通过A列非空值计数numRows,若工作表A列存在空白行但其他列有数据,会导致范围获取不完整。改用getLastRow()获取实际最后一行:
let numRows = onglet_collab.getLastRow();
- 替换不安全的数组操作
使用splice修改行数组存在维度不一致风险,直接赋值更安全:
// 原代码:onglet_boucle[j].splice(2, 1, ""); onglet_boucle[j][2] = ""; // 原代码:onglet_boucle[j].splice(1, 1, date); onglet_boucle[j][1] = date;
- 定位目标工作表问题
通过Logger.log(nom_onglets[4])确认第4个工作表名称,手动检查:
- 是否存在隐藏列、保护范围导致无法写入?
- 工作表列数是否与其他表一致?
- 单元格是否有数据验证规则限制输入?
内容的提问来源于stack exchange,提问作者matpic
相关产品推荐
相关产品推荐

