Google Apps Script双表单同一卡车数据存入同一行求助
卡车数据录入系统修改需求
我正在搭建一个卡车数据录入系统,包含港口表单、堆场表单和一个数据存储Sheet。流程是港口人员先录入卡车基础数据,等卡车到堆场后,堆场人员需要补充数据到存储Sheet中对应同一卡车编号的行,完善运输详情。但当前代码只能把数据写入空行,没法定位到对应卡车编号的行更新,求修改方案。
现有代码
if (validateEntry()==true) { var blankRow=datasheet.getLastRow()+1; datasheet.getRange(blankRow,12).setValue(shSutForm.getRange("D8").getValue()); datasheet.getRange(blankRow,13).setValue(shSutForm.getRange("D10").getValue()); datasheet.getRange(blankRow,14).setValue(shSutForm.getRange("D16").getValue()); datasheet.getRange(blankRow,15).setValue(shSutForm.getRange("D18").getValue()); datasheet.getRange(blankRow,16).setValue(shSutForm.getRange("D20").getValue()); datasheet.getRange(blankRow,17).setValue(shSutForm.getRange("H8").getValue()); datasheet.getRange(blankRow,18).setValue(shSutForm.getRange("H10").getValue()); datasheet.getRange(blankRow,21).setValue(shSutForm.getRange("H16").getValue()); datasheet.getRange(blankRow,22).setValue(shSutForm.getRange("H18").getValue()); datasheet.getRange(blankRow,23).setValue(shSutForm.getRange("H20").getValue()); datasheet.getRange(blankRow,19).setValue(shSutForm.getRange("L8").getValue()); datasheet.getRange(blankRow,20).setValue(shSutForm.getRange("L10").getValue()); ui.alert('TRUCK DATA SAVED'); shSutForm.getRange("D8").clear(); shSutForm.getRange("D10").clear(); shSutForm.getRange("D16").clear(); shSutForm.getRange("D18").clear(); shSutForm.getRange("D20").clear(); shSutForm.getRange("H8").clear(); shSutForm.getRange("H10").clear(); shSutForm.getRange("H16").clear(); shSutForm.getRange("H18").clear(); shSutForm.getRange("H20").clear(); shSutForm.getRange("L8").clear(); shSutForm.getRange("L10").clear(); } }
修改方案
核心思路是先通过卡车编号在存储Sheet中找到匹配行,再更新对应单元格;如果找不到匹配行,再写入新行(可选)。
步骤1:获取待匹配的卡车编号
假设堆场表单中卡车编号的输入单元格为D6(请根据实际表单调整),先获取该值:
var truckId = shSutForm.getRange("D6").getValue(); // 替换为实际卡车编号单元格 if (!truckId) { ui.alert('请输入卡车编号'); return; }
步骤2:查找存储Sheet中的匹配行
方法1:遍历数据查找(适合小数据量)
获取存储Sheet的所有数据,遍历找到对应卡车编号的行:
var dataRange = datasheet.getDataRange(); var values = dataRange.getValues(); var targetRow = -1; // 假设卡车编号存储在第1列(A列),实际列需替换为对应索引(列号-1) var truckIdColumnIndex = 0; for (var i = 0; i < values.length; i++) { if (values[i][truckIdColumnIndex] == truckId) { targetRow = i + 1; // 转换为Sheet行号(索引从0开始,行号从1开始) break; } }
方法2:用TextFinder查找(适合大数据量,效率更高)
var textFinder = datasheet.createTextFinder(truckId).matchEntireCell(true); var findResult = textFinder.findNext(); var targetRow = findResult ? findResult.getRow() : -1;
步骤3:更新匹配行或写入新行
将原有代码中的blankRow替换为找到的匹配行,未找到则保留写入新行的逻辑:
if (validateEntry() == true) { var truckId = shSutForm.getRange("D6").getValue(); // 替换为实际卡车编号单元格 if (!truckId) { ui.alert('请输入卡车编号'); return; } // 查找匹配行(这里用TextFinder示例,也可替换为遍历方式) var textFinder = datasheet.createTextFinder(truckId).matchEntireCell(true); var findResult = textFinder.findNext(); var targetRow = findResult ? findResult.getRow() : -1; // 确定写入行:找到匹配行用targetRow,否则用新行 var writeRow = targetRow !== -1 ? targetRow : datasheet.getLastRow() + 1; // 更新数据(原有写入逻辑,替换blankRow为writeRow) datasheet.getRange(writeRow,12).setValue(shSutForm.getRange("D8").getValue()); datasheet.getRange(writeRow,13).setValue(shSutForm.getRange("D10").getValue()); datasheet.getRange(writeRow,14).setValue(shSutForm.getRange("D16").getValue()); datasheet.getRange(writeRow,15).setValue(shSutForm.getRange("D18").getValue()); datasheet.getRange(writeRow,16).setValue(shSutForm.getRange("D20").getValue()); datasheet.getRange(writeRow,17).setValue(shSutForm.getRange("H8").getValue()); datasheet.getRange(writeRow,18).setValue(shSutForm.getRange("H10").getValue()); datasheet.getRange(writeRow,21).setValue(shSutForm.getRange("H16").getValue()); datasheet.getRange(writeRow,22).setValue(shSutForm.getRange("H18").getValue()); datasheet.getRange(writeRow,23).setValue(shSutForm.getRange("H20").getValue()); datasheet.getRange(writeRow,19).setValue(shSutForm.getRange("L8").getValue()); datasheet.getRange(writeRow,20).setValue(shSutForm.getRange("L10").getValue()); // 调整提示信息 var alertMsg = targetRow !== -1 ? '卡车数据已更新' : 'TRUCK DATA SAVED'; ui.alert(alertMsg); // 清空表单(原有逻辑不变) shSutForm.getRange("D8").clear(); shSutForm.getRange("D10").clear(); shSutForm.getRange("D16").clear(); shSutForm.getRange("D18").clear(); shSutForm.getRange("D20").clear(); shSutForm.getRange("H8").clear(); shSutForm.getRange("H10").clear(); shSutForm.getRange("H16").clear(); shSutForm.getRange("H18").clear(); shSutForm.getRange("H20").clear(); shSutForm.getRange("L8").clear(); shSutForm.getRange("L10").clear(); }
关键注意事项
- 卡车编号列索引:必须替换为存储Sheet中卡车编号实际所在列的索引(如A列对应0,B列对应1);
- 表单卡车编号单元格:替换为堆场表单中用户输入卡车编号的实际位置;
- 重复匹配处理:如果存在多个相同卡车编号的行,上述代码只会更新第一个匹配行,若需处理重复编号,可添加额外逻辑(如提示用户或更新所有匹配行)。
内容的提问来源于stack exchange,提问作者NIKO MWAKALINGA
相关产品推荐
相关产品推荐

