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

如何合并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()}
            );
        }
    }
 }

解决方案

问题核心是你每次循环都创建了新对象并单独序列化,没有将键值对合并到同一个对象中。修改方式如下:

  1. 在处理每行的内部循环外,创建一个空对象用于存储当前行的所有键值对
  2. 遍历列时,将键值对逐个添加到这个空对象中
  3. 整行处理完成后,再对完整对象执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:27:28