Apps Script Web App中根据名称对应的档案状态控制Div显示/隐藏的问题排查
问题分析与解决方案
看起来你遇到了两个核心问题:一是获取result元素内容时返回undefined,二是无法根据选择结果控制目标Div的显示/隐藏。咱们一步步来解决:
1. 为什么result会返回undefined?
你的result元素是<p id="result"></p>,这是一个段落标签,它没有value属性——value是输入类元素(比如input、select)的专属属性。要获取段落里的文本内容,应该用innerHTML或者textContent:
// 原错误代码 var result = document.getElementById("result").value; // 修改后(二选一即可) var result = document.getElementById("result").innerHTML; // 或者更安全的textContent(避免HTML解析问题) var result = document.getElementById("result").textContent.trim();
2. 优化Div显示控制的逻辑
其实不需要额外按钮触发,我们可以在showProfil的成功回调里直接处理Div的显示状态,这样用户选择下拉框时就能实时更新,体验更流畅:
修改你的JS代码:
<script> function showProfil(){ var name = document.getElementById("name").value; const divResultNo = document.getElementById("divResultNo"); google.script.run.withSuccessHandler(profil => { document.getElementById("result").innerHTML = profil; // 直接在这里控制Div显示/隐藏 if (profil === "no") { divResultNo.style.display = "block"; } else { divResultNo.style.display = "none"; } }).getProfil(name); } // 如果你仍想保留按钮测试功能,修改后的showDivResultNo: function showDivResultNo(){ var name = document.getElementById("name").value; var result = document.getElementById("result").textContent.trim(); console.log(result); const divResultNo = document.getElementById("divResultNo"); if (name && name !== "Choose ..." && result === "no"){ divResultNo.style.display = "block"; console.log("show div after that"); } else { divResultNo.style.display = "none"; console.log("div always hidden"); } } </script>
3. 修复服务端getProfil函数的潜在Bug
如果传入的name在Sheet中找不到,你的resultat变量没有初始化,会返回undefined,这会导致前端判断出错。我们可以初始化一个默认值,比如设为"no":
function getProfil(name){ const classeur = SpreadsheetApp.getActiveSpreadsheet(); const feuille = classeur.getSheetByName("Sheet1"); var tProfils = feuille.getRange("A2:B").getValues().filter(d =>d[0] !== ""); // 初始化默认结果为no var resultat = "no"; for (let i = 0; i < tProfils.length; i ++){ if(tProfils[i][0] == name){ // 找到匹配项时更新结果 resultat = tProfils[i][1] !== "" ? "yes" : "no"; // 找到后跳出循环,提升效率 break; } } return resultat; }
4. 初始状态设置
建议给divResultNo设置初始隐藏状态,避免页面加载时就显示:
<div id = "divResultNo" style="display: none;"> <h2> Result is "NO"</h2> </div>
这样修改后,当用户选择有档案的名称时,Div会自动隐藏;选择无档案的名称时,Div会自动显示,同时按钮测试功能也能正常工作啦。
内容的提问来源于stack exchange,提问作者devMethodes
相关产品推荐
相关产品推荐

