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

Google Script中push方法操作二维数组出现异常覆盖问题

异常产生原因

这个问题和Google Apps Script本身无关,是JavaScript的基础类型特性导致的:数组是引用类型,变量赋值时不会复制数组内容,只会传递指向同一块内存地址的引用。你的代码全程只操作了初始化时创建的那一个空数组,从来没有生成过新的独立子数组。

逐轮拆解循环执行过程就能看得很清楚:

  1. 初始化阶段andrea = [[]],数组内只有1个元素,是索引为0的空数组,下文统一称这个数组为originArr。
  2. 第一轮循环(counter=0):
    • ft = andrea[counter] 等价于让ft指向originArr,没有创建新数组
    • 执行push后originArr变为['el1']
    • andrea.push(ft) 是把originArr的引用又存到了andrea的索引1位置,此时andrea的0、1号元素指向同一个数组
  3. 第二轮循环(counter=1):
    • ft = andrea[1] 拿到的还是originArr的引用
    • 执行push后originArr变为['el1', 'el2']
    • push到andrea的索引2位置的还是originArr的引用,此时andrea前3个元素全指向同一个数组
  4. 第三轮循环(counter=2):
    • ft = andrea[2] 依旧指向originArr
    • 执行push后originArr变为['el1', 'el2', 'el3']
    • push到andrea索引3位置的还是originArr的引用

最终打印andrea时,4个元素全指向同一个已经被修改为['el1','el2','el3']的数组,自然所有子数组内容完全一致。

修正方法

每次循环时先对前一个子数组做浅拷贝,生成独立的新数组后再push新元素,就可以得到预期的递增结构。修正后代码如下:

function check_push() {
  var andrea = [[]];
  ss = SpreadsheetApp.getActiveSpreadsheet();
  entra = ss.getRange('A1:A');
  for (var counter = 0; counter <= 2; counter = counter + 1) {
    // 通过展开运算符创建上一个子数组的浅拷贝,生成独立新数组
    ft = [...andrea[counter]]
    ft.push(entra.getCell(counter+1,1).getValue())
    andrea.push(ft);
  }
  Logger.log(andrea);
}

执行后输出结果为[ [], ['el1'], ['el1', 'el2'], ['el1', 'el2', 'el3'] ],和预期完全一致。

内容的提问来源于stack exchange,提问作者Andrea Marino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:57:26