Повышение производительности в приложении Student Info - PullRequest
0 голосов
/ 22 февраля 2019

Я создал простую информационную платформу для студентов, используя Google Sheets.. Она позволяет пользователю запрашивать, обновлять и создавать новую информацию о студентах в пользовательском интерфейсе.Пожалуйста, обратитесь к этому листу , чтобы увидеть, как это работает.

Функции для Refresh/Update/Save находятся внутри кнопки Действия в строке меню.Кажется, все работает хорошо, однако, когда количество записей увеличивается, скажем, более 100 записей, все функции замедляются, и это становится чрезвычайно медленным с более чем 200 записями.

Спасибо, если кто-нибудь может помочь взглянуть на сценарии, так как я подозреваю, что их нужно оптимизировать.

Большое спасибо заранее!

function UpdateDataIntoMaster() { //This script is used in the SAVE button in UPDATE sheet)

/*Get data from UPDATE Sheet*/
  var ss = SpreadsheetApp.openById("11Djp9UmXbtWv7VitZFfo0X4Ctet3O8Amh4xADNKOZgY");
  var sheet = ss.getSheetByName('UPDATE');
  var range = sheet.getRange("D30:AE30"); //All data transposed into this line. MUST be updated if more fields are added into the Data sheet
  var values = range.getValues();
  var rangeForKey =  sheet.getRange("D30") //Student Name is used as the 
key identifier
  var keyValue = rangeForKey.getValue(); 

/*Pass in keyValue(identifier = Student Name)
  and all data in the function below in order 
  to update master data sheet*/
  updDbase(keyValue,values);

function updDbase(keyValue,values) {
  var ss = SpreadsheetApp.openById("11Djp9UmXbtWv7VitZFfo0X4Ctet3O8Amh4xADNKOZgY")
  var sheet = ss.getSheetByName('Data');
  var data = sheet.getDataRange().getValues();
  var noOfRow = values.length
  var noOfCol = values[0].length

    for (var i=0; i < data.length; i++) { // going through all the rows in Data sheet
        var keyData = ss.getSheetByName("Data").getRange(i+1,1).getValue(); //Get the Student Name from Data sheet
        if (keyData == keyValue) {      
     //   for (var j=0; j < data[i].length; j++) { // this is going through all the cell of a row
           var row = Number(i)+1;

           var sh = SpreadsheetApp.getUi();
           var response = sh.alert("Update Information","Are you sure you want to update the student information?", sh.ButtonSet.YES_NO);
           if (response == sh.Button.YES)
            {
              var sheets = ss.getSheetByName("Data").getRange(row,1,noOfRow,noOfCol).setValues(values);      
            }//If  response == YES

   }           
  }        
 }  
}

function CreateNew() {

/*Get data from Inquiry Sheet*/
  var ss = SpreadsheetApp.openById("11Djp9UmXbtWv7VitZFfo0X4Ctet3O8Amh4xADNKOZgY");
  var sheetNew = ss.getSheetByName('Create New');
  var range = sheetNew.getRange("D30:AZE30"); //All data transposed into 
this line
  var values = range.getValues();
  var rangeForKey =  sheetNew.getRange("E30") //Using Student ID as key identifier
  var keyValue = rangeForKey.getValue(); 
  var noOfRow = values.length
  var noOfCol = values[0].length
  var sheetData = ss.getSheetByName('Data');
  var lastRow = sheetData.getLastRow();
  var data = sheetData.getDataRange().getValues();

    for (var i=0; i < data.length; i++) { // going through all the rows in Data sheet
        var keyData = sheetData.getRange(i+1,2).getValue(); //Get the Student ID from Data sheet
        if (keyData == keyValue) {      
           AlertBox();//If Student ID is found, to prompt Student ID already 
exist
           return; 
         } //If
     }    //For
/*Confirming with user whether to proceed to create new entry*/       
       var sh = SpreadsheetApp.getUi();
       var response = sh.alert("Create New Record","Are you sure you want to 
create new student information?", sh.ButtonSet.YES_NO);
       if (response == sh.Button.YES){
         if (keyValue == ""){ 
             var response = sh.alert("Create New Record","Unable to proceed 
because Student ID is empty", sh.ButtonSet.OK);
             return;}
          else {
              //var response = sh.alert("Create New Record","Unable to 
proceed because Student ID is empty", sh.ButtonSet.OK);
              var sheets = 
sheetData.getRange(lastRow+1,1,1,noOfCol).setValues(values) 
               }
         }//If
}  

function EditStudentInfo() {
 var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Inquiry");  
 //var ss = SpreadsheetApp.getActive();
  var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
  for (var i = 0; i < protections.length; i++) {
    var protection = protections[i];
     if (protection.canEdit()) {
       protection.remove();
     }
}
}

function EditContent() {

     var s = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Update");

     var rangeContentCol1 = s.getRange("E3:E23");
     var CopyContentCol1  = s.getRange("E3:E23").getValues();
     var rangeContentCol2 = s.getRange("I3:I23");
     var CopyContentCol2  = s.getRange("I3:I23").getValues();

     rangeContentCol1.clearContent();
     rangeContentCol2.clearContent();

     var PasteContentCol1  = 
s.getRange("E3:E23").setValues(CopyContentCol1); 
     var PasteContentCol2  = s.getRange("I3:I23").setValues(CopyContentCol2); 
}

1 Ответ

0 голосов
/ 22 февраля 2019

Распространенная ошибка производительности людей со скриптом Apps - это .getRange().getValues() внутри их циклов for.С точки зрения производительности эти вызовы get и set довольно дороги.

К счастью, это довольно легко исправить - сначала получить все данные сразу, а затем выполнить их цикл. Вы на самом деле делаете это уже , вроде .В вашем скрипте вы получаете весь диапазон данных, но затем используете только часть данных и вместо этого делаете еще один вызов getValues.Я обновил две области в вашем скрипте, в которых было getRange() вызовов в цикле for -> var keyData = data[i][0];

function UpdateDataIntoMaster() { //This script is used in the SAVE button in UPDATE sheet)

/*Get data from UPDATE Sheet*/
  var ss = SpreadsheetApp.openById("11Djp9UmXbtWv7VitZFfo0X4Ctet3O8Amh4xADNKOZgY");
  var sheet = ss.getSheetByName('UPDATE');
  var range = sheet.getRange("D30:AE30"); //All data transposed into this line. MUST be updated if more fields are added into the Data sheet
  var values = range.getValues();
  var rangeForKey =  sheet.getRange("D30") //Student Name is used as the 
key identifier
  var keyValue = rangeForKey.getValue(); 

/*Pass in keyValue(identifier = Student Name)
  and all data in the function below in order 
  to update master data sheet*/
  updDbase(keyValue,values);

function updDbase(keyValue,values) {
  var ss = SpreadsheetApp.openById("11Djp9UmXbtWv7VitZFfo0X4Ctet3O8Amh4xADNKOZgY")
  var sheet = ss.getSheetByName('Data');
  var data = sheet.getDataRange().getValues();
  var noOfRow = values.length
  var noOfCol = values[0].length

    for (var i=0; i < data.length; i++) { // going through all the rows in Data sheet
        var keyData = data[i][0]; //Use the data that is already loaded.
        if (keyData == keyValue) {      
     //   for (var j=0; j < data[i].length; j++) { // this is going through all the cell of a row
           var row = Number(i)+1;

           var sh = SpreadsheetApp.getUi();
           var response = sh.alert("Update Information","Are you sure you want to update the student information?", sh.ButtonSet.YES_NO);
           if (response == sh.Button.YES)
            {
              var sheets = ss.getSheetByName("Data").getRange(row,1,noOfRow,noOfCol).setValues(values);      
            }//If  response == YES

   }           
  }        
 }  
}

function CreateNew() {

/*Get data from Inquiry Sheet*/
  var ss = SpreadsheetApp.openById("11Djp9UmXbtWv7VitZFfo0X4Ctet3O8Amh4xADNKOZgY");
  var sheetNew = ss.getSheetByName('Create New');
  var range = sheetNew.getRange("D30:AZE30"); //All data transposed into 
this line
  var values = range.getValues();
  var rangeForKey =  sheetNew.getRange("E30") //Using Student ID as key identifier
  var keyValue = rangeForKey.getValue(); 
  var noOfRow = values.length
  var noOfCol = values[0].length
  var sheetData = ss.getSheetByName('Data');
  var lastRow = sheetData.getLastRow();
  var data = sheetData.getDataRange().getValues();

    for (var i=0; i < data.length; i++) { // going through all the rows in Data sheet
        var keyData = data[i][0]; //Use the data that is already loaded.
        if (keyData == keyValue) {      
           AlertBox();//If Student ID is found, to prompt Student ID already 
exist
           return; 
         } //If
     }    //For
/*Confirming with user whether to proceed to create new entry*/       
       var sh = SpreadsheetApp.getUi();
       var response = sh.alert("Create New Record","Are you sure you want to 
create new student information?", sh.ButtonSet.YES_NO);
       if (response == sh.Button.YES){
         if (keyValue == ""){ 
             var response = sh.alert("Create New Record","Unable to proceed 
because Student ID is empty", sh.ButtonSet.OK);
             return;}
          else {
              //var response = sh.alert("Create New Record","Unable to 
proceed because Student ID is empty", sh.ButtonSet.OK);
              var sheets = 
sheetData.getRange(lastRow+1,1,1,noOfCol).setValues(values) 
               }
         }//If
}  

function EditStudentInfo() {
 var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Inquiry");  
 //var ss = SpreadsheetApp.getActive();
  var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
  for (var i = 0; i < protections.length; i++) {
    var protection = protections[i];
     if (protection.canEdit()) {
       protection.remove();
     }
}
}

function EditContent() {

     var s = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Update");

     var rangeContentCol1 = s.getRange("E3:E23");
     var CopyContentCol1  = s.getRange("E3:E23").getValues();
     var rangeContentCol2 = s.getRange("I3:I23");
     var CopyContentCol2  = s.getRange("I3:I23").getValues();

     rangeContentCol1.clearContent();
     rangeContentCol2.clearContent();

     var PasteContentCol1  = 
s.getRange("E3:E23").setValues(CopyContentCol1); 
     var PasteContentCol2  = s.getRange("I3:I23").setValues(CopyContentCol2); 
}

Дайте этот тест и дайте мне знать, если это поможет!

...