время выполнения скрипта Google слишком много для более чем 300 строк - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть лист Google с 75 столбцами.
Я использую doGet для создания данных в электронной таблице с помощью скрипта приложений ... скрипт запускается из моей статической HTML-страницы на моем компьютере.

Сценарий приложений разворачивается как веб-приложение и для всех, включая анонимных.Я использую скрипт от 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 голосов
/ 19 февраля 2019

Похоже, что функция 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);    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...