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

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在服务端完成匹配后直接返回布尔结果,既减少网络传输量,又能从根源上避免并发写入重复数据的问题:

  1. 改造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') {
        // 原有写入代码
      }
    }
    
  2. 改造客户端提交流程,在表单提交前先发起校验请求,拿到返回的布尔结果后再触发对应分支
    示例代码:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 20:18:03