1

Ziel: Ich versuche, Daten von einer Website zu ziehen und verwenden Sie es, um eine große Tabelle zu erstellen. Ich kann sagen, dass ich sehr nahe daran bin, das zum Laufen zu bringen, aber ich habe eine Straßensperre erreicht.Daten Scraping mit ImportHTML in Apps Script & Google Tabellen

Hintergrund: Ich habe ein Google-Blatt mit drei Seiten. (1) Die betitelten "Ticker" sind eine Liste aller Ticker im S & P 500 in den Reihen A1-A500. (2) Betiteltes actionField ist nur eine leere Seite während des Skripts. (3) Betiteltes Ergebnisfeld enthält die Ergebnisse. Die Website, von der ich ziehe, ist (http://www.reuters.com/finance/stocks/companyOfficers?symbol=V). Ich möchte, dass das Skript (mit geringfügigen Änderungen) für alle Daten funktioniert, auf die über importHtml zugegriffen werden kann.

Script: Das Skript I ist momentan wie folgt:

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

Dieser greift erfolgreich den Ticker von der tickers Seite. Ruft importHtml auf. Kopiert die Daten. Und fügt SOMETHING auf der rechten Seite hinzu. Es läuft durch und macht dies für jeden Punkt in der Ticker-Liste.

jedoch, wobei die Daten angehängt wird, wie folgt:

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

, die sich über viele Spalten zeigt, für so viele Zeilen, wie es Iterationen in der Schleife sind.

Wie füge ich die Daten erfolgreich an?

(Und jede Beratung über dieses Skript zu verbessern?)

Antwort

1

Die appendRow method ist hier nicht geeignet. Da es nur eine Zeile anfügt, wird erwartet, dass sein Argument ein 1D-Array von Werten ist.

Was Sie von getValues erhalten, ist normalerweise ein 2D-Array von Werten, wie [[a,b], [c,d]]. Auch wenn es nur eine Zeile ist, gibt getValues[[a,b]] zurück. Die einzige Ausnahme ist ein einzelliger Bereich, für den Sie nur den Wert in dieser Zelle erhalten. Es ist nie ein 1D-Array.

Wenn nur eine Zeile benötigt wird, verwenden Sie z. B. appendRow(importedData[0]).

Andernfalls die erforderliche Anzahl von Zeilen einfügen und ihnen das 2D-Wertefeld zuweisen.

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