MongoDB导入Google Sheets时$numberInt格式数值提取纯数字问题咨询
问题原因
你遇到的是MongoDB扩展JSON(BSON序列化后)的类型标记格式,数值、ObjectId、日期等类型会被包裹为带$前缀的键值对象,比如{"$numberInt":"3204"}、{"$oid":"xxx"}、{"$date":"xxx"},直接取整个对象就会输出完整结构而非值本身。
解决方法
先写一个通用的取值解析函数,自动识别带类型标记的字段并提取纯值,再替换原来的直接取值逻辑即可。调整后的完整脚本如下:
function importMongoDBData() { var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("mongoDB") var getData = UrlFetchApp.fetch('URL').getContentText() var jsonObj = JSON.parse(getData) // 通用MongoDB扩展JSON值解析函数 function parseMongoValue(val) { // 非对象类型直接返回 if (typeof val !== 'object' || val === null) return val // 识别常见MongoDB类型标记 if ('$numberInt' in val) return parseInt(val['$numberInt']) if ('$numberDouble' in val) return parseFloat(val['$numberDouble']) if ('$numberLong' in val) return BigInt(val['$numberLong']) // 长整型可按需转为普通数字 if ('$oid' in val) return val['$oid'] if ('$date' in val) return new Date(val['$date']) // 日期类型可按需格式化 // 其他未匹配类型直接返回原值 return val } // 先批量组装数据再写入,减少API调用提升运行效率 var outputArr = [] for(var i=0;i<jsonObj.length;i++){ var row = [ parseMongoValue(jsonObj[i]._id), parseMongoValue(jsonObj[i].status), parseMongoValue(jsonObj[i].amount), parseMongoValue(jsonObj[i].frequency), parseMongoValue(jsonObj[i].Payments), parseMongoValue(jsonObj[i].maxAmount), parseMongoValue(jsonObj[i].Requested), parseMongoValue(jsonObj[i].Offer), parseMongoValue(jsonObj[i].term), parseMongoValue(jsonObj[i].user), parseMongoValue(jsonObj[i].details), parseMongoValue(jsonObj[i].vendor), parseMongoValue(jsonObj[i].createdAt), parseMongoValue(jsonObj[i].updatedAt), parseMongoValue(jsonObj[i].boundaryAmount) ] outputArr.push(row) } // 一次性写入所有行 if (outputArr.length > 0) { sh1.getRange(2, 1, outputArr.length, outputArr[0].length).setValues(outputArr) } }
修改说明
parseMongoValue函数会自动匹配所有常见的MongoDB类型标记,直接提取纯值输出,不需要逐个字段手动指定结构- 优化了写入逻辑,将逐单元格写入改为批量数组写入,大幅提升大数据量时的运行速度,避免Google Apps Script超时
- 完全兼容原有脚本的字段位置,不需要调整表格结构
内容的提问来源于stack exchange,提问作者FINISHUT
相关产品推荐
相关产品推荐

