如何合并JavaScript对象?Google Apps Script代码优化求助
合并JavaScript对象实现单JSON输出问题
问题说明
当前代码运行后会输出多个独立的小型JSON对象,但需要将同一行的所有键值对合并成一个完整的JSON对象。
当前运行循环后输出如下:
{"FirstName" : "Kim"} {"LastName" : "hana"} {"Phone" : "010-1234-5648"} {"Email" : "abc@gmail.com"}
想要的结果是:
{"FirstName" : "Kim", "LastName" : "hana", "Phone" : "010-1234-5648", "Email" : "abc@gmail.com"}
现有代码
function testRun(){ var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var LastRow = ss.getLastRow(); var LastCol = ss.getLastColumn(); var arr = []; for(var i = 1; i<=LastCol; i ++){ var fieldName = ss.getRange(1,i).getValue(); arr.push(fieldName); } //arr = [FirstName, LastName, Phone, Email] for(var i =2;i<=LastRow;i++){ for(var j=1;j<=LastCol;j++){ var payload = Utilities.jsonStringify({ [arr[j-1]] : ss.getRange(i,j).getValue()} ); } } }
解决方案
问题核心是你每次循环都创建了新对象并单独序列化,没有将键值对合并到同一个对象中。修改方式如下:
- 在处理每行的内部循环外,创建一个空对象用于存储当前行的所有键值对
- 遍历列时,将键值对逐个添加到这个空对象中
- 整行处理完成后,再对完整对象执行JSON序列化
修改后的代码
function testRun(){ var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var LastRow = ss.getLastRow(); var LastCol = ss.getLastColumn(); var arr = []; for(var i = 1; i<=LastCol; i ++){ var fieldName = ss.getRange(1,i).getValue(); arr.push(fieldName); } //arr = [FirstName, LastName, Phone, Email] for(var i =2;i<=LastRow;i++){ // 初始化空对象存储当前行数据 var rowObj = {}; for(var j=1;j<=LastCol;j++){ // 将当前列的键值对添加到对象中 rowObj[arr[j-1]] = ss.getRange(i,j).getValue(); } // 序列化完整对象 var payload = Utilities.jsonStringify(rowObj); // 可按需处理payload,比如打印或发送 console.log(payload); } }
性能优化版
原代码循环调用getRange会降低性能,建议一次性获取所有数据再处理:
function testRun(){ var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 一次性获取所有表格数据(包含表头) var data = ss.getDataRange().getValues(); // 提取表头作为键名 var headers = data[0]; // 从第二行开始处理数据行 for(var i =1;i<data.length;i++){ var rowObj = {}; var rowData = data[i]; for(var j=0;j<headers.length;j++){ rowObj[headers[j]] = rowData[j]; } var payload = Utilities.jsonStringify(rowObj); console.log(payload); } }
内容的提问来源于stack exchange,提问作者whytili
相关产品推荐
相关产品推荐

