Google Apps Script调用SimilarWeb API报错:参数不足(第206行)求助
解决SimilarWeb API流量查询脚本的参数不足错误
错误原因分析
报错“Error: Not enough arguments (line 206)”本质是数组越界访问:在calculateTraffic函数中,当传入的rank值小于等于data数组第一个元素的rank(即0)时,循环会直接触发data[i][0] >= rank(i=0),此时尝试访问data[i-1](即data[-1]),这在JavaScript中是无效的,会导致参数不足的错误。另外,表格中使用=getTraffic({domain})的语法错误,大括号是数组字面量,应该直接传入字符串格式的域名。
修复步骤
1. 修正表格函数调用语法
在Google表格中调用函数时,直接传入字符串格式的域名,不要用大括号:
=getTraffic("example.com")
2. 修复calculateTraffic函数的数组越界问题
修改calculateTraffic函数,添加对rank小于等于0的情况处理,同时优化循环逻辑避免索引越界:
function calculateTraffic(rank) { if (rank > 3079440) { return "Not Enough Traffic"; } // 处理rank小于等于0的特殊情况,直接返回最高流量区间值 if (rank <= 0) { return 86400000000; } const data = [ [0, 86400000000], [20, 1400000000], [118, 200000000], [207, 113000000], [336, 85000000], [1068, 43000000], [1564, 26000000], [2818, 24000000], [3653, 11000000], [6000, 8000000], [13465, 3000000], [17734, 2000000], [22000, 4000000], [57316, 773400], [111510, 300000], [141314, 420000], [513447, 50000], [1539720, 27000], [3079440, 13000], ]; let lowerBound = data[0][0]; let upperBound = data[0][0]; let lowerTraffic = data[0][1]; let upperTraffic = data[0][1]; // 遍历找到对应的区间 for (let i = 1; i < data.length; i++) { if (rank <= data[i][0]) { upperBound = data[i][0]; upperTraffic = data[i][1]; lowerBound = data[i-1][0]; lowerTraffic = data[i-1][1]; break; } // 如果遍历到最后一个元素还没找到,说明rank在最后一个区间内 if (i === data.length - 1) { lowerBound = data[i][0]; lowerTraffic = data[i][1]; upperBound = data[i][0]; upperTraffic = data[i][1]; } } if (rank === 5) { return (lowerTraffic + upperTraffic) / 4; } else if (rank === 10) { return (lowerTraffic + upperTraffic) / 2; } else if (rank === 15) { return (lowerTraffic + upperTraffic) * (3 / 4); } else { // 避免除数为0的情况 if (upperBound === lowerBound) { return lowerTraffic; } return lowerTraffic + (rank - lowerBound) * (upperTraffic - lowerTraffic) / (upperBound - lowerBound); } }
3. 额外优化:修正JSDoc注释错误
原代码的JSDoc注释参数和返回值描述错误,建议修改为:
/** * 获取指定域名的流量估算数据 * * @param {string} domain - 要查询的域名(如"example.com") * @return {Array} 包含排名和估算流量的二维数组 * @customfunction */
完整修复后的代码
// Set-up // 1. 替换`similarWeb_api_key`为你的SimilarWeb API密钥 // 替换后格式如下: // const similarWeb_api_key = "XXXXXXXXXXXXXXXXXXXXXXX" const similarWeb_api_key = "YOUR_API_KEY" // 2. 保存Apps Script项目 // // 3. 在表格中使用函数:=getTraffic("example.com") /** * 获取指定域名的流量估算数据 * * @param {string} domain - 要查询的域名(如"example.com") * @return {Array} 包含排名和估算流量的二维数组 * @customfunction */ function getTraffic(domain) { var url = "https://api.similarweb.com/v1/similar-rank/"+domain+"/rank?api_key=" + similarWeb_api_key; var options = { "muteHttpExceptions": true, } var response = UrlFetchApp.fetch(url, options); var responseCode = response.getResponseCode(); var responseBody = response.getContentText(); if (responseCode === 200) { const parsedResponse = JSON.parse(responseBody); const similar_rank = parsedResponse.similar_rank.rank; const estimated_traffic = calculateTraffic(similar_rank); // 返回两列数据:排名、估算流量 return [[similar_rank, estimated_traffic]]; } else { Logger.log(Utilities.formatString("请求失败,响应码:%d,响应内容:%s", responseCode, responseBody)); return ["请求失败,请检查域名或API密钥"]; } } function calculateTraffic(rank) { if (rank > 3079440) { return "Not Enough Traffic"; } // 处理rank小于等于0的特殊情况 if (rank <= 0) { return 86400000000; } const data = [ [0, 86400000000], [20, 1400000000], [118, 200000000], [207, 113000000], [336, 85000000], [1068, 43000000], [1564, 26000000], [2818, 24000000], [3653, 11000000], [6000, 8000000], [13465, 3000000], [17734, 2000000], [22000, 4000000], [57316, 773400], [111510, 300000], [141314, 420000], [513447, 50000], [1539720, 27000], [3079440, 13000], ]; let lowerBound = data[0][0]; let upperBound = data[0][0]; let lowerTraffic = data[0][1]; let upperTraffic = data[0][1]; for (let i = 1; i < data.length; i++) { if (rank <= data[i][0]) { upperBound = data[i][0]; upperTraffic = data[i][1]; lowerBound = data[i-1][0]; lowerTraffic = data[i-1][1]; break; } if (i === data.length - 1) { lowerBound = data[i][0]; lowerTraffic = data[i][1]; upperBound = data[i][0]; upperTraffic = data[i][1]; } } if (rank === 5) { return (lowerTraffic + upperTraffic) / 4; } else if (rank === 10) { return (lowerTraffic + upperTraffic) / 2; } else if (rank === 15) { return (lowerTraffic + upperTraffic) * (3 / 4); } else { if (upperBound === lowerBound) { return lowerTraffic; } return lowerTraffic + (rank - lowerBound) * (upperTraffic - lowerTraffic) / (upperBound - lowerBound); } }
内容的提问来源于stack exchange,提问作者Enna Nadanthaalum
相关产品推荐
相关产品推荐

