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

ContentService.createTextOutput返回JSON丢失数值变为null问题排查

问题

我尝试通过Google Apps Script的ContentService.createTextOutput返回简单JSON响应,但该方法似乎会剥离数值并替换为null。console.log显示JSON.stringify的输出正确,请问哪里操作出错了?

代码示例

function doPost(e) {
  let response = {};
  console.log(e);
  switch(e.parameter.action){
    case 'request':
      response = e;
      return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
    case 'price':
      response = calculatePrice(e);
      console.log(JSON.stringify(response));
      return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
    case 'default':
      return ContentService.createTextOutput(JSON.stringify('Error: Action not found')).setMimeType(ContentService.MimeType.JSON);
  }
}

function calculatePrice(request){
  const { date, num_people, num_guest } = request.parameter;
  const day = getDay(date);
  let price = 0;
  let location = '';

  if(day == "Tuesday" || day == "Wednesday" || day == "Friday" || day == "Sunday"){
    location = "London";
    price = 123;
  } else {
    location = "Newcastle";
    price = 567;
  }
  const people_total = num_people * price; 
  const guest_total = num_guest * 1250;
  const total_price = people_total + guest_total;
  const total_deposit = total_price * 0.2;

  const response = {
    day,
    location,
    total_price,
    total_deposit,
  }

  return response;
}

function getDay(date){
  const dayNames = ["Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
  const d = new Date(date);
  const day = d.getDay();
  return dayNames[day];
}

请求与结果

发送POST请求时的参数:action=price&date=01-18-2024&people_total=2&guest_total=1

  • 预期返回:
{"day":"Thursday","location":"Newcastle","total_price":2384,"total_deposit":476.8}
  • 实际返回:
{
"day": "Thursday",
"location": "Newcastle",
"total_price": null,
"total_deposit": null
}
解决方案

问题出在请求参数名不匹配以及字符串未转数值两个核心点:

  1. 参数名不匹配
    请求里传递的参数是people_total和guest_total,但calculatePrice函数里解构的是num_people和num_guest——这两个变量根本不存在,值为undefined。

  2. 字符串未转数值
    即使参数名匹配,request.parameter中的所有值都是字符串类型,直接参与乘法运算会得到NaN(比如undefined * 123),而JSON序列化时NaN会被自动转为null。

修改后的代码

function doPost(e) {
  let response = {};
  console.log(e);
  switch(e.parameter.action){
    case 'request':
      response = e;
      return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
    case 'price':
      response = calculatePrice(e);
      console.log(JSON.stringify(response));
      return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
    default: // 修正默认分支写法,原case 'default'无法触发
      return ContentService.createTextOutput(JSON.stringify('Error: Action not found')).setMimeType(ContentService.MimeType.JSON);
  }
}

function calculatePrice(request){
  // 修正参数名,并将字符串转为数值类型
  const { date, people_total, guest_total } = request.parameter;
  const num_people = parseInt(people_total, 10);
  const num_guest = parseInt(guest_total, 10);
  const day = getDay(date);
  let price = 0;
  let location = '';

  // 用includes简化多条件判断
  if(["Tuesday", "Wednesday", "Friday", "Sunday"].includes(day)){
    location = "London";
    price = 123;
  } else {
    location = "Newcastle";
    price = 567;
  }
  const people_total_price = num_people * price; 
  const guest_total_price = num_guest * 1250;
  const total_price = people_total_price + guest_total_price;
  const total_deposit = total_price * 0.2;

  const response = {
    day,
    location,
    total_price,
    total_deposit,
  }

  return response;
}

function getDay(date){
  const dayNames = ["Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
  const d = new Date(date);
  const day = d.getDay();
  return dayNames[day];
}

额外优化说明

  • 修正switch分支的默认逻辑写法,原case 'default'不符合语法规范,无法触发默认处理
  • 用数组includes方法替代多个||判断,代码更简洁易维护
  • 调整变量名避免与请求参数名混淆,提升代码可读性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:52:43