Как уменьшить количество вызовов сервисов Google App Script - PullRequest
0 голосов
/ 28 мая 2019

Этот сценарий переименовывает имена листов со значением в A1. Я управляю школьной базой данных с более чем 150 листами. Сценарий выдает ошибку максимального времени выполнения. Я прочитал здесь на форумах, что вы можете уменьшить количество звонков в сервис. Это здесь Тайм-аут сценария приложения Google ~ 5 минут? выглядит как решение, но я не могу в своей жизни обернуться вокруг происходящего.

Я, наверное, должен упомянуть, что я полный нуб, и ваша помощь окажет огромную помощь.

function onEdit() {
var ss = SpreadsheetApp.getActive();
var allsheets = ss.getSheets();

// Array holding the names of the sheets to exclude from the execution
var exclude ="Sheet1","Sheet2","Sheet3","Article","Frontpage","Logos","Sheet4","Sheet5","Sheet6","Sheet10"];

for(var s=10;s<allsheets.length;s++) {
var sheet = allsheets[s];
var oldName = sheet.getName();
var newName = sheet.getRange(1,1).getValue();
if (newName.toString().length>0 && newName !== oldName) {
sheet.setName(newName);

// Stop iteration execution if the condition is meet.
if(exclude.indexOf(sheet.getName())==-1) continue;
}

} // end of loop

} // end of function

Пожалуйста, помогите мне сократить количество вызовов службы, выполняемых сценарием, или ускорить способ избежать ошибки тайм-аута.

// Обновленный скрипт

// Пример кода ниже, генерирующий ошибку отсутствует) после условия

function testArray() {
    var arr = ["Sh1","Sh2","Sh3","Sh4","Sh5","Sh6","Sh7","Sh8","Sh9","Sh10"];  //etc etc
    var res = [];

    arr.forEach(function (element,index) {
        if(index>9) {
            var sheet = allsheets[s];
            var oldName = sheet.getName();
            var newName = sheet.getRange(1,1).getValue(); 

            if (newName.toString().length>0 && newName !== oldName) {
                sheet.setName(newName); // Stop iteration execution if the condition is meet. 
                if(exclude.indexOf(sheet.getName())==-1}) continue; //iterable code goes here; 
            }
        // }
     }); 
}

1 Ответ

1 голос
/ 28 мая 2019

Прежде всего, избавьтесь от ненужных звонков - вы рассматривали splice() часть моего ответа на свой предыдущий вопрос?

allsheets.splice(0,10); //0-based start and end indexes;

Если с исключенными именами листов можно встретиться где-либо, сохраните ваши операторы exclude Array и if (кстати, в вашем образце, похоже, опечатка - в объявлении Array пропущена открывающая скобка).

Независимо от того, как вы исключаете свои первые 10 листов, вызов остановки итерации становится излишним, когда вы вызываете getName() метод allsheets.length раз (таким образом, 150 ненужных вызовов метода) - вместо этого обращайтесь к переменной newName.

Вы можете дополнительно уменьшить количество вызовов, проверив условие перед вызовом метода setName() (при условии, что вы не хотите ничего делать, если новое имя в exclude Array).

Затем используйте цикл for для выполнения тех же манипуляций (обратите внимание, что в случае фильтрации Array с использованием splice() индекс s должен быть 0):

for(var s=10; s<allsheets.length; s++) {
  var sheet = allsheets[s];
  var oldName = sheet.getName();
  var newName = sheet.getRange(1,1).getValue();

  //this reduces setName() calls if you don't need to set reserved names;
  if(exclude.indexOf(newName)!==-1) { continue; }

  if (newName.toString().length>0 && newName !== oldName) {
    sheet.setName(newName);
  }
}

В качестве альтернативы, вы можете использовать forEach для выполнения желаемых манипуляций. Вот так будет выглядеть вся функция с использованием splice() и forEach():

function testArray() { 

  var ss = SpreadsheetApp.getActive();
  var arr = ss.getSheets();

  arr.splice(0,10); //removes first 10 Sheets from Array;

  var exclude = []; //fill with unchangeable names;

  arr.forEach(function (sheet,index) { //iterates over Array of Sheets;

      var oldName = sheet.getName(); 
      var newName = sheet.getRange(1,1).getValue(); 

      if(newName.toString().length>0 && newName!==oldName) { 

        //Move to next iteration if new name should be excluded;
        if(exclude.indexOf(newName)===-1) {
          sheet.setName(newName); //set name otherwise;
        }

      }

  }); // end of loop 

} // end of function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...