Google Apps Script中向空数组存储数据却返回空数组的异常问题咨询
问题根源与解决方案
这个问题其实是Google Apps Script对Array类型的特殊处理导致的,并非Bug。
为什么会出现这种矛盾现象?
在普通JavaScript环境中,你可以给Array对象添加任意非数字索引的属性(比如wrapper.date),虽然这不是最佳实践,但这些属性确实会存在于对象上。不过在Google Apps Script里,数组会被严格当作“索引集合”来处理:
- 只有数字索引(0、1、2...)对应的元素会被视为数组的一部分
- 你添加的非索引属性(比如
date、medium)虽然能通过对象属性访问(比如wrapper.date),但不会被纳入数组的序列化(JSON.stringify)或日志输出中,所以你会看到JSON.stringify(wrapper)返回[],最终newtableData里全是空数组。
修复方案
把存储键值对的容器从Array改成普通对象{}即可,因为对象天生就是用来存储键值对的:
修改这段代码:
var wrapper = new Array();
为:
var wrapper = {};
修改后,你的键值对会被正确存储,JSON.stringify(wrapper)会输出预期的{"date":"20220301","medium":"(none)",...},最终newtableData也会是包含正确对象的数组,而不是空数组的集合。
补充说明
虽然在普通JS里给数组加属性能“凑合用”,但这本身就是不规范的写法——数组是用来存储有序的索引型数据,对象才是存储键值对的正确选择。Google Apps Script的这种处理其实是在强制规范的代码实践,避免开发者混用数组和对象的用途。
内容的提问来源于stack exchange,提问作者Alexander Kozlovsky
相关产品推荐
相关产品推荐

