Apps Script调用阿尔伯塔油价API遇字段名空格问题:数据读取失败
解决API返回字段名带空格导致数据拉取为空的问题
你的问题核心是API返回的字段名是"Type "(末尾带空格),而你用点语法obs.Type访问时,JavaScript会寻找名为Type(无空格)的属性,自然取不到值,导致对应位置为空。
直接解决方案
使用方括号语法访问带空格的属性名,把循环里的obs.Type替换成obs["Type "]即可:
observations.forEach(function(obs) { recentData.push([obs.Date, obs["Type "], obs.Value]); });
修改后的完整脚本
function fetchOilPrices() { var sheetName = 'Oil Prices'; var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // 补充缺失的spreadsheet变量定义 // 检查目标工作表是否存在 var existingSheet = spreadsheet.getSheetByName(sheetName); var newSheet; if (!existingSheet) { // 不存在则新建工作表 newSheet = spreadsheet.insertSheet(sheetName); } else { // 存在则直接使用 newSheet = existingSheet; } var url = "https://api.economicdata.alberta.ca/api/data?code=0d593867-2089-4514-8901-9e2d7f666e0c"; var options = { "method": "get", }; var response = UrlFetchApp.fetch(url, options); var data = JSON.parse(response.getContentText()); // 假设返回数据是数组格式 var observations = data; var recentData = [["Date", "Type", "Value"]]; // 工作表表头 // 遍历数据提取字段(已修复属性访问问题) observations.forEach(function(obs) { recentData.push([obs.Date, obs["Type "], obs.Value]); }); // 反转数据顺序(排除表头) recentData = [recentData[0]].concat(recentData.slice(1).reverse()); // 清空工作表内容 newSheet.clearContents(); Logger.log(sheetName + " cleared.") // 将数据写入工作表 newSheet.getRange(1, 1, recentData.length, 3).setValues(recentData); Logger.log("Written data for " + observations.length + " observations."); }
额外优化建议(可选)
如果担心API返回的其他字段也存在首尾空格问题,可以统一清理所有对象的属性名:
// 清理对象属性名首尾空格的工具函数 function cleanObjectKeys(obj) { return Object.fromEntries( Object.entries(obj).map(([key, value]) => [key.trim(), value]) ); } // 在解析数据后使用该函数处理 var data = JSON.parse(response.getContentText()); var observations = data.map(cleanObjectKeys); // 之后就可以直接用obs.Type访问,无需考虑空格 observations.forEach(function(obs) { recentData.push([obs.Date, obs.Type, obs.Value]); });
内容的提问来源于stack exchange,提问作者Allister Lobo
相关产品推荐
相关产品推荐

