如何结合Google Sheets调用CoinMarketCap API v2多请求合并数据
解决CoinMarketCap API v2分页与结构变更适配Google Sheets的问题
我完全懂你现在的困扰——API升级后分页限制和结构变化直接让原来的脚本没法用了,别慌,我给你整理了一套适配v2的方案,代码里加了超详细的注释,你跟着步骤来就行:
前置准备
首先得提醒你:CoinMarketCap v2及以后的API必须用API密钥才能调用,你得先去CoinMarketCap官网申请一个免费密钥(注意免费版有请求次数限制,合理设置更新频率就行)。
完整适配代码
function getMarketCap(sheetname) { // 1. 核心配置:替换成你的API密钥,按需调整请求页码数(12页就是1200条数据) const API_KEY = "YOUR_CMC_API_KEY_HERE"; const TOTAL_PAGES = 12; const CMC_API_URL = "https://pro-api.coinmarketcap.com/v2/cryptocurrency/listings/latest"; // 2. 初始化Google Sheets相关对象 const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName(sheetname); if (!sheet) { SpreadsheetApp.getUi().alert(`找不到名为${sheetname}的工作表!`); return; } // 3. 读取工作表中B列的币种ID const idRange = sheet.getRange("B1:B"); const lastRow = getLastRowOfRange(idRange); const cellRange = sheet.getRange(1, 2, lastRow).getValues(); const assets = cellRange.map(row => row[0]); // 把二维数组转成一维数组,方便后续处理 // 4. 分页请求并合并所有数据 let allCMCData = []; for (let page = 1; page <= TOTAL_PAGES; page++) { try { // 构建请求参数:分页参数+指定字段(减少返回数据量,提升速度) const params = { headers: { "X-CMC_PRO_API_KEY": API_KEY }, muteHttpExceptions: true // 开启后能捕获HTTP错误信息,方便调试 }; const requestUrl = `${CMC_API_URL}?page=${page}&limit=100&sort=market_cap&sort_dir=desc`; const response = UrlFetchApp.fetch(requestUrl, params); const responseJson = JSON.parse(response.getContentText()); // 检查请求是否成功 if (responseJson.status.error_code !== 0) { SpreadsheetApp.getUi().alert(`第${page}页请求失败:${responseJson.status.error_message}`); continue; } // 适配v2的结构:提取data对象下的币种数据数组 const pageData = Object.values(responseJson.data); allCMCData = [...allCMCData, ...pageData]; } catch (e) { SpreadsheetApp.getUi().alert(`请求第${page}页时出错:${e.message}`); } } // 5. 把数据转成「币种ID: 市值」的映射对象,匹配效率比嵌套循环高很多 const cmcDataMap = {}; allCMCData.forEach(item => { cmcDataMap[item.id] = item.quote.USD.market_cap; }); // 6. 匹配工作表中的币种ID,生成要填充的市值数据 const mcValues = assets.map(assetId => { // 找到对应ID就返回市值,没找到返回'xxx' return [cmcDataMap[assetId] || 'xxx']; }); // 7. 将数据写入工作表的C列 const mcRange = sheet.getRange(1, 3, lastRow); mcRange.setValues(mcValues); } // 保留你原来的获取有效行的工具函数 function getLastRowOfRange(range) { const values = range.getValues(); let lastRow = 0; for (let i = values.length - 1; i >= 0; i--) { if (values[i][0] !== "") { lastRow = i + 1; break; } } return lastRow; }
关键改动说明
- API认证:v2要求请求头携带API密钥,代码里的
API_KEY必须替换成你自己的密钥 - 分页处理:通过循环请求第1到第12页,每次拿100条数据,再合并成一个完整数据集
- 结构适配:v2返回的市值数据在
item.quote.USD.market_cap路径下(和v1的market_cap_usd不一样),而且数据包裹在response.data对象里,需要用Object.values()转成数组 - 效率优化:把合并后的数据转成映射对象,匹配时直接通过ID取值,比原来的嵌套循环快N倍
- 错误提示:加了请求失败的弹窗提示,方便你排查问题
使用注意事项
- 务必替换代码中的
YOUR_CMC_API_KEY_HERE为你自己的CoinMarketCap API密钥 - 如果需要更多数据,可以调整
TOTAL_PAGES的值(注意免费版的请求次数限制) - 建议给脚本设置定时触发(比如每天更新一次),省得手动重复运行
内容的提问来源于stack exchange,提问作者user4584963
相关产品推荐
相关产品推荐

