Google脚本执行时间超过300行

时间:2019-02-19 06:18:33

标签: google-apps-script

我有一个75列的Google工作表。
我使用doGet通过apps脚本在电子表格中创建数据...该脚本是从计算机上的静态HTML页面形式运行的。

apps脚本被部署为Web应用程序,并且任何人(包括匿名用户)都已部署。 我使用的脚本来自crazycoders-
https://www.crazycodersclub.com/appscript/crud-operation-on-google-spread-sheet-using-google-app-script-html-jquery/

当没有太多记录时,它可以正常工作。但是,一旦它越过200行数据,记录创建时间就从大约2秒增加到20秒。

然后我在电子表格中添加了900行进行测试,当我尝试创建时-脚本会一直运行-我在4分钟后停止了它。所以看起来超过200行时,效率急剧下降

能否请您分享有关如何实现它的想法,尤其是当行数很大时。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

该脚本的insert_value()函数看起来像遍历每一行以检查是否已经存在一些ID。它对每一行执行一次getRange()调用。众所周知,这是一个较慢的操作。


解决方案

我们需要修改该脚本,以使其一次获取整列,然后遍历该列,而不是一次获取一行...

这只是脚本执行此操作的一个示例,但是看起来它发生了很多次……

  var lr= sheet.getLastRow();
  for(var i=1;i<=lr;i++){
    var id1 = sheet.getRange(i, 2).getValue();
    if(id1==id){
      flag=0;
      var result="Id already exist..";
    } }

我已经对其进行了更新,通过一次获取整列内容来使其更有效

var lr= sheet.getLastRow();
var ids = sheet.getRange(1, 2, lr, 1).getValues(); //Get the whole ids column at once

  for(var i=1;i<=ids.length;i++){ // Now loop through the column to see if id already exists.
    if(ids[i]==id){
      flag=0;
      var result="Id already exists..";
    } 
  }

这是全部更新的脚本。我尚未测试此代码,您应该在测试数据中使用它并在测试实时重要数据之前全面测试所有功能

function doGet(e){

  var op = e.parameter.action;

  var ss=SpreadsheetApp.openByUrl("Your Spread sheet URL");
  var sheet = ss.getSheetByName("Sheet1");


  if(op=="insert")
    return insert_value(e,sheet);

  //Make sure you are sending proper parameters 
  if(op=="read")
    return read_value(e,ss);

  if(op=="update")
    return update_value(e,sheet);

  if(op=="delete")
    return delete_value(e,sheet);



}

//Recieve parameter and pass it to function to handle




function insert_value(request,sheet){


  var id = request.parameter.id;
  var country = request.parameter.name;

  var flag=1;
  var lr= sheet.getLastRow();
  var ids = sheet.getRange(1, 2, lr, 1).getValues(); //Get the whole ids column at once

  for(var i=1;i<=ids.length;i++){ // Now loop through the column to see if id already exists.
    if(ids[i]==id){
      flag=0;
      var result="Id already exists..";
    } 
  }

  //add new row with recieved parameter from client
  if(flag==1){
    var d = new Date();
    var currentTime = d.toLocaleString();
    var rowData = sheet.appendRow([currentTime,id,country]);  
    var result="Insertion successful";
  }
  result = JSON.stringify({
    "result": result
  });  

  return ContentService
  .createTextOutput(request.parameter.callback + "(" + result + ")")
  .setMimeType(ContentService.MimeType.JAVASCRIPT);   
}





function read_value(request,ss){
  var output  = ContentService.createTextOutput()
      data    = {};
  //Note : here sheet is sheet name , don't get confuse with other operation 
  var sheet="Source";

  data.records = readData_(ss, sheet);

  var callback = request.parameters.callback;

  if (callback === undefined) {
    output.setContent(JSON.stringify(data));
  } else {
    output.setContent(callback + "(" + JSON.stringify(data) + ")");
  }
  output.setMimeType(ContentService.MimeType.JAVASCRIPT);

  return output;
}


function readData_(ss, sheetname, properties) {

  if (typeof properties == "undefined") {
    properties = getHeaderRow_(ss, sheetname);
    properties = properties.map(function(p) { return p.replace(/\s+/g, '_'); });
  }

  var rows = getDataRows_(ss, sheetname),
      data = [];

  for (var r = 0, l = rows.length; r < l; r++) {
    var row     = rows[r],
        record  = {};

    for (var p in properties) {
      record[properties[p]] = row[p];
    }

    data.push(record);

  }
  return data;
}



function getDataRows_(ss, sheetname) {
  var sh = ss.getSheetByName(sheetname);

  return sh.getRange(2, 1, sh.getLastRow() - 1, sh.getLastColumn()).getValues();
}


function getHeaderRow_(ss, sheetname) {
  var sh = ss.getSheetByName(sheetname);

  return sh.getRange(1, 1, 1, sh.getLastColumn()).getValues()[0];  
}


//update function

function update_value(request,sheet){

  var output  = ContentService.createTextOutput();
  var id = request.parameter.id;
  var flag=0;
  var country = request.parameter.name;

  var lr= sheet.getLastRow();
  var ids = sheet.getRange(1, 2, lr, 1).getValues(); //Get the whole ids column at once

  for(var i=1;i<=ids.length;i++){ // Now loop through the column to see if id already exists.
    if(ids[i]==id){
      sheet.getRange(i+1,3).setValue(country);
      var result="value updated successfully";
      flag=1;
    } 
  }

  if(flag==0)
    var result="id not found";

  result = JSON.stringify({
    "result": result
  });  

  return ContentService
  .createTextOutput(request.parameter.callback + "(" + result + ")")
  .setMimeType(ContentService.MimeType.JAVASCRIPT);   


}




function delete_value(request,sheet){

  var output  = ContentService.createTextOutput();
  var id = request.parameter.id;
  var country = request.parameter.name;
  var flag=0;


  var lr= sheet.getLastRow();
  var ids = sheet.getRange(1, 2, lr, 1).getValues();

  for(var i=1;i<=ids.length;i++){
    if(ids[i]==id){
      sheet.deleteRow(i+1);
      var result="value deleted successfully";
      flag=1;
    } 
  }

  if(flag==0)
    var result="id not found";



  result = JSON.stringify({
    "result": result
  });  

  return ContentService
  .createTextOutput(request.parameter.callback + "(" + result + ")")
  .setMimeType(ContentService.MimeType.JAVASCRIPT);    
}