使用Google Apps脚本和Yahoo Query Language从网页获取数据

时间:2015-03-10 11:32:35

标签: google-apps-script

使用Google Apps脚本,我编写了以下函数来将一条信息提取到电子表格中:

function myFunction(symbol, elemento) {

  var url   = "http://www.example.com/query?symbol=" + symbol;

  switch (elemento) {
    case 'one':
      var xpath='//*[@id="sectionTitle"]/h1';
      break;
    case 'two':
      var xpath='//*[@id="headerQ"]/div[1]/div/span[2]'
      break;
  }
  var query = "select * from html where url = '" + url + "' and xpath = '" + xpath + "'";

  var yql   = "https://query.yahooapis.com/v1/public/yql?format=json&q=" + encodeURIComponent(query);

  var response = UrlFetchApp.fetch(yql);
  var json = JSON.parse(response.getContentText());

  switch(elemento){
    case 'one':
      return json.query.results.h1;
      break;
    case 'two':
      return ponto(json.query.results.span.content);
      break;
  }
}

现在,在将单元格中的函数输入时可以正常工作,但“有时”我会在带有注释的单元格中收到错误#ERROR!

TypeError: Can't read "h1"  property of null. (line 54).

删除该单元格并再次输入该功能通常有效。

为什么这个函数是易变的(即:它确实有效,但有时只有)?

1 个答案:

答案 0 :(得分:0)

您需要使用fetch进行一些错误检查。任何通过互联网的请求都可能失败。

如果未找到结果,则结果对象值将为null。我提出了快速退款,但您可能需要使用这些数字来满足您的需求。

var response = UrlFetchApp.fetch(yql);
var json = JSON.parse(response.getContentText());
var backoff = 1;
while((json.query.results == null || response.getResponseCode() != 200)){
  Utilities.sleep((Math.pow(2,backoff)*1000) + (Math.round(Math.random() * 1000)));
  response = UrlFetchApp.fetch(yql);
  json = JSON.parse(response.getContentText());
  backoff++;
}