google-apps-script - 从单元格中读取 JSON 数组并将最后一个对象的一部分写入同一行中的另一个单元格
问题描述
我正在尝试从 Google 表格中的 JSON 数组中提取一些信息,并获取该信息的一部分并将其复制到旁边的两列中。
我想要的数据位于工作表的 L 列(从第 2 行开始),格式为:
[{"id": "XX:123456", "timestamp": "2020-01-27T19:25:51.303"}, {"id": "XX:654321", "timestamp": "2020-01-27T19:40:37.06"}]
目前我的脚本如下:
var ui = SpreadsheetApp.getUi();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("parsed");
var dataRange = sheet.getDataRange();
var lastRow = dataRange.getLastRow();
function parseData() {
for (var row=2; row<lastRow; row++)
{
var parseRange = sheet.getRange(row,12,5,1)
var json = JSON.parse(parseRange.getValue());
var lastObject = json.length-1;
var org = json[lastObject];
var orgID = org.id;
var timestamp = org.timestamp;
sheet.getRange(row, 13).setValue(orgID);
sheet.getRange(row, 14).setValue(timestamp);
}
}
这是非常耗时的处理,因为它正在逐行读取和写入。我曾假设 JSON 数组已经按顺序排列,但检查后它似乎是随机的。我最理想的做法是先按时间戳对数组进行排序,然后获取具有最新时间戳的对象并将该数据写入列 M 和 N,并以更有效的方式执行此操作。
解决方案
片段:
let parseRange = sheet.getRange(1+1,12,lastRow-1,1);//col L
let values = parseRange.getValues();
let out = values.map(([row])=>{
let {id, timestamp} = JSON.parse(row).pop();
return [id, timestamp];
});
sheet.getRange(1+1, 13, lastRow-1, 2).setValues(out);
推荐阅读
- azure - 唯一标识磁盘
- java - 了解tomcat/spring boot多线程
- gitlab - 访问 $GITLAB/admin/runners 时出现内部服务器错误 500
- c# - 非泛型方法“IServiceProvider.GetService(Type)”不能与类型参数一起使用
- ruby-on-rails - Capybara 由于元素重叠而失败 [已解决]
- java - 用 min max 连接 4 个代码 find uniqe 问题
- javascript - AngularJS $http GET:TagName 作为响应的目标特定输入
- javascript - 如何使用单个 Javascript 文件在两个或多个 HTML 页面之间共享本地存储而不是“null”?
- api - Google 部署管理器 Cloud Scheduler 类型
- php - AJAX 调用后数据不会刷新