Google скрипт l oop производительность - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в скриптах Google, и я не уверен, почему у меня такие низкие показатели по сравнению с Excel VBA для простого l oop.

Я приложил код ниже, который является oop на ~ 1200 строк и удаляет около 2-3 строк в секунду!

Является ли написанный мной сценарий очень неэффективным? Я пока не знаком с Javascript, но он не выглядит для меня неэффективным.

Это нормально? Является ли сервер сейчас очень медленным, но обычно намного лучше?

var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Sheet1");  
  var drng = sheet.getDataRange();
  var rng = sheet.getRange(2,1, drng.getLastRow()-1,26);

  var rangeformula = sheet.getRange(2,26, drng.getLastRow()-1);
  rangeformula.setFormula('=SUM(K2:V2)'); var rngA = rng.getValues();


var len = rngA.length;
for(var i = len; i>=1; i--) {

  if(rngA[i-2][25] == 0){

    sheet.deleteRow(i);}}

Ответы [ 3 ]

2 голосов
/ 09 апреля 2020

Хорошо, для новичка не очевидно, что удаление строк является таким дорогостоящим процессом (по сравнению с VBA). Вот обходной путь, который я использовал, чтобы избежать удаления строк внутри al oop.

PS: я новичок в этом, так что это не самый элегантный способ, но может быть полезным для других.

function removeEmpty() {


var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Sheet1");  
  var drng = sheet.getDataRange();
  var rng = sheet.getRange(2,1, drng.getLastRow()-1,26);
  var rangeformula = sheet.getRange(2,26, drng.getLastRow()-1);
  rangeformula.setFormula('=SUM(K2:V2)');
  var rngA = rng.getValues();
  var newRangeVals = [];
  var len = rngA.length+1;
  for(var i = len; i >=2; i--){
    if(rngA[i-2][25] != 0){

  newRangeVals.push(rngA[i-2]);
};
  };




rng.clearContent();

  var newRange = sheet.getRange(2,1,newRangeVals.length, newRangeVals[0].length);
  newRange.setValues(newRangeVals);

}
1 голос
/ 09 апреля 2020
  • Вы хотите уменьшить стоимость процесса вашего сценария.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом, как об одном из нескольких возможных ответов.

Точки модификации:

  • В вашем сценарии я думаю, что причина вашей проблемы связана со стоимостью deleteRow а не стоимость за oop. В этом случае, чтобы снизить стоимость, я хотел бы предложить использовать Sheets API. При использовании Sheets API все строки могут быть удалены одним вызовом API. Таким образом, я думаю, что стоимость может быть уменьшена.
  • В вашем для l oop, rngA[i-2] выполняется в l oop из for(var i = len; i>=1; i--). В этом случае я думаю, что когда i равно 1, возникает ошибка. Так что, если вы хотите l oop перед одним элементом от последнего элемента до 1-го элемента, измените его на for(var i = len; i>=2; i--) {.
    • Но в этой модификации for l oop не используется.

Модифицированный скрипт:

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

С:
var len = rngA.length;
for(var i = len; i>=1; i--) {

  if(rngA[i-2][25] == 0){

    sheet.deleteRow(i);}}
К:
const sheetId = sheet.getSheetId();
const requests = rngA.reduce((ar, r, i) => {
  if (r[25] === 0) {
    ar.push({deleteDimension: {range: {sheetId: sheetId, startIndex: i + 1, endIndex: i + 2, dimension: "ROWS"}}});
  }
  return ar;
}, []).reverse();
Sheets.Spreadsheets.batchUpdate({requests: requests}, ss.getId());

Примечание:

  • Пожалуйста, запустите скрипт с включением V8.

Ссылки:

Если я неправильно понял ваш вопрос и это не то направление, которое вы хотите, я приношу свои извинения.

0 голосов
/ 09 апреля 2020
function myfunction() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheet=ss.getSheetByName("Sheet1");  
  var drng=sheet.getDataRange();
  var rng=sheet.getRange(2,1,sheet.getLastRow()-1,26);
  var vA=rng.getValues();
  var d=0;
  for(var i=0;i<vA.length;i++) {
    if(vA[i][25]==0){
      sheet.deleteRow(i+2-d++);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...