Google脚本null对象 - 不明白为什么

时间:2017-01-26 18:36:34

标签: json google-apps-script typeerror

我开始编写Google脚本来自动完成某些任务,而且我在这里遇到了一个我自己无法解决的问题。我必须说我既不是app脚本专家,也不是javascript。

这是我的问题。我调用(私有)REST API来检索一些数据。我得到结果,解析它得到一个Json对象。然后我想在电子表格中写一些属性。出于某种原因,我无法操纵嵌套对象。

说我有一个这个json有效载荷的列表:

{
    id: 2146904633,
    status: "in_progress",
    success_probability: 99,
    amount: "0.0",
    decision_maker: "Bob Mauranne",
    business_contact: {
        id: 2142664162,
        nickname: "NIL",
    }
}
编辑:我用我粘贴的代码犯了错误(未声明businessContact,而是声明了变量bc)。感谢评论:)下面的代码现在是正确的,但仍然无法正常工作。

我喜欢这个(过于简化的)代码:

   var response = UrlFetchApp.fetch(url);
   var dataAll = JSON.parse(response.getContentText());
   var data, businessContact;

   for (i = 0; i < dataAll.length; i++) {
     data = dataAll[i];
     businessContact = data.business_contact;
     Logger.log(data.status);
     Logger.log(businessContact);
     Logger.log(businessContact.id);
   }

我的问题是,当我调用businessContact.id时,我收到错误&#34; TypeError:无法从null对象&#34;中读取属性id。我不明白,因为我可以看到来自businessContact的内容:无论是来自日志调用还是来自调试器,它肯定不是空的。

它似乎只发生在嵌套对象上,因为在简单的属性上,我没有任何错误。我在所有嵌套对象上都遇到了同样的问题,无论我到目前为止尝试过的json有效负载......

我在互联网上搜索了一个解决方案,但没有找到。这可能是非常基础的,但我无法让它发挥作用。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您永远不会定义您在记录器中使用的“businessContact”。您定义“bc”但不定义“businessContact”。如果您将其更改为Logger.log(bc.id),它应该可以正常工作。

以下是您尝试做的精简版。

function getJSON() {
  var url = "your url";
  var response = UrlFetchApp.fetch(url).getContentText();
  var data = JSON.parse(response)
  data.forEach(function(item) {
    Logger.log(item.business_contact.id)
  })
}

这是拉动天气数据的一个例子。

function myFunction() {
  var url = "https://www.aviationweather.gov/gis/scripts/TafJSON.php";
  var response = UrlFetchApp.fetch(url).getContentText();
  var data = JSON.parse(response)
  data.features.forEach(function(feature) {
    Logger.log(feature.properties.id)
  })
}

答案 1 :(得分:0)

我终于找到了解决方案。这段代码是循环的,有时候对象business_contact为null,我还没有看到它:

显然,当我学习一项新技术时,我应该在晚上停止工作......

我的不好,对不起噪音,谢谢你的回答和评论。