2013-03-25 12 views
10

Poznaję skrypty Google Apps do użytku z Arkuszami kalkulacyjnymi Google.Jak zapętlić zakres komórek i ustawić wartość w sąsiedniej kolumnie

Mam listę adresów URL w jednej kolumnie i chcę napisać skrypt, aby uzyskać tytuł z każdego adresu URL i zapisać go w sąsiedniej komórce. I dokonał tego dla jednej konkretnej komórki zgodnie z poniższym scenariuszem:

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

to pobiera adres URL w G3, analizuje je, wyciąga element i zapisuje dane wyjściowe w H3.

Teraz, gdy mam ten podstawowy element konstrukcyjny, chcę zapętlić całą kolumnę G i zapisać wynik w sąsiedniej komórce, ale utknąłem. Czy ktoś może wskazać mi właściwy kierunek?

Odpowiedz

21

może wyglądać mniej więcej tak:

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

Dziękuję Bryan, że jest bardzo elegancki. Czy mogę zapytać, używasz tablic w tym rozwiązaniu i pchasz. Wydajność, czy to ma jakieś szczególne zalety, jeśli masz długą liczbę rzędów? Wielkie dzięki za poświęcenie czasu na opublikowanie tego! – needlesslosses

+0

Przewaga nad jaką alternatywą? Popchnąłem do 2 tablic b/c Nie wiedziałem, czy trzeba po prostu zwrócić 1 (titleList) bez pustych wartości. –

+0

Przewaga nad wykonywaniem pętli i przesuwanie każdej wartości, gdy stanie się dostępna. Mój (niezbyt ładny) kod był znacznie wolniejszy, więc odpowiedziałem na moje pytanie. Dzięki jeszcze raz! – needlesslosses

Powiązane problemy