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

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);
  }
}

问题根源分析

  1. 行索引传递错误:前端传递给moveData的rowIndex是搜索结果的索引(比如第一个匹配结果的索引是0),而非源表格中该行的真实行索引,导致moveData会错误操作源表格的首行(rowIndex + 1 = 1)。
  2. 变量声明顺序错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:23:10