Google Sheets脚本遍历股票代码导出100行谷歌财经时序数据咨询
问题原因
你的代码只能粘贴第一行是两个错误导致的:
- 读取
A5:G254数据时末尾加了[0],getValues()返回的是对应区间的二维数组,[0]代表只取第一行数据 - 原
pasteData函数的逻辑是为单行数据设计的,只能逐单元格写入单行内容
另外你需要添加强制刷新逻辑,保证谷歌财经API拉取数据、公式计算完成后再复制结果,避免拿到空值或者旧数据。
修改后的完整代码
function getNewPrices() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const tickerSheet = ss.getSheetByName('Tickers'); const dataSheet = ss.getSheetByName('Data'); const resultsSheet = ss.getSheetByName('Results'); let data; let myListOfTickers = tickerSheet.getRange('B2:B51').getValues().filter(String).sort(); myListOfTickers.forEach(ticker => { dataSheet.getRange('A2').setValue(ticker[0]); // 强制刷新表格,等待谷歌财经数据加载、公式计算完成 SpreadsheetApp.flush(); // 移除[0]获取全量数据,同时过滤掉区间内的空行 data = dataSheet.getRange('A5:G254').getValues().filter(row => row.join('').trim() !== ''); pasteData(resultsSheet, data); }); }; function pasteData(resultsSheet,data){ // 无有效数据直接跳过 if(!data || data.length === 0) return; const nextRow = resultsSheet.getLastRow() + 1; const rowCount = data.length; const colCount = data[0].length; // 批量写入多行数据,效率远高于逐单元格写入 resultsSheet.getRange(nextRow, 1, rowCount, colCount).setValues(data); };
改动说明
- 移除了取数逻辑中的
[0],可以拿到A5:G254区间的全部100行数据 - 新增
SpreadsheetApp.flush()触发表格全量计算,确保复制到的是对应股票的最新数据 - 新增空行过滤逻辑,部分股票如果历史数据不足100行时,不会把区间内的空行粘贴到结果表
- 重写了粘贴逻辑,直接用
setValues()批量写入多行数据,运行效率比原来的循环写入提升几十倍
内容的提问来源于stack exchange,提问作者user3786240
相关产品推荐
相关产品推荐

