2017-08-13 8 views
0

Das Ziel ist es, etwa 10.000 Zeilen von Links zu durchlaufen. Bestimmen Sie, welche Seitenzahlen> 3 haben und markieren Sie die erste Spalte. Ich habe das alles erledigt, aber das Problem ist, dass es dauert Url Fetch zu lang, ich renne in einen maximalen Laufzeitfehler. Kann ich diesen Code trotzdem beschleunigen, damit ich die 10.000 Zeilen durchgehen kann?Beschleunigen UrlFetch Google App Scripts?

function readColumns() { 
    //program is going to run through column 3 by going through the amount of rows, truncating last three characters to see if pdf, then highlighting first column 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var columns = sheet.getDataRange(); 
    var rowNum = columns.getNumRows(); 
    var values = columns.getValues(); 
    var html; 
    var htmlString; 

    for(var i = 1; i <= rowNum; i++){ 
    var columnLogger = values[i][2]; 
    try{ 
     html = UrlFetchApp.fetch(values[i][2], 
     { 
     muteHttpExceptions: true, 
     } 
    ); 
    }catch(e){ 
     Logger.log("Error at line " + i); 
     var error = true; 
    } 
    htmlString = html.getContentText(); 
    var index = htmlString.indexOf("Pages") + 6; 
    var pageNumber = parseInt(htmlString.charAt(index),10); 

    var lastChars = "" + columnLogger.charAt(columnLogger.length-3) + columnLogger.charAt(columnLogger.length-2) + columnLogger.charAt(columnLogger.length-1); 

    if((error) || (!lastChars.equals("pdf") && values[i][6].equals("") && !pageNumber >= 3)){ 

     //goes back to first column and highlights yellow 
     var cellRange = sheet.getRange(1, 1, rowNum, 3) 
     var cell = cellRange.getCell(i+1, 1) 
     cell.setBackground("yellow"); 
    } 


    } 


} 

Bearbeiten - kurze Skripte:

function foreverCall(){ 
    var start = 1480; 

    for(;;){ 
    readColumns(start); 
    start = start + 100; 
    } 

} 


function readColumns(start) { 
    //program is going to run through column 3 by going through the amount of rows, truncating last three characters to see if pdf, then highlighting first column 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var columns = sheet.getDataRange(); 
    var rowNum = columns.getNumRows(); 
    var values = columns.getValues(); 
    var html; 
    var htmlString; 
    var error; 

    for(var i = start; i < start+100; i++){ 
    if(loop(values, error, html, htmlString, rowNum, sheet, columns, i)){ 

     var cellRange = sheet.getRange(1, 1, rowNum, 3) 
     var cell = cellRange.getCell(i, 1) 
     cell.setBackground("yellow"); 

    } 
    } 


} 

function loop(values, error, html, htmlString, rowNum, sheet, columns, i){ 
    var columnLogger = values[i][2]; 


    var lastChars = columnLogger.slice(-4); 

    if(!lastChars.equals(".pdf") && values[i][6].equals("")){ 


     return true; 


    }else{ 

     try{ 
     error = false 
     html = UrlFetchApp.fetch(values[i][2].toString()); 
     if(html == null){ 
      error = true; 
     } 
     }catch(e){ 
     Logger.log("Error at line " + i); 
     error = true; 
     } 
     if(!error){ 
     htmlString = html.getContentText(); 
     var index = htmlString.indexOf("Pages") + 6; 
     var pageNumber = parseInt(htmlString.charAt(index),10); 

     } 
     //goes back to first column and highlights yellow 
     if(error || !pageNumber >= 3){ 
     return true; 
     } 
    } 

    return false; 

} 

Antwort

2

Sie können diese ersetzen:

var lastChars = "" + columnLogger.charAt(columnLogger.length-3) + columnLogger.charAt(columnLogger.length-2) + columnLogger.charAt(columnLogger.length-1); 

mit diesem:

var lastChars = columnLogger.slice(-3); 

Sie können das Abrufscript auch über eine HTML-Sidebar oder einen HTML-Dialog initiieren, um kurze Batches auszuführen und dann zum Erfolgshandler zurückzukehren, der je nach Rückgabewert einen weiteren Batch initiieren kann. Der Rückgabewert könnte auch verwendet werden, um den nächsten Stapel in der nächsten Zeile zu starten. Es würde tatsächlich länger dauern, um zu laufen, aber Sie könnten wahrscheinlich unter dem Skript-Limit bleiben, indem Sie Ihre Chargen klein halten.

enter image description here

+0

Danke für die Antwort. Also, ich brauche wirklich nur die ersten 50 Zeichen dieser URL-Fetch-App, aber es muss immer die ganze Seite geladen werden. Gibt es trotzdem, um die Ausführungszeit zu beschleunigen, um es nur eine kleine Menge des HTML zu laden? Vielleicht eine Art Timeout (dh 20 ms), die diesen Befehl überspringen würde? Dies würde den HTML-Code hoffentlich kürzen. –

+0

Ich weiß es nicht wirklich, aber ich frage mich, ob Sie vielleicht Javascript und oder Cookies für den Abruf deaktivieren könnten. Sie können eine deutlich andere Seite erhalten, aber Sie können möglicherweise den Text erhalten, den Sie brauchen. Wirklich, das ist eine totale Vermutung meinerseits. – Cooper

+0

Ok, das ist in Ordnung. Ist das das, was Sie vorgeschlagen haben, um es unter dem Skript-Limit zu halten? Ich habe die Frage bearbeitet –

0

Sie mit der Linie mit

var lastChars = columnLogger.slice (-3) ersetzen kann;

+0

Würde es Ihnen etwas ausmachen, den Code mit vier Leerzeichen davor zu formatieren, damit er im Browser etwas lesbarer ist, und vielleicht erklären, warum das funktioniert? – PaSTE

Verwandte Themen