2013-03-25 16 views
10

Ich lerne Google Apps Scripts für die Verwendung mit Google Spreadsheets.Wie Schleifen Bereich von Zellen und Wert in benachbarten Spalte

Ich habe eine Liste von URLs in einer Spalte und ich möchte ein Skript schreiben, um das Titelelement von jeder URL zu erhalten und in die angrenzende Zelle schreiben. Ich habe dies gemäß dem folgenden Skript für eine bestimmte Zelle erreicht:

function getTitles() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("url_list"); 
    var range = sheet.getRange("G3"); 
    var url = range.getValue(); 

    var response = UrlFetchApp.fetch(url); 
    var doc = Xml.parse(response.getContentText(),true); 
    var title = doc.html.head.title.getText(); 
    var output = sheet.getRange("H3").setValue(title); 

    Logger.log(title); 
    return title; 
} 

Dies wird die URL in G3, analysiert er, zieht das Element und schreibt die Ausgabe in H3.

Jetzt, da ich diesen grundlegenden Baustein habe, möchte ich die gesamte G-Spalte loopen und die Ausgabe in die benachbarte Zelle schreiben, aber ich stecke fest. Kann mir jemand in die richtige Richtung zeigen?

Antwort

21

Mai wie folgt aussehen:

function getTitles() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("url_list"); 
    var urls = sheet.getRange("G3:G").getValues(); 
    var titleList = [], newValues = [], 
     response, doc, title; 

    for (var row = 0, var len = urls.length; row < len; row++) { 
    if (urls[row] != '') { 
     response = UrlFetchApp.fetch(urls[row]); 
     doc = Xml.parse(response.getContentText(),true); 
     title = doc.html.head.title.getText(); 
     newValues.push([title]); 
     titleList.push(title); 
     Logger.log(title); 
    } else newValues.push([]); 
    } 

    Logger.log('newValues ' + newValues); 
    Logger.log('titleList ' + titleList); 

    // SET NEW COLUMN VALUES ALL AT ONCE! 
    sheet.getRange("H3").offset(0, 0, newValues.length).setValues(newValues); 
    return titleList; 
} 
+1

Danke Bryan, dass sehr elegant ist. Kann ich fragen, Sie verwenden Arrays in dieser Lösung und drücken. Leistungsmäßig, hat das besondere Vorteile, wenn Sie eine lange Anzahl von Zeilen haben? Vielen Dank, dass du dir die Zeit genommen hast, dies zu posten! – needlesslosses

+0

Vorteil gegenüber welcher Alternative? Ich schob auf 2 Arrays b/c Ich wusste nicht, ob Sie nur 1 (titleList) ohne leere Werte zurückgeben mussten. –

+0

Vorteil gegenüber dem Ausführen einer Schleife und Drücken jedes Werts, sobald dieser verfügbar wird. Mein (nicht sehr schöner) Code war viel langsamer, so dass meine Frage beantwortet wurde. Danke noch einmal! – needlesslosses

Verwandte Themen