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

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);

}

问题排查与修复建议

  1. 修复循环越界
    第一个排除标签页的循环使用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);
  };
};
  1. 修正行计数逻辑
    当前通过A列非空值计数numRows,若工作表A列存在空白行但其他列有数据,会导致范围获取不完整。改用getLastRow()获取实际最后一行:
let numRows = onglet_collab.getLastRow();
  1. 替换不安全的数组操作
    使用splice修改行数组存在维度不一致风险,直接赋值更安全:
// 原代码:onglet_boucle[j].splice(2, 1, "");
onglet_boucle[j][2] = "";

// 原代码:onglet_boucle[j].splice(1, 1, date);
onglet_boucle[j][1] = date;
  1. 定位目标工作表问题
    通过Logger.log(nom_onglets[4])确认第4个工作表名称,手动检查:
  • 是否存在隐藏列、保护范围导致无法写入?
  • 工作表列数是否与其他表一致?
  • 单元格是否有数据验证规则限制输入?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:39:50