javascript - 将 json/csv 文件(从 API 获取)保存到电子表格文档而不使用循环 - Google Apps 脚本
问题描述
我可以使用两个不同的 url 来获取数据,这取决于我想归档为 csv 还是 json。
- 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);
我最终得到一个字符串,如果不使用循环,我无法将其存储到电子表格文件中。
- 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);
解决方案
如何存储来自 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);
}
推荐阅读
- reactjs - Yarn 可以列出所有可用的脚本吗?
- mysql - 为什么这个递归 concat 会产生:数据太长
- django - 使用一键传输许多参数。姜戈
- java - 如何正确关闭 HikariCP 连接池
- excel - 比较两个字符串并返回匹配的值?
- c++ - 两个数组的交集函数给出了不好的结果
- python-3.x - 用 Requests 替换 urllib2 模块
- hibernate - Hibernate Exception root 导致 java.lang.ClassNotFoundException: org.hibernate.service.ServiceRegistry
- angular - 角度表单验证数字
- antd - 使用antd隐藏表格的列