0
votes

I'm trying to learn how to query for data from a local government data site (hoping I can teach my math students to do some data analysis). I'm hoping to get the data and insert them into Google Sheets. The following is a sample provided by the official site on how to do a query:

var data = {
  resource_id: '1b702208-44bf-4829-b620-4615ee19b57c', // the resource id
  limit: 5, // get 5 results
  q: 'jones' // query for 'jones'
};
$.ajax({
  url: 'https://data.gov.sg/api/action/datastore_search',
  data: data,
  dataType: 'jsonp',
  success: function(data) {
    alert('Total results found: ' + data.result.total)
 }
});$

I tried the following code in Google Apps Script:

function testapi(){
  var data = {
    resource_id: '1b702208-44bf-4829-b620-4615ee19b57c', // the resource id
    limit: 5, // get 5 results
    q: 'Yishun' 
  };

  var url = "https://data.gov.sg/api/action/datastore_search";
  var response = UrlFetchApp.fetch(url,data).getContentText();
}

I receive a 404 error. I think the option "data" was not passed.

Would appreciate some help. I am a math teacher, not a coding expert.

Update: I changed the code to this but still 404 error.

function testapi(){
  var data = {
    resource_id: '1b702208-44bf-4829-b620-4615ee19b57c', // the resource id
    limit: 5, // get 5 results
    q: 'Yishun' // query for 'jones'
  };

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

  var url = "https://data.gov.sg/api/action/datastore_search";
      var response = UrlFetchApp.fetch(url,options).getContentText();

  }
1
Possible duplicate of Mobiledevices: action missingTheMaster
I changed the code but still got a 404 error.Yew Hong Ng
The method is wrong.TheMaster
I did change the method to get but the error remains.Yew Hong Ng

1 Answers

1
votes

Issue:

Whenever payload key is present in options/params argument of UrlFetchApp, the method is set to post by default. And any attempt to change the method to get is "silently" ignored. Other similar scripting platforms automatically convert the payload to url query parameters. But, UrlFetchApp silently changes the method to post and nothing else.

Solution:

Re-create the data object as a query string. For example, data:{x:1,y:2} should be changed to ?x=1&y=2 and appended to url.

Snippet:

function testapi() {
  var options = {
    method: 'get',
    // 'contentType': 'application/json',
    // 'payload' : data,//If set, method is ignored.
    headers: { Accept: '*/*', 'Content-Type': 'application/json' },
    muteHttpExceptions: true,
  };

  var url = 'https://data.gov.sg/api/action/datastore_search';
  //var url = 'https://httpbin.org/get'; test the method

  function objectToQueryParams(obj) {
    return (
      '?' +
      Object.entries(obj)
        .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
        .join('&')
    );
  }
  var data = {
    resource_id: '1b702208-44bf-4829-b620-4615ee19b57c', // the resource id
    limit: 5, // get 5 results
    q: 'Yishun', // query for 'Yishun'
  };
  var query = objectToQueryParams(data);
  url += query;
  var response = UrlFetchApp.fetch(url, options).getContentText();
  Logger.log(response);
}

function objectToQueryParams(obj) {
  return (
    '?' +
    Object.entries(obj)
      .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
      .join('&')
  );
}


var data = {
  resource_id: '1b702208-44bf-4829-b620-4615ee19b57c', // the resource id
  limit: 5, // get 5 results
  q: 'Yishun', // query for 'jones'
};
console.log(objectToQueryParams(data));

Related:

UrlSearchParams