Google App Script判断JSON是否存在externalIds字段并取值的方案
原有代码失效原因
逻辑不生效是以下几个明确问题导致的:
- 判断条件语法错误:
json["externalIds"].ContenService ="null"中单等号是赋值操作而非相等比较,且不存在ContenService属性,同时将null类型误写为字符串"null",判断逻辑完全不成立 - 缺失前置存在性校验:当用户数据无
externalIds字段时,json["externalIds"]值为undefined,直接访问其属性会抛出类型错误,导致代码中断 - 取值逻辑不可靠:默认取
externalIds[0]没有校验条目类型,若数组首项不是type=organization的条目,会取到错误值 - 冗余解析问题:如果是通过Google内置Admin SDK接口拉取的用户列表,返回值本身就是JS对象,不需要额外调用
JSON.parse,重复解析可能触发异常
修正后兼容代码
for(var i = 0; i < users.length; i++){ const user = users[i]; // 初始化默认空值,所有不匹配场景都返回空 let empolyee_code = ""; // 第一层校验:确认externalIds存在且是有效数组 if (Array.isArray(user.externalIds)) { // 遍历匹配type为organization的条目,不依赖数组顺序 const orgIdEntry = user.externalIds.find(item => item.type === "organization"); // 低版本环境不支持?.的话,替换为 orgIdEntry && orgIdEntry.value 即可 if (orgIdEntry?.value) { empolyee_code = orgIdEntry.value; Logger.log("empolyee_code " + empolyee_code); } else { Logger.log("No matching organization ID found"); } } else { Logger.log("No empolyee_code " + empolyee_code); } rows.push([ user.name.givenName, user.name.familyName, user.primaryEmail, getUserOrg(user.primaryEmail, user.orgUnitPath), getStatus(user.suspended), user.lastLoginTime.slice(0,10), empolyee_code ]); }
逻辑说明
- 用
Array.isArray()做第一层校验,覆盖无externalIds字段、字段值非数组的异常场景,从根源避免类型错误 - 用数组
find()方法精准匹配type=organization的条目,不依赖数组固定顺序,避免取错其他类型的外部ID - 员工编号初始化为空字符串,所有不满足匹配条件的场景都使用默认值,不会中断整个循环执行
- 移除冗余的JSON解析、重复日志打印逻辑,直接操作用户对象即可
内容的提问来源于stack exchange,提问作者bonk
相关产品推荐
相关产品推荐

