在AppScript中用Script Properties保存Map对象:序列化后返回空Map求解
在AppScript中用Script Properties保存Map对象的正确方法
问题根源很直接:JSON本身不支持直接序列化Map对象,如果你直接对Map用JSON.stringify(),得到的会是空对象{},存进Script Properties后再读出来,自然只能得到空Map。
下面是两种可靠的解决方法:
方法一:转为普通对象存储(适合键为字符串的场景)
如果你的Map键都是字符串类型,把Map转成普通对象再序列化是最方便的:
存储代码
// 先创建一个带数据的Map const anglishWords = new Map([["hello", "hullo"], ["world", "werld"]]); // 将Map转为普通对象,再序列化 const jsonText = JSON.stringify(Object.fromEntries(anglishWords)); // 存入Script Properties const scriptPrp = PropertiesService.getScriptProperties(); scriptPrp.setProperty('anglishWords', jsonText);
读取并转回Map
const scriptPrp = PropertiesService.getScriptProperties(); const jsonT = scriptPrp.getProperty('anglishWords'); // 解析为对象后,转成Map const anglishWordsE = new Map(Object.entries(JSON.parse(jsonT))); // 验证:输出hullo console.log(anglishWordsE.get("hello"));
方法二:转为二维数组存储(支持非字符串键)
如果你的Map键是数字、布尔这类非字符串类型,用对象存储会导致键被强制转为字符串(比如键1变成"1"),这时候可以把Map转成二维数组再序列化:
存储代码
// 带非字符串键的Map const anglishWords = new Map([[1, "first"], [true, "yes"]]); // 将Map转为二维数组后序列化 const jsonText = JSON.stringify(Array.from(anglishWords.entries())); const scriptPrp = PropertiesService.getScriptProperties(); scriptPrp.setProperty('anglishWords', jsonText);
读取并转回Map
const scriptPrp = PropertiesService.getScriptProperties(); const jsonT = scriptPrp.getProperty('anglishWords'); // 解析数组后直接传入Map构造函数 const anglishWordsE = new Map(JSON.parse(jsonT)); // 验证:输出first console.log(anglishWordsE.get(1));
你之前的代码之所以返回空Map,大概率是因为直接对空Map或者未正确转换的Map执行了JSON.stringify(),导致存入的是空对象。按上面的方法先转换Map结构再序列化,就能正常存储和读取了。
内容的提问来源于stack exchange,提问作者Jonah Thiele
相关产品推荐
相关产品推荐

