如何减少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
相关产品推荐
相关产品推荐

