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

向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:43:15