基于Year和Hospital双条件的Billing Masterlist数据回显问题求助
问题:双条件搜索数据并回显至表单失败
已实现将「Data Entry Form」的数据提交至「Billing Masterlist」的功能,但点击Search按钮时,无法以「Data Entry Form」中C5单元格的Hospital、C6单元格的Year为双条件,从「Billing Masterlist」匹配对应数据并回显到表单中,现有代码无法正常运行。
现有代码:
var SPREADSHEET_NAME = "Billing Masterlist" var SEARCH_COL_year = 0; var SEARCH_COL_hospital = 1; function searchStr() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var formSS = ss.getSheetByName("Data Entry Form"); var hospital = formSS.getRange("C5").getValue(); var year = formSS.getRange("C6").getValue(); var values = ss.getSheetByName("Billing Masterlist").getDataRange().getValues(); var cont = 0; for (var i = 0; i < values.length; i++) { var row = values[i]; if ((row[SEARCH_COL_year] == year) || (row[SEARCH_COL_hospital] == hospital)) { var s = (8 + cont).toString(); formSS.getRange("D8")setValue(row[0]); formSS.getRange("B8")setValue(row[3]); formSS.getRange("B12:B25" + s).setValue(row[3]); formSS.getRange("E12:E25" + s)setValue(row[4]); formSS.getRange("F12:F25" + s)setValue(row[5]); cont = cont + 1; } } }
代码问题分析
- 条件逻辑错误:使用
||(逻辑或)而非&&(逻辑与),导致只要满足医院或年份其中一个条件就会匹配,不符合「双条件同时满足」的需求 - Range语法错误:
"B12:B25" + s会生成无效的单元格范围(例如B12:B258),无法正确定位到目标行 - 方法调用语法错误:
setValue前缺少.,例如formSS.getRange("D8")setValue(...)应为formSS.getRange("D8").setValue(...) - 数据覆盖问题:每次循环都会覆盖固定单元格(如D8、B8),无法实现多行数据的追加回显
- 未跳过表头:直接遍历所有行,可能将「Billing Masterlist」的表头行误判为数据行
修正后的代码
var SEARCH_COL_year = 0; var SEARCH_COL_hospital = 1; function searchStr() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var formSS = ss.getSheetByName("Data Entry Form"); var masterSS = ss.getSheetByName("Billing Masterlist"); // 获取搜索条件,去除医院名称前后空格避免匹配失败 var hospital = formSS.getRange("C5").getValue().trim(); var year = formSS.getRange("C6").getValue(); // 获取主表数据,跳过表头行(从第2行开始) var values = masterSS.getDataRange().getValues().slice(1); var cont = 0; // 清空表单原有回显数据,避免旧数据残留 formSS.getRange("B12:F25").clearContent(); for (var i = 0; i < values.length; i++) { var row = values[i]; // 双条件严格匹配:年份和医院同时符合 if (row[SEARCH_COL_year] == year && row[SEARCH_COL_hospital].trim() == hospital) { // 计算目标行:从第12行开始,每匹配一行往下偏移 var targetRow = 12 + cont; // 回显对应数据到表单指定单元格 formSS.getRange("B" + targetRow).setValue(row[3]); formSS.getRange("E" + targetRow).setValue(row[4]); formSS.getRange("F" + targetRow).setValue(row[5]); // 回显到B8、D8(若为单条汇总数据,多行场景可移除这两行) formSS.getRange("B8").setValue(row[3]); formSS.getRange("D8").setValue(row[0]); cont++; // 超过表单可显示的最大行数(B12到B25共14行)则停止循环 if (cont >= 14) break; } } }
关键修改说明
- 将条件判断改为
&&,确保年份和医院双条件同时满足 - 修正
setValue的调用语法,添加必要的. - 动态计算目标行
targetRow = 12 + cont,实现数据逐行追加回显 - 跳过主表表头(
slice(1)),避免匹配到表头行 - 增加
trim()处理医院名称,避免空格导致的匹配失败 - 新增清空原有数据的逻辑,避免旧数据残留
- 限制最大回显行数,防止超出表单的B12:F25范围
内容的提问来源于stack exchange,提问作者Cyril_Leonel
相关产品推荐
相关产品推荐

