2013-03-25 11 views
10

Sto imparando gli script di Google Apps da utilizzare con i fogli di calcolo di Google.Come eseguire il ciclo dell'intervallo di celle e impostare il valore nella colonna adiacente

Ho una lista di URL in una colonna e voglio scrivere uno script per ottenere l'elemento titolo da ogni URL e scriverlo nella cella adiacente. Ho compiuto questo per una specifica cella secondo il seguente script:

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

questo diventa l'URL nella G3, lo analizza, tira l'elemento e scrive l'output in H3.

Ora che ho questo elemento di base, voglio eseguire il ciclo dell'intera colonna G e scrivere l'output nella cella adiacente, ma sono bloccato. Qualcuno può indicarmi la giusta direzione?

risposta

21

può sembrare qualcosa di simile a questo:

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

Grazie Bryan, che è molto elegante. Posso chiederlo, usi gli array in questa soluzione e spinga. Per quanto riguarda le prestazioni, questo ha vantaggi particolari se si dispone di un numero elevato di righe? Mille grazie per aver trovato il tempo per postare questo! – needlesslosses

+0

Vantaggio su quale alternativa? Ho spinto a 2 matrici b/c non sapevo se fosse necessario restituire 1 (titleList) senza valori vuoti. –

+0

Vantaggio rispetto al fare un ciclo e spingere ogni valore non appena diventa disponibile. Il mio codice (non molto carino) era molto più lento, quindi ho risposto alla mia domanda. Grazie ancora! – needlesslosses

Problemi correlati