Google Apps Script中rowIndex未传递至moveData函数问题排查
问题:谷歌表格数据迁移功能异常,点击Move按钮后首行被误迁移
我有一个"source"谷歌表格,希望将选中的数据迁移至"target"表格,实现move data功能:输入关键词搜索source表格首列的数据,匹配到的行会被展示,点击Move按钮即可将该行数据迁移至Target表格。
但当前点击Move按钮后,选中的行数据并未迁移至Target表格,反而Source表格的首行被误迁移至Target表格。通过控制台日志排查,结果显示:Invalid rowIndex: undefined,判断问题出在rowIndex变量未正确传递至moveData函数,调用时该变量为undefined。
现有代码
code.gs
function searchData(keyword) { var sourceSheet = SpreadsheetApp.openById('SOURCE_SHEETID').getSheetByName('dataSource'); var data = sourceSheet.getDataRange().getValues(); var matchingRows = []; for (var i = 0; i < data.length; i++) { if (data[i][0] === keyword) { // 假设关键词在首列 matchingRows.push(data[i]); } } return matchingRows; } function moveData(rowIndex) { if (rowIndex >= 0 && rowIndex < sourceSheet.getLastRow()) { console.log('Moving data from rowIndex:', rowIndex); var sourceSpreadsheetId = 'SOURCE_SHEETID'; var targetSpreadsheetId = 'TARGET_SHEETID'; var sourceSheetName = 'dataSource'; var targetSheetName = 'dataTarget'; // 打开源表格和目标表格 var sourceSpreadsheet = SpreadsheetApp.openById(sourceSpreadsheetId); var targetSpreadsheet = SpreadsheetApp.openById(targetSpreadsheetId); // 获取源工作表和目标工作表 var sourceSheet = sourceSpreadsheet.getSheetByName(sourceSheetName); var targetSheet = targetSpreadsheet.getSheetByName(targetSheetName); // 根据rowIndex获取要移动的数据 var dataToMove = sourceSheet.getRange(rowIndex + 1, 1, 1, sourceSheet.getLastColumn()).getValues(); // 将数据追加到目标表格 targetSheet.appendRow(dataToMove[0]); // 删除源表格中的该行 sourceSheet.deleteRow(rowIndex + 1); // 根据需要调整行号 } else { console.log('Invalid rowIndex:', rowIndex); } }
index.html
function searchAndMoveData() { var keyword = document.getElementById('keyword').value; google.script.run.withSuccessHandler(displaySearchResults).searchData(keyword); } function displaySearchResults(data) { var searchResultsDiv = document.getElementById('searchResults'); searchResultsDiv.innerHTML = ''; // 清空之前的结果 if (data.length === 0) { searchResultsDiv.innerHTML = 'No matching data found.'; } else { var table = '<table>'; for (var i = 0; i < data.length; i++) { table += '<tr><td>' + data[i].join('</td><td>') + '</td><td><input type="button" value="Move" onclick="confirmMove(' + i + ')"></td></tr>'; } table += '</table>'; searchResultsDiv.innerHTML = table; } } function confirmMove(rowIndex) { if (confirm('Are you sure you want to move this data?')) { google.script.run.moveData(rowIndex); } }
问题根源分析
- 行索引传递错误:前端传递给
moveData的rowIndex是搜索结果的索引(比如第一个匹配结果的索引是0),而非源表格中该行的真实行索引,导致moveData会错误操作源表格的首行(rowIndex + 1 = 1)。 - 变量声明顺序错误:
moveData函数中,判断rowIndex有效性时使用的sourceSheet变量尚未被声明,导致条件判断报错,最终进入分支打印Invalid rowIndex: undefined。
修复方案
1. 修改searchData函数,返回包含真实行索引的数据对象
让搜索结果同时携带源表格的真实行索引,确保后续能定位到正确的行:
function searchData(keyword) { var sourceSheet = SpreadsheetApp.openById('SOURCE_SHEETID').getSheetByName('dataSource'); var data = sourceSheet.getDataRange().getValues(); var matchingRows = []; for (var i = 0; i < data.length; i++) { if (data[i][0] === keyword) { // 存储真实行索引和对应数据 matchingRows.push({ rowIndex: i, data: data[i] }); } } return matchingRows; }
2. 修复moveData函数的变量声明顺序
先获取源工作表,再进行有效性判断,避免未定义变量报错:
function moveData(rowIndex) { var sourceSpreadsheetId = 'SOURCE_SHEETID'; var targetSpreadsheetId = 'TARGET_SHEETID'; var sourceSheetName = 'dataSource'; var targetSheetName = 'dataTarget'; // 先打开表格并获取工作表 var sourceSpreadsheet = SpreadsheetApp.openById(sourceSpreadsheetId); var targetSpreadsheet = SpreadsheetApp.openById(targetSpreadsheetId); var sourceSheet = sourceSpreadsheet.getSheetByName(sourceSheetName); var targetSheet = targetSpreadsheet.getSheetByName(targetSheetName); // 再判断rowIndex是否有效 if (rowIndex >= 0 && rowIndex < sourceSheet.getLastRow()) { console.log('Moving data from rowIndex:', rowIndex); var dataToMove = sourceSheet.getRange(rowIndex + 1, 1, 1, sourceSheet.getLastColumn()).getValues(); targetSheet.appendRow(dataToMove[0]); sourceSheet.deleteRow(rowIndex + 1); } else { console.log('Invalid rowIndex:', rowIndex); } }
3. 修改前端displaySearchResults函数,传递真实行索引
更新前端代码,使用搜索结果中的真实行索引调用moveData:
function displaySearchResults(results) { var searchResultsDiv = document.getElementById('searchResults'); searchResultsDiv.innerHTML = ''; if (results.length === 0) { searchResultsDiv.innerHTML = '未找到匹配数据。'; } else { var table = '<table>'; for (var i = 0; i < results.length; i++) { var rowData = results[i].data; var realRowIndex = results[i].rowIndex; table += '<tr><td>' + rowData.join('</td><td>') + '</td><td><input type="button" value="Move" onclick="confirmMove(' + realRowIndex + ')"></td></tr>'; } table += '</table>'; searchResultsDiv.innerHTML = table; } }
验证修复效果
修改后重新部署脚本:
- 输入关键词搜索,匹配结果会显示正确的行数据
- 点击Move按钮,会弹出确认框,确认后对应行数据会迁移至Target表格,同时从Source表格中删除该行
- 控制台不再输出
Invalid rowIndex: undefined的错误日志
内容的提问来源于stack exchange,提问作者Sathya
相关产品推荐
相关产品推荐

