简体   繁体   中英

Google script null object - don't understand why

I'm starting to write Google scripts to automatize certain tasks, and here I'm stuck on a problem I can't figure out by myself. I must say I'm neither an expert in app scripts (yet) nor in javascript.

Here is my problem. I make a call to a (private) REST API to retrieve some data. I get the result, parse it to get a Json object. Then I want to write some properties in a spreadsheet. For some reason, I can't get to manipulate nested objects.

Say I have a list of this json payload :

{
    id: 2146904633,
    status: "in_progress",
    success_probability: 99,
    amount: "0.0",
    decision_maker: "Bob Mauranne",
    business_contact: {
        id: 2142664162,
        nickname: "NIL",
    }
}

EDIT : I made a mistake with the code I pasted (businessContact was not declared, instead a variable bc was declared).Thanks for the comment :) The code below is correct now, but still doesn't work.

I get it like with this (overly simplified) code :

   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);
   }

My problem is that when I call businessContact.id I get the error "TypeError: unable to read property id from null object". And I don't understand since I can see the content from businessContact : either from the log call or from the debugger, it's definately not null.

It seems to happen only on nested objects, because on simple properties, I don't have any error. And I have the same problems on all nested objects, whatever json payload I've tried so far...

I searched on the internet for a solution but found none. It probably is very basic, but I can't get it to work.

Any idea ?

You never define "businessContact" that your using in the logger. You define "bc" but not "businessContact". If you changed it to Logger.log(bc.id) it should work.

Here is a trimmed down version of what your trying to do also.

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)
  })
}

Heres an example pulling weather data.

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)
  })
}

I finally found the solution. This code is in a loop, sometimes the object business_contact is null and I hadn't seen it :|

Clearly I should stop working late in the evening when I learn a new technology ...

My bad, sorry for the noise, and thanks for the answers and comments guys.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM