You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Apps Script getRange().setValues()填充JSON数据至谷歌表格遇问题

解决Google Apps Script中setValues()填充对象数组到表格的报错问题

问题根源

Google Sheets的getRange().setValues()方法仅接受二维数组作为参数,你当前传入的dict是由{forecast, actual, index}对象组成的数组,这种结构无法被表格识别,因此会触发报错。

简洁解决方案

利用Array.map()和Object.values()可以快速将对象数组转换为setValues()需要的二维数组,代码如下:

function fetchCarbon() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const url = 'https://api.carbonintensity.org.uk/intensity/date';
  
  // 发起请求并解析响应(建议使用getContentText避免编码问题)
  const response = UrlFetchApp.fetch(url);
  const parsed = JSON.parse(response.getContentText());
  const data = parsed.data;
  
  // 1. 定义表头(可选,根据需求决定是否添加)
  const headers = ['forecast', 'actual', 'index'];
  // 2. 将每个intensity对象转换为值数组,再与表头合并
  const formattedData = [
    headers,
    ...data.map(item => Object.values(item.intensity))
  ];
  
  // 3. 动态匹配数据范围并写入表格
  sheet.getRange(1, 1, formattedData.length, formattedData[0].length)
       .setValues(formattedData);
}

关键说明

  • Object.values(item.intensity):将单个intensity对象的属性值提取为一维数组,比如{forecast:81, actual:79, index:'low'}会被转换为[81, 79, 'low']
  • data.map(...):遍历所有数据项,批量完成对象到数组的转换
  • 动态范围计算:formattedData.length和formattedData[0].length自动匹配数据的行数和列数,无需硬写48, 3,适配API返回数据的变化

原代码问题修正

你原代码中dict数组存储的是对象而非值数组,这是核心错误。如果坚持用循环实现转换,修正后的循环写法如下:

var dict = [];
// 先添加表头(可选)
dict.push(['forecast', 'actual', 'index']);
for (let i = 0; i < data.length; i++) {
  const intensity = data[i].intensity;
  // 将对象转换为值数组再存入
  dict.push([intensity.forecast, intensity.actual, intensity.index]);
}
sheet.getRange(1, 1, dict.length, dict[0].length).setValues(dict);

虽然API返回的对象结构很常见,但setValues()的参数要求是固定的二维数组,上述map+Object.values的写法已经是最直接高效的转换方式,无需额外复杂处理。

内容的提问来源于stack exchange,提问作者Sebastian Belcher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:41:10