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

Apps Script服务端返回值写入前端控件显示undefined问题

问题原因

google.script.run 是Apps Script前端与服务端通信的异步API,调用后不会同步阻塞等待服务端返回结果,因此直接用变量接收调用返回值永远会得到undefined。另外你的服务端ajoutLigne函数中还存在ui变量未定义的隐藏bug,直接运行会抛出异常。

修复方案

你需要通过withSuccessHandler()绑定结果回调函数,服务端执行完成后会自动把返回值传入回调,再执行DOM更新操作即可。

1. 修正服务端Code.gs代码

补全ajoutLigne中缺失的UI实例定义,其余逻辑可保持不变:

function include(filename){
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}

function ajoutLigne() {
  const classeur = SpreadsheetApp.getActiveSpreadsheet();
  const feuille = classeur.getActiveSheet();
  // 补全缺失的ui实例定义
  const ui = SpreadsheetApp.getUi();
  const widget = HtmlService.createTemplateFromFile("widget.html").evaluate();
  widget.setWidth(600);
  widget.setHeight(600);
  // 先设置宽高再弹出对话框,避免尺寸配置不生效
  ui.showModalDialog(widget, "Ajout d'une nouvelle ligne");
}

function getLibelle(codeArticle){
  const classeur = SpreadsheetApp.getActiveSpreadsheet();
  const feuille = classeur.getSheetByName("BASE ARTICLE");
  const lastRow = feuille.getLastRow();
  const tDonnees = feuille.getRange("B2:C"+lastRow).getValues();
  const nbDonnees = tDonnees.filter(String).length;
  let result = "";
  for (let i = 0; i < nbDonnees; i ++){
    if(tDonnees[i][0] == codeArticle){
      result =  tDonnees[i][1];
      // 找到匹配项直接跳出循环,减少无效遍历
      break;
    }
  }
  return result;
}

2. 修正前端JavaScript.html代码

替换原有同步赋值的写法,用成功回调接收服务端返回结果:

<script>
function rechercheLibelle(){
  const codeArticle = document.getElementById("codeArticle").value.trim();
  // 输入非空校验
  if(!codeArticle) {
    document.getElementById("libelle").textContent = "请输入商品编码";
    return;
  }
  google.script.run
    // 绑定成功回调,服务端返回结果后自动执行
    .withSuccessHandler(function(libelleResult){
      console.log(libelleResult);
      // 将返回结果渲染到页面
      document.getElementById("libelle").textContent = libelleResult || "未找到对应编码的商品";
    })
    // 可选:绑定失败回调,处理服务端报错场景
    .withFailureHandler(function(err){
      console.error("查询出错:", err);
      document.getElementById("libelle").textContent = "查询失败,请重试";
    })
    .getLibelle(codeArticle);
}
</script>

widget.html无需修改,保持原有代码即可正常运行。

补充优化建议

如果商品基础数据量较大,建议优化getLibelle函数的查询逻辑,无需全量拉取表格数据后循环遍历,可以直接用Range的createTextFinder方法在工作表中直接匹配编码,执行效率会有明显提升。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:15:27