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

如何结合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倍
  • 错误提示:加了请求失败的弹窗提示,方便你排查问题

使用注意事项

  1. 务必替换代码中的YOUR_CMC_API_KEY_HERE为你自己的CoinMarketCap API密钥
  2. 如果需要更多数据,可以调整TOTAL_PAGES的值(注意免费版的请求次数限制)
  3. 建议给脚本设置定时触发(比如每天更新一次),省得手动重复运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:08:48