如何在AppScript中按日期过滤JSON数组?阿尔伯塔油价数据异常
解决阿尔伯塔省油价数据日期过滤问题
问题分析
- 未初始化
spreadsheet变量:代码直接调用spreadsheet.getSheetByName()但未定义该变量,会触发运行错误。 - 日期过滤逻辑错误:API返回的是对象数组,而非二维数组,用
r[0]获取日期会得到undefined,转换为日期后是无效值,导致过滤后数据为空。 - 字段名错误:代码中使用
obs['Type '](带空格),但API返回的字段名为Type(无空格),无法正确获取类型数据。 - 变量作用域问题:
newSheet在if块内用var声明,else块直接赋值存在作用域隐患。
修正后的代码
function fetchOilPrices() { var sheetName = 'Oil Prices'; // 初始化spreadsheet变量,获取当前活动表格 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // 提前声明newSheet变量,避免作用域问题 var newSheet; // 检查工作表是否存在 var existingSheet = spreadsheet.getSheetByName(sheetName); 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); const dt = new Date(2010, 0, 1).valueOf(); // 修正日期过滤逻辑:读取对象的Date字段获取日期字符串 const data = JSON.parse(response.getContentText()).filter(r => new Date(r.Date).valueOf() > dt) var recentData = [["Date", "Type", "Value"]]; // 表头 // 遍历数据,修正Type字段名(去掉多余空格) data.forEach(function(obs) { recentData.push([obs.Date, obs.Type, obs.Value]); }); // 清空工作表内容 newSheet.clearContents(); Logger.log(sheetName + " cleared.") // 写入数据到工作表 newSheet.getRange(1, 1, recentData.length, 3).setValues(recentData); Logger.log("Written data for " + data.length + " observations."); }
关键修改说明
- 初始化spreadsheet:添加
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();,确保能正确访问目标表格。 - 修正日期过滤:将
r[0]改为r.Date,直接读取API返回对象的日期字段,转换为时间戳后与目标日期比较。 - 修正字段名:将
obs['Type ']改为obs.Type,匹配API返回的实际字段名。 - 调整变量作用域:提前声明
newSheet变量,避免块级作用域导致的变量未定义问题。
内容的提问来源于stack exchange,提问作者Allister Lobo
相关产品推荐
相关产品推荐

