JavaScript使用Fetch搜索Google Sheet返回JSON数据以校验重复客户的方法咨询
重复客户录入校验实现方案
前端本地匹配实现(最快落地版)
你现在已经能通过Fetch拿到Sheet返回的结构化JSON数据(通常为客户对象组成的数组),直接利用数组原生方法就能完成值匹配,不需要额外接口改造:
- 单个键值存在性校验(如手机号唯一校验):使用
Array.some()遍历数组,只要找到任意一条记录的目标字段和待校验值一致,就返回存在标记
示例代码:// allCustomerData 为Fetch拿到的全量客户JSON数据 function checkSingleFieldExist(fieldKey, targetValue) { return allCustomerData.some(item => item[fieldKey] === targetValue) } // 调用示例:校验手机号13800138000是否已存在 const isPhoneDuplicated = checkSingleFieldExist('phone', '13800138000') - 多键值组合校验(如手机号+姓氏共同匹配才算重复):同样基于
Array.some(),内层搭配Array.every()保证传入的所有键值对都完全匹配才判定为重复
示例代码:function checkMultiFieldExist(matchRule) { // matchRule 格式为 {字段1: 待匹配值1, 字段2: 待匹配值2} return allCustomerData.some(item => { return Object.entries(matchRule).every(([field, value]) => item[field] === value) }) } // 调用示例:校验手机号+姓氏组合是否已存在 const isCustomerDuplicated = checkMultiFieldExist({ phone: '13800138000', lastName: '张' })
注意:该方案仅适合客户量小于500条的小型场景,客户量上涨后会出现全量JSON拉取慢、内存占用高的问题,且多用户同时提交时存在并发校验失效、写入重复数据的漏洞。
服务端校验实现(生产可用优化方案)
更合理的逻辑是把重复校验能力下沉到Google Apps Script侧,不向前端返回全量客户数据,前端仅提交待校验的键值对,由Apps Script在服务端完成匹配后直接返回布尔结果,既减少网络传输量,又能从根源上避免并发写入重复数据的问题:
- 改造Apps Script接口,在现有
doPost/doGet逻辑中新增校验分支,通过请求参数的action字段区分不同操作(返回全量数据、新增客户、重复校验)
核心校验代码示例:function doPost(e) { const reqBody = JSON.parse(e.postData.contents) const customerSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('客户数据') // 新增重复校验分支 if (reqBody.action === 'checkDuplicate') { const matchRule = reqBody.checkFields // 读取Sheet全部数据,跳过表头 const sheetRows = customerSheet.getDataRange().getValues() const headers = sheetRows[0] const dataRows = sheetRows.slice(1) const isDuplicated = dataRows.some(row => { return Object.entries(matchRule).every(([field, targetVal]) => { const colIndex = headers.indexOf(field) // 统一转字符串比对,避免Sheet自动转数字导致的匹配失效 return String(row[colIndex]) === String(targetVal) }) }) return ContentService.createTextOutput(JSON.stringify({ hasDuplicate: isDuplicated })).setMimeType(ContentService.MimeType.JSON) } // 原有新增客户的写入逻辑保持不变 if (reqBody.action === 'addCustomer') { // 原有写入代码 } } - 改造客户端提交流程,在表单提交前先发起校验请求,拿到返回的布尔结果后再触发对应分支
示例代码:async function onFormSubmit(e) { e.preventDefault() const formData = new FormData(customerForm) // 组装校验请求参数 const checkPayload = { action: 'checkDuplicate', checkFields: { phone: formData.get('phoneInput'), lastName: formData.get('lastNameInput') } } // 发起服务端校验请求 const checkResponse = await fetch(APPS_SCRIPT_WEBAPP_URL, { method: 'POST', body: JSON.stringify(checkPayload) }) const checkResult = await checkResponse.json() // 命中重复规则,拦截提交 if (checkResult.hasDuplicate) { showToast('当前录入的客户信息已存在,请勿重复提交') return } // 校验通过,走原有新增客户的提交流程 await saveNewCustomer(formData) }
常见踩坑提示
- 字段类型统一:Sheet会自动将纯数字内容转为Number类型,和前端传入的字符串类型做全等匹配时会出现匹配失效,比对前统一转成字符串即可解决
- 权限配置:Apps Script发布Web App时,执行权限需选择“以脚本所有者的身份执行”,否则普通用户访问时会没有读取Sheet数据的权限,导致校验报错
内容的提问来源于stack exchange,提问作者Russell Stanberry
相关产品推荐
相关产品推荐

