复制加密货币投资组合表格及脚本后遇TypeError报错求助
问题分析与解决方案
错误1:TypeError: Cannot read properties of null (reading 'getRange')
第17行报错说明myGoogleSheetName为null,即代码找不到名为Portfolio的工作表。常见原因:
- 复制后的表格中工作表名称拼写错误(比如大小写不一致,原表格是
Portfolio,复制后变成portfolio) - 工作表被删除或重命名
解决方法:
- 检查当前表格的工作表名称,确保存在完全匹配
Portfolio的工作表(注意大小写敏感) - 在代码开头添加存在性校验,提前抛出明确错误:
const myGoogleSheetName = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Portfolio'); if (!myGoogleSheetName) { throw new Error("找不到名为'Portfolio'的工作表,请检查名称是否正确"); }
错误2:TypeError: Cannot read properties of null (reading 'quote')
第31行报错说明API返回的数据中d.data[ticker]为null,可能原因:
- 输入的币种符号错误(拼写错误或CMC不识别该符号)
- API密钥权限不足(比如免费版限制了可访问的币种数量)
- 请求触发CMC API速率限制,返回错误响应
解决方法:
在处理API返回数据前添加校验,避免直接访问不存在的属性:
const d = JSON.parse(txt); const row = i + 6; // 校验数据完整性 if (!d.data || !d.data[ticker] || !d.data[ticker].quote?.USD) { myGoogleSheetName.getRange(row, 2).setValue('获取失败'); console.log(`币种${ticker}数据异常:${txt}`); continue; // 跳过当前币种,继续处理下一个 } myGoogleSheetName.getRange(row, 2).setValue(d.data[ticker].quote.USD.price);
完整修改后的代码
function coin_price() { const myGoogleSheetName = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Portfolio'); // 校验工作表是否存在 if (!myGoogleSheetName) { throw new Error("找不到名为'Portfolio'的工作表,请检查名称是否正确"); } const coinMarketCapAPICall = { method: "GET", headers: { "X-CMC_PRO_API_KEY": "YOUR-API-KEY" }, // 替换成你的CMC API密钥 muteHttpExceptions: true, // 允许捕获HTTP错误响应 } let myCoinSymbols = []; const getValues = myGoogleSheetName.getRange('A6:A').getValues(); const numRows = getValues.filter(symbol => symbol[0] !== "").length; const coinSymbols = getValues.slice(0, numRows); // 遍历币种 for (let i = 0; i < coinSymbols.length; i++) { const ticker = coinSymbols[i][0].trim(); // 去除符号前后空格 if (!ticker) continue; // 跳过空单元格 const coinMarketCapUrl = `https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=${ticker}&convert=USD`; const result = UrlFetchApp.fetch(coinMarketCapUrl, coinMarketCapAPICall); const txt = result.getContentText(); const d = JSON.parse(txt); const row = i + 6; // 校验API返回数据 if (!d.data || !d.data[ticker] || !d.data[ticker].quote?.USD) { myGoogleSheetName.getRange(row, 2).setValue('获取失败'); console.log(`币种${ticker}数据异常:${txt}`); Utilities.sleep(1000); // 避免请求过快触发限制 continue; } myGoogleSheetName.getRange(row, 2).setValue(d.data[ticker].quote.USD.price); Utilities.sleep(1000); // 每次请求后延迟1秒,符合CMC免费版速率限制 } }
额外注意事项
- 务必替换代码中的
YOUR-API-KEY为你自己的CMC Pro API密钥 - CMC免费版API有速率限制(每分钟最多10次请求),代码中添加了
Utilities.sleep(1000)控制请求间隔 - 检查A列的币种符号是否完全符合CMC的标准格式(比如ETH、BTC,注意大小写)
内容的提问来源于stack exchange,提问作者Austin Mourot
相关产品推荐
相关产品推荐

