在Apps脚本中使用ImportHTML进行数据抓取& Google表格

时间:2016-05-05 19:14:03

标签: javascript google-apps-script web-scraping google-sheets

目标:我正在尝试从网站提取数据并使用它来创建一个大表。我可以说我非常接近让这个工作,但我已经遇到了障碍。

背景: 我有一个三页的谷歌表。 (1)标题“代码”是S& P 500中每个股票代码的列表,在A1-A500行中。 (2)标题actionField只是脚本中使用的空白页面。 (3)标题resultField将保存结果。我要提取的网站是(http://www.reuters.com/finance/stocks/companyOfficers?symbol=V)尽管如此,我希望脚本可以通过importHtml访问任何数据(稍作修改)。

脚本: 我目前的脚本如下:

function populateData() {
var googleSheet = SpreadsheetApp.getActive();

// Reading Section

var sheet = googleSheet.getSheetByName('tickers');

var tickerArray = sheet.getDataRange().getValues();
var arrayLength = tickerArray.length;
var blankSyntaxA = 'ImportHtml("http://www.reuters.com/finance/stocks/companyOfficers?symbol=';
var blankSyntaxB = '", "table", 1)';

// Writing Section

for (var i = 0; i < arrayLength; i++)
  {
     var sheet = googleSheet.getSheetByName('actionField'); 
     var liveSyntax = blankSyntaxA+tickerArray[i][0]+blankSyntaxB;
     sheet.getRange('A1').setFormula(liveSyntax);
     Utilities.sleep(5000);
     var importedData = sheet.getDataRange().getValues();
     var sheet = googleSheet.getSheetByName('resultField'); 
     sheet.appendRow(importedData)
  }  
}

这成功地从代码页面抓取了代码。调用importHtml。复制数据。并将SOMETHING添加到正确的页面。它遍历并为代码清单中的每个项目执行此操作。

但是,附加的数据如下:

[Ljava.lang.Object;@42782e7c
[Ljava.lang.Object;@2de9f184
[Ljava.lang.Object;@4b86a4d0

在多个列中显示,与循环中的迭代一样多的行。

如何成功附加数据?

(以及有关改进此脚本的任何建议吗?)

1 个答案:

答案 0 :(得分:1)

这里不适合appendRow method。因为它只附加一行,所以它的参数应该是一维值数组。

您从getValues获得的内容通常是二维数组,例如[[a,b], [c,d]]。即使它只是一行,getValues也会返回[[a,b]]。唯一的例外是单细胞范围,您只能获得该细胞中的值。它从不一维数组。

如果只需要一行,请使用例如appendRow(importedData[0])

否则,插入所需的行数并为其分配2D数组值。

 var sheet = googleSheet.getSheetByName('resultField'); 
 var lastRow = sheet.getLastRow();
 sheet.insertRowsAfter(lastRow, importedData.length);
 sheet.getRange(lastRow + 1, 1, importedData.length, importedData[0].length)
      .setValues(importedData);