Google Apps Script表格数组转对象并创建子类实现股票拆股数据处理
代码调整方案
首先梳理现有代码的核心问题:
- 没有按股票代码做分组归集,所有记录都是独立输出,没有把同一只股票的所有日期数据汇总到对应股票的key下
- 未区分交易类型,
Split(拆股)类型的记录不需要存储成交价格,仅需要存储拆股比例 - 自定义对象结构缺少拆股比例字段,无法适配拆股记录的存储需求
调整后完整代码
// 定义统一的日期数据结构,同时支持交易记录和拆股记录 function StockDateRecord(date, type, quantity = null, price = null, splitRatio = null) { this.date = Utilities.formatDate(date, Session.getScriptTimeZone(), "M/d/yyyy"); if (type === 'Buy' || type === 'Sell') { this.transaction = { quantity: quantity, price: price } } else if (type === 'Split') { this.split = { splitRatio: splitRatio } } } function retrieveData() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const inputSheet = ss.getSheetByName('History'); // 读取所有有效行数据 const data = inputSheet.getRange(2, 1, inputSheet.getLastRow() - 1, 9).getValues(); // 过滤有效交易类型 const filtered = data.filter(row => ['Buy', 'Sell', 'Split'].includes(row[2])); // 按日期升序排序 const sorted = filtered.sort((a, b) => a[0].getTime() - b[0].getTime()); // 初始化最终输出对象,key为股票代码 const stockResult = {}; for (let row of sorted) { const date = row[0]; const type = row[2]; const symbol = row[1]; const quantity = row[3]; const price = row[4]; const splitRatio = row[5]; // 拆股比例所在列索引可根据实际表格调整 // 若该股票未在结果中初始化,先创建空数组存储记录 if (!stockResult[symbol]) { stockResult[symbol] = []; } // 生成对应记录推入数组 const record = new StockDateRecord(date, type, quantity, price, splitRatio); stockResult[symbol].push(record); } // 输出结果验证 console.log(stockResult); return stockResult; }
功能说明
- 新的
StockDateRecord构造函数会根据交易类型自动适配字段,交易记录存transaction对象,拆股记录存split对象,和你需要的结构完全匹配 - 最终输出的
stockResult对象的key就是股票代码,对应的值是该股票所有按日期排序的记录数组 - 日期统一格式化为你预期的
M/d/yyyy格式,避免时区偏差导致的日期显示异常 - 后续做拆股调整时,直接遍历对应股票的记录数组,按照你预设的规则计算即可
内容的提问来源于stack exchange,提问作者Pashtun
相关产品推荐
相关产品推荐

