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

如何减少Google Sheet中IMPORTJSON的API调用次数?

嘿,我瞅你现在的问题是脚本单次运行要调用23次API,这确实太费请求了——咱们可以从几个核心方向优化,直接把调用次数砍下来:

1. 用批量查询接口,一次请求所有币种(最极致优化)

CoinMarketCap支持一次请求拉取多个币种的数据,还能同时指定多种计价(EUR和BTC),这样整个脚本只需要1次API调用就能拿到所有需要的价格,直接把原来的20+次请求砍到1次!

先写个批量获取数据的辅助函数:

// 批量获取指定币种的EUR和BTC价格
function getAllCoinsData(coinIds) {
  const ids = coinIds.join(',');
  const url = `https://api.coinmarketcap.com/v2/ticker/?id=${ids}&convert=EUR,BTC`;
  const res = UrlFetchApp.fetch(url);
  const json = JSON.parse(res.getContentText());
  return json.data; // 返回格式:{ "币种ID": { ...包含价格数据... }, ... }
}

然后重构你的importCMC函数,用批量数据填充表格:

//Importing CMC Data into sheet
function importCMC() {
  // 把你需要的所有币种ID列在这里
  const targetCoinIds = [1, 1831, 2, 2010, 1958, 1376, 2566, 1785, 2130, 2507, 2645];
  // 一次请求拿到所有数据
  const allCoinData = getAllCoinsData(targetCoinIds);

  // 建立币种ID和表格行号的映射(对应你原来的B列和H列位置)
  const coinRowMapping = [
    { id: 1, row: 2 },    // BTC -> 第2行
    { id: 1831, row: 3 }, // BHC -> 第3行
    { id: 2, row: 4 },    // LTC -> 第4行
    { id: 2010, row: 5 }, // ADA -> 第5行
    { id: 1958, row: 6 }, // TRX -> 第6行
    { id: 1376, row: 7 }, // NEO -> 第7行
    { id: 2566, row: 8 }, // ONT -> 第8行
    { id: 1785, row: 9 }, // GAS -> 第9行
    { id: 2130, row: 10 },// ENJ -> 第10行
    { id: 2507, row: 11 },// TKY -> 第11行
    { id: 2645, row: 12 } // UUU -> 第12行(你原来的代码没写完,这里假设行号)
  ];

  // 循环填充每一行的价格
  coinRowMapping.forEach(item => {
    const coinInfo = allCoinData[item.id];
    if (coinInfo) {
      ss.getRange(`B${item.row}`).setValue(coinInfo.quotes.EUR.price);
      ss.getRange(`H${item.row}`).setValue(coinInfo.quotes.BTC.price);
    }
  });
}
2. 退而求其次:单个币种一次请求拿两种计价

如果暂时不想用批量接口,也可以修改每个币种的请求,一次同时获取EUR和BTC价格,把每个币种的2次请求降到1次,整体请求量直接砍半。

比如写个单币种的辅助函数:

// 获取单个币种的EUR和BTC价格
function getSingleCoinData(coinId) {
  const url = `https://api.coinmarketcap.com/v2/ticker/${coinId}/?convert=EUR,BTC`;
  const res = UrlFetchApp.fetch(url);
  const json = JSON.parse(res.getContentText());
  return {
    eurPrice: json.data.quotes.EUR.price,
    btcPrice: json.data.quotes.BTC.price
  };
}

然后在importCMC里调用:

function importCMC() {
  // BTC数据
  const btcData = getSingleCoinData(1);
  ss.getRange("B2").setValue(btcData.eurPrice);
  ss.getRange("H2").setValue(btcData.btcPrice);

  // BHC数据
  const bhcData = getSingleCoinData(1831);
  ss.getRange("B3").setValue(bhcData.eurPrice);
  ss.getRange("H3").setValue(bhcData.btcPrice);

  // 剩下的币种以此类推...
}
3. 额外优化:缓存请求结果(可选)

如果你的脚本会短时间内多次执行,可以用Google Apps Script的CacheService缓存API返回的数据,避免重复请求:

function getAllCoinsData(coinIds) {
  const cache = CacheService.getScriptCache();
  const cacheKey = `coin_batch_${coinIds.join(',')}`;
  const cachedResult = cache.get(cacheKey);

  // 如果有缓存,直接用缓存数据
  if (cachedResult) {
    return JSON.parse(cachedResult);
  }

  // 没有缓存就发起请求
  const ids = coinIds.join(',');
  const url = `https://api.coinmarketcap.com/v2/ticker/?id=${ids}&convert=EUR,BTC`;
  const res = UrlFetchApp.fetch(url);
  const json = JSON.parse(res.getContentText());
  
  // 缓存5分钟(300秒),可以根据需求调整时长
  cache.put(cacheKey, JSON.stringify(json.data), 300);
  return json.data;
}

这样短时间内重复执行脚本时,会直接读取缓存,不会再发起API请求,进一步减少调用次数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:54:02