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

Google Apps Script表格导出:仅NON JV子表无法正常写入数据

问题:Google Apps Script中NON JV数据无法导出到对应子表

我编写了一段Google Apps Script,手动执行时会将源表格FOREX工作表的A2:M2行数据,根据L2单元格的值(NON JV/JV1/JV2)导出到目标表格对应的子表。目前JV1和JV2子表的导出功能正常,但当L2单元格值为NON JV时,脚本提示执行完成,却未在目标表格的NON JV子表中找到对应数据。

原代码如下:

function expo() 
{
  //Source link
  var ssraw = SpreadsheetApp.getActiveSpreadsheet();
  var sheetraw = ssraw.getSheetByName('FOREX');
  var range = sheetraw.getRange('A2:M2');
  var data = range.getValues();
  var datacheck=sheetraw.getRange('L2').getValue();

  if(datacheck=="JV1")
  {
  var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1BkEAF-4wF0Ok9za_0Pgmlb9Odu3_fNgU7vx0AqVBsYw/edit#gid=1641519106');
  var reqsheet = ss.getSheetByName("JV1");
  
  reqsheet.getRange(reqsheet.getLastRow()+1,1,1,13).clear();
  reqsheet.getRange(reqsheet.getLastRow()+1,1,1,13).setValues(data);
  }
  else if(datacheck=="JV2")
  {
  var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1BkEAF-4wF0Ok9za_0Pgmlb9Odu3_fNgU7vx0AqVBsYw/edit#gid=1056263168');
  var reqsheet = ss.getSheetByName("JV2");
  
  reqsheet.getRange(reqsheet.getLastRow()+1,1,1,13).clear();
  reqsheet.getRange(reqsheet.getLastRow()+1,1,1,13).setValues(data);
  } 
  else if(datacheck=="NON JV")
  {
  var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1BkEAF-4wF0Ok9za_0Pgmlb9Odu3_fNgU7vx0AqVBsYw/edit#gid=0')
  var reqsheet= ss.getSheetByName("NON JV");

  reqsheet.getRange(reqsheet.getLastRow()+1,1,1,13).clear();
  reqsheet.getRange(reqsheet.getLastRow()+1,1,1,13).setValues(data);
  }
}
function getLastRow(sheet,rangeString)
{var rng=sheet.getRange(rangeString).getValues();
  var lrIndex;
  for(var i=rng.length-1;i>=0;i--)
  {lrIndex=i;
  if(!rng[i].every(function(c){return c=="";})){break;}}
}

问题分析

  1. 核心错误:目标表格URL不匹配:NON JV分支中使用的目标表格URL与你提供的实际目标表不一致,导致数据被写入了错误的文档,而非你预期的表格。
  2. 冗余代码:未使用的getLastRow函数:该函数定义后未被调用,且无返回值,对当前逻辑无作用。
  3. 逻辑重复:多分支冗余代码:三个分支的导出逻辑高度重复,增加维护成本。

修复后的代码

function expo() {
  // 源表格数据获取
  const ssraw = SpreadsheetApp.getActiveSpreadsheet();
  const sheetraw = ssraw.getSheetByName('FOREX');
  const data = sheetraw.getRange('A2:M2').getValues();
  const datacheck = sheetraw.getRange('L2').getValue();

  // 统一管理目标表格配置
  const targetMap = {
    "JV1": {
      sheetUrl: "https://docs.google.com/spreadsheets/d/1BkEAF-4wF0Ok9za_0Pgmlb9Odu3_fNgU7vx0AqVBsYw/edit#gid=1641519106",
      sheetName: "JV1"
    },
    "JV2": {
      sheetUrl: "https://docs.google.com/spreadsheets/d/1BkEAF-4wF0Ok9za_0Pgmlb9Odu3_fNgU7vx0AqVBsYw/edit#gid=1056263168",
      sheetName: "JV2"
    },
    "NON JV": {
      sheetUrl: "https://docs.google.com/spreadsheets/d/1VQ__WsrJ8C8XVbyx1KsKxjHfVnDbUdReCIZMsedlBuc/edit#gid=0",
      sheetName: "NON JV"
    }
  };

  // 执行导出逻辑
  const targetConfig = targetMap[datacheck];
  if (!targetConfig) throw new Error(`不支持的类型:${datacheck}`);
  
  const targetSs = SpreadsheetApp.openByUrl(targetConfig.sheetUrl);
  const targetSheet = targetSs.getSheetByName(targetConfig.sheetName);
  if (!targetSheet) throw new Error(`未找到子表:${targetConfig.sheetName}`);
  
  const lastRow = targetSheet.getLastRow() + 1;
  // 若不需要清除单元格,可删除下面一行
  targetSheet.getRange(lastRow, 1, 1, 13).clear();
  targetSheet.getRange(lastRow, 1, 1, 13).setValues(data);
}

修复说明

  1. 修正目标URL:将NON JV分支的目标表格URL替换为你提供的正确链接,确保数据写入预期表格。
  2. 简化代码结构:用对象映射统一管理不同类型的目标配置,减少重复代码,便于后续修改。
  3. 增加错误校验:对不支持的类型、不存在的子表抛出明确错误,快速定位问题。
  4. 优化写入逻辑:提前获取最后一行索引,避免重复调用getLastRow()可能导致的位置偏移问题。

内容的提问来源于stack exchange,提问作者Anushka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:20:35