首页 > 解决方案 > 将 json/csv 文件(从 API 获取)保存到电子表格文档而不使用循环 - Google Apps 脚本

问题描述

我可以使用两个不同的 url 来获取数据,这取决于我想归档为 csv 还是 json。

  1. CSV 版

对于 csv url,我执行以下操作:

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("data")

get_url="https://opendata.rdw.nl/resource/m9d7-ebf2.csv? 
    datum_tenaamstelling=20200404%20&$limit=20000";

  var result_data = UrlFetchApp.fetch(get_url);
  var raw_data = result_data.getContentText()
  Logger.log(raw_data);

我最终得到一个字符串,如果不使用循环,我无法将其存储到电子表格文件中。

  1. JSON版

使用 json url,我正在执行以下操作:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("data")

get_url="https://opendata.rdw.nl/resource/m9d7-ebf2.json? 
datum_tenaamstelling=20200404%20&$limit=20000";

var result_data = UrlFetchApp.fetch(get_url, options);
var raw_data = result_data.getContentText()
var json_list = JSON.parse(raw_data)

 for(var i = 0; i < json_list.length; i++) {
    var obj = json_list[i];

    Logger.log(obj.merk);
    
    sheet.appendRow([obj.kenteken, 
                     obj.merk, 
                     obj.catalogusprijs, 
                     obj.datum_eerste_afgifte_nederland,
                     obj.datum_eerste_toelating,
                     obj.datum_tenaamstelling
                    ]);
}

如果我想将 20000 行存储到电子表格中,我最终还是使用了不实用的迭代。一段时间后,它停止并返回运行时错误。

有什么办法可以直接将数据复制到电子表格文件中?例如做这样的事情:

sheet.getRange(1, 1,raw_data.length,raw_data[0].length).setValues(raw_data);

标签: javascriptapigoogle-apps-script

解决方案


如何存储来自 JSON 对象响应的特定内容

  • 由于调用次数过多,循环遍历所有数据并sheet.appendRow()在每次迭代期间调用该方法确实会很慢且效率低下 - 请参阅Apps 脚本最佳实践
  • 一种更有效的方法是创建一个数组来存储感兴趣的数据,然后再用setValues().
  • 下面的示例仍然包含一个for循环,但是鉴于在每次迭代期间都没有调用外部服务,整个脚本只需要大约 10 秒即可执行并将 12582 行数据写入工作表。

样本:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("data")  
  get_url="https://opendata.rdw.nl/resource/m9d7-ebf2.json?datum_tenaamstelling=20200404%20&$limit=20000"; 
  var result_data = UrlFetchApp.fetch(get_url);
  var raw_data = result_data.getContentText()
  var json_list = JSON.parse(raw_data)
  var array = [];
  for(var i = 0; i < json_list.length; i++) {
    var obj = json_list[i];
    array.push([obj.kenteken, 
                obj.merk, 
                obj.catalogusprijs, 
                obj.datum_eerste_afgifte_nederland,
                obj.datum_eerste_toelating,
                obj.datum_tenaamstelling
               ]);
  }
  sheet.getRange(1, 1,array.length,array[0].length).setValues(array);
}

推荐阅读