向Apps Script服务端传递Map对象时触发TypeError错误排查
问题根源与解决方案
核心原因
google.script.run不支持直接传递ES6 Map类型对象。虽然官方文档未明确禁止Map,但它仅支持可JSON序列化的类型,而Map默认无法被JSON.stringify正确序列化(JSON.stringify(new Map())会得到{}),导致参数解析失败,触发TypeError: Failed due to illegal value in property: 0错误,服务端函数因此不会被调用。
官方文档中提到的"JavaScript objects"特指普通字面量对象({key: value}形式),而非ES6新增的Map这类特殊对象。
解决方案
要保留Map的数字键特性,可通过以下两种方式处理:
方案1:将Map转换为二维数组传递
前端把Map转为键值对数组,服务端再还原为Map:
- 前端修改调用代码:
// 原代码 // google.script.run.applyColouring(rowPairs, colourAvailabilities); // 修改后 google.script.run.applyColouring(Array.from(rowPairs.entries()), colourAvailabilities); - 服务端函数处理:
function applyColouring(rowPairsEntries, colourAvailabilities) { // 将二维数组还原为Map const rowPairs = new Map(rowPairsEntries); // 后续逻辑不变 }
方案2:将Map转换为带数字键标记的对象(备选)
如果需要用对象传递,可给数字键添加前缀避免字符串化问题,服务端再处理:
- 前端转换:
const rowPairsObj = {}; rowPairs.forEach((value, key) => { rowPairsObj[`num_${key}`] = value; }); google.script.run.applyColouring(rowPairsObj, colourAvailabilities); - 服务端还原:
function applyColouring(rowPairsObj, colourAvailabilities) { const rowPairs = new Map(); Object.entries(rowPairsObj).forEach(([key, value]) => { rowPairs.set(Number(key.replace('num_', '')), value); }); // 后续逻辑不变 }
验证说明
- 你用普通Object能正常运行,是因为字面量对象属于JSON可序列化类型,符合
google.script.run的参数要求; - Map的构建本身没问题,但跨端传递时的序列化环节失败,导致整个调用终止。
内容的提问来源于stack exchange,提问作者user27425627
相关产品推荐
相关产品推荐

