加快UrlFetch Google App脚本的速度?

时间:2017-08-13 21:00:28

标签: javascript google-apps-script google-sheets

目标是通过大约10,000行链接。确定哪些页码> 3并突出显示第一列。我完成了所有这些,但问题是它需要Url Fetch太长时间,我遇到最大运行时错误。无论如何我可以加速这段代码,这样我可以通过10000行吗?

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


  }


}

编辑 - 短脚本:

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;

}

2 个答案:

答案 0 :(得分:2)

您可以替换它:

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

有了这个:

var lastChars = columnLogger.slice(-3);

您还可以从html侧边栏或对话框启动fetch脚本以运行短批处理,然后返回到成功处理程序,然后根据返回值启动另一个批处理。返回值也可用于在下一行开始下一批。它实际上需要更长的时间才能运行,但是你可以通过保持批量很小来保持在脚本限制之下。

enter image description here

答案 1 :(得分:0)

您可以使用

替换该行

var lastChars = columnLogger.slice(-3);