开发者问题收集

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

2017-01-26
1052

我开始编写 Google 脚本来自动执行某些任务,但遇到了一个我自己无法解决的问题。我必须说,我既不是应用程序脚本方面的专家(目前),也不是 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 时,我收到错误“TypeError:无法从 null 对象读取属性 id”。我不明白,因为我可以从 businessContact 中看到内容:无论是从日志调用还是从调试器中,它都绝对不为 null。

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

我在互联网上搜索解决方案,但没有找到。它可能非常基础,但我无法让它工作。

有什么想法吗?

2个回答

您从未定义过在记录器中使用的“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)
  })
}
Lenny Cunningham
2017-01-26

我终于找到了解决方案。此代码处于循环中,有时对象 business_contact 为空,而我却没有看到它 :|

显然,当我学习新技术时,我应该在深夜停止工作……

我的错,抱歉打扰了,感谢大家的回答和评论。

daffycricket
2017-01-27