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

使用Google Apps Script调用NameApi获取姓名数据报错求助

解决NameApi + Google Apps Script调用错误问题

我尝试使用NameApi的姓名解析服务,通过Google Apps Script获取特定姓名的以下字段:

  • SURNAME
  • GIVENNAME
  • GIVENNAME2
  • QUALIFIER
  • GENDER
  • STATUS

但运行代码时出现400 Bad Request错误,以下是原代码及问题分析和修正方案:

原代码

function TestNameApi() {

  const apiKey = "###"; // 请设置你的API密钥
  var url = "https://api.nameapi.org/rest/v5.3/parser/personnameparser?apiKey=" + apiKey;

  var Name = {
    "context": {
      "priority": "REALTIME",
      "properties": []
    },
    "inputPerson": {
      "type": "NaturalInputPerson",
      "personName": {
        "nameFields": [{
          "string": "BRANDYN KRAMER",
          "fieldType": "GIVENNAME"
        }]
      },
      "gender": "UNKNOWN"
    }
  }

  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(Name)
  };

  var response = UrlFetchApp.fetch(url, options).getContentText();
  Logger.log(response);

}

问题分析

  1. 输入字段类型错误:原代码中将完整姓名BRANDYN KRAMER标记为GIVENNAME(名)类型,这会导致NameApi无法正确解析姓名结构,直接返回400请求错误。
  2. 缺少错误处理:未添加异常捕获逻辑,无法直观看到具体错误信息。

修正方案

方案1:传入完整姓名(推荐)

将nameFields的fieldType改为FULLNAME,让服务自动解析姓名结构:

function TestNameApi() {
  const apiKey = "###"; // 替换为你的API密钥
  const url = `https://api.nameapi.org/rest/v5.3/parser/personnameparser?apiKey=${apiKey}`;

  // 修正输入格式:完整姓名对应FULLNAME类型
  const requestBody = {
    "context": {
      "priority": "REALTIME",
      "properties": []
    },
    "inputPerson": {
      "type": "NaturalInputPerson",
      "personName": {
        "nameFields": [{
          "string": "BRANDYN KRAMER",
          "fieldType": "FULLNAME"
        }]
      },
      "gender": "UNKNOWN"
    }
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(requestBody),
    muteHttpExceptions: true // 开启后可获取详细错误响应
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const responseJson = JSON.parse(response.getContentText());
    
    // 提取需要的字段
    const parsedPerson = responseJson.matches[0].personName;
    Logger.log("SURNAME: " + parsedPerson.surname?.string);
    Logger.log("GIVENNAME: " + parsedPerson.givenNames[0]?.string);
    Logger.log("GIVENNAME2: " + parsedPerson.givenNames[1]?.string || "无");
    Logger.log("QUALIFIER: " + parsedPerson.qualifiers[0]?.string || "无");
    Logger.log("GENDER: " + responseJson.matches[0].gender?.gender);
    Logger.log("STATUS: " + responseJson.matches[0].matchLevel);

  } catch (e) {
    Logger.log("请求错误: " + e.message);
  }
}

方案2:拆分姓和名传入

如果明确知道姓名结构,可分别传入GIVENNAME和SURNAME:

function TestNameApi() {
  const apiKey = "###"; // 替换为你的API密钥
  const url = `https://api.nameapi.org/rest/v5.3/parser/personnameparser?apiKey=${apiKey}`;

  const requestBody = {
    "context": {
      "priority": "REALTIME",
      "properties": []
    },
    "inputPerson": {
      "type": "NaturalInputPerson",
      "personName": {
        "nameFields": [
          {"string": "BRANDYN", "fieldType": "GIVENNAME"},
          {"string": "KRAMER", "fieldType": "SURNAME"}
        ]
      },
      "gender": "UNKNOWN"
    }
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(requestBody),
    muteHttpExceptions: true
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const responseJson = JSON.parse(response.getContentText());
    // 提取字段逻辑同方案1
    Logger.log(JSON.stringify(responseJson, null, 2));
  } catch (e) {
    Logger.log("请求错误: " + e.message);
  }
}

关键优化点

  • 修正fieldType匹配输入内容的类型;
  • 添加muteHttpExceptions: true,方便查看详细错误响应;
  • 加入try-catch捕获异常,提升代码健壮性;
  • 新增字段提取逻辑,直接输出你需要的目标字段。

内容的提问来源于stack exchange,提问作者EagleEye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:30:46