Нужно оптимизировать Google Apps Script, чтобы сократить время выполнения скрипта - PullRequest
0 голосов
/ 20 февраля 2019

Я построил систему стилей "Конвейер" в Google Sheets, чтобы перемещать пользователей из следующих слотов в более близкие слоты, когда они становятся доступными.

Снимок экрана макета Google Sheets, где это реализовано.

Screenshot of the Google Sheets layout

Например, если кто-то был в «Пользователе 1», но затем ушел, он перемещает пользователя в «Пользователе 2» в «Пользователя 1»,Пользователь в «Пользователь 3» переходит к «Пользователь 2» и т. д., проталкивая их по цепочке, гарантируя, что слоты используются по порядку.

Поскольку требования основаны на времени, часто бывает так, чтоПользователи 1, 2 и 3 удаляются одновременно, это означает, что один человек остался в слоте «Пользователь 4».Используя текущий скрипт, он переместит их из «Пользователь 4» -> «Пользователь 3» -> «Пользователь 2» -> «Пользователь 1».

Кроме того, из-за некоторого форматирования, которое я настроил (индексирование), мне нужно, чтобы в ячейках отображалось слово «Нет» вместо того, чтобы оставаться пустым.Я смог сделать это легко, проверив, пуста ли ячейка, и если это так, установив значение «Нет».

Скрипт работает, но он действительно медленный.Общее время выполнения сценария составляет более 14 секунд.

Вот сценарии, которые я использую:

function conveyor() {
  var s = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('UsernameSheet');
  // LOOP 1
  var Username1Val = s.getRange('C3').getDisplayValue();
  var Username2Val = s.getRange('I3').getDisplayValue();
  var Username3Val = s.getRange('O3').getDisplayValue();
  var Username4Val = s.getRange('U3').getDisplayValue();
  var Username1 = s.getRange('C3')
  var Username2 = s.getRange('I3')
  var Username3 = s.getRange('O3')
  var Username4 = s.getRange('U3')
  if (Username3Val == 'None') {
    FourtoThree();
  }
  if (Username1.isBlank()) {
    Username1.setValue('None');
  }
  if (Username2.isBlank()) {
    Username2.setValue('None');
  }
  if (Username3.isBlank()) {
    Username3.setValue('None');
  }
  if (Username4.isBlank()) {
    Username4.setValue('None');
  }
  if (Username2Val == 'None') {
    ThreetoTwo();
  }
  if (Username1.isBlank()) {
    Username1.setValue('None');
  }
  if (Username2.isBlank()) {
    Username2.setValue('None');
  }
  if (Username3.isBlank()) {
    Username3.setValue('None');
  }
  if (Username4.isBlank()) {
    Username4.setValue('None');
  }
  if (Username1Val == 'None') {
    TwotoOne();
  }
  if (Username1.isBlank()) {
    Username1.setValue('None');
  }
  if (Username2.isBlank()) {
    Username2.setValue('None');
  }
  if (Username3.isBlank()) {
    Username3.setValue('None');
  }
  if (Username4.isBlank()) {
    Username4.setValue('None');
  }

  // LOOP 2    
  var Username1Val = s.getRange('C3').getDisplayValue();
  var Username2Val = s.getRange('I3').getDisplayValue();
  var Username3Val = s.getRange('O3').getDisplayValue();
  var Username4Val = s.getRange('U3').getDisplayValue();
  var Username1 = s.getRange('C3')
  var Username2 = s.getRange('I3')
  var Username3 = s.getRange('O3')
  var Username4 = s.getRange('U3')

  if (Username3Val == 'None') {
    FourtoThree();
  }
  if (Username1.isBlank()) {
    Username1.setValue('None');
  }
  if (Username2.isBlank()) {
    Username2.setValue('None');
  }
  if (Username3.isBlank()) {
    Username3.setValue('None');
  }
  if (Username4.isBlank()) {
    Username4.setValue('None');
  }
  if (Username2Val == 'None') {
    ThreetoTwo();
  }
  if (Username1.isBlank()) {
    Username1.setValue('None');
  }
  if (Username2.isBlank()) {
    Username2.setValue('None');
  }
  if (Username3.isBlank()) {
    Username3.setValue('None');
  }
  if (Username4.isBlank()) {
    Username4.setValue('None');
  }
  if (Username1Val == 'None') {
    TwotoOne();
  }
  if (Username1.isBlank()) {
    Username1.setValue('None');
  }
  if (Username2.isBlank()) {
    Username2.setValue('None');
  }
  if (Username3.isBlank()) {
    Username3.setValue('None');
  }
  if (Username4.isBlank()) {
    Username4.setValue('None');
  }

  // LOOP 3    
  var Username1Val = s.getRange('C3').getDisplayValue();
  var Username2Val = s.getRange('I3').getDisplayValue();
  var Username3Val = s.getRange('O3').getDisplayValue();
  var Username4Val = s.getRange('U3').getDisplayValue();
  var Username1 = s.getRange('C3')
  var Username2 = s.getRange('I3')
  var Username3 = s.getRange('O3')
  var Username4 = s.getRange('U3')

  if (Username3Val == 'None') {
    FourtoThree();
  }
  if (Username1.isBlank()) {
    Username1.setValue('None');
  }
  if (Username2.isBlank()) {
    Username2.setValue('None');
  }
  if (Username3.isBlank()) {
    Username3.setValue('None');
  }
  if (Username4.isBlank()) {
    Username4.setValue('None');
  }
  if (Username2Val == 'None') {
    ThreetoTwo();
  }
  if (Username1.isBlank()) {
    Username1.setValue('None');
  }
  if (Username2.isBlank()) {
    Username2.setValue('None');
  }
  if (Username3.isBlank()) {
    Username3.setValue('None');
  }
  if (Username4.isBlank()) {
    Username4.setValue('None');
  }
  if (Username1Val == 'None') {
    TwotoOne();
  }
  if (Username1.isBlank()) {
    Username1.setValue('None');
  }
  if (Username2.isBlank()) {
    Username2.setValue('None');
  }
  if (Username3.isBlank()) {
    Username3.setValue('None');
  }
  if (Username4.isBlank()) {
    Username4.setValue('None');
  }
}

function FourtoThree() {

  var s = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('UsernameSheet');
  var Username3Name = s.getRange('O3');
  var Username3NameVal = s.getRange('O3').getDisplayValue();
  var Username3Start = s.getRange('O4');
  var Username3StartVal = s.getRange('O4').getDisplayValue();
  var Username3Finish = s.getRange('O5');
  var Username3FinishVal = s.getRange('O5').getDisplayValue();
  var Username3Break = s.getRange('Q7');
  var Username3BreakVal = s.getRange('Q7').getDisplayValue();
  var Username3Busy = s.getRange('Q6');
  var Username3BusyVal = s.getRange('Q6').getDisplayValue();

  var Username4Name = s.getRange('U3');
  var Username4NameVal = s.getRange('U3').getDisplayValue();
  var Username4Start = s.getRange('U4');
  var Username4StartVal = s.getRange('U4').getDisplayValue();
  var Username4Finish = s.getRange('U5');
  var Username4FinishVal = s.getRange('U5').getDisplayValue();
  var Username4Break = s.getRange('W7');
  var Username4BreakVal = s.getRange('W7').getDisplayValue();
  var Username4Busy = s.getRange('W6');
  var Username4BusyVal = s.getRange('W6').getDisplayValue();

  Username3Name.setValue(Username4NameVal);
  Username3Start.setValue(Username4StartVal);
  Username3Finish.setValue(Username4FinishVal);
  Username3Break.setValue(Username4BreakVal);
  Username3Busy.setValue(Username4BusyVal);
  Username4Name.clearContent();
  Username4Start.clearContent();
  Username4Finish.clearContent();
  Username4Break.clearContent();
  Username4Busy.clearContent();
}

function ThreetoTwo() {

  var s = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('UsernameSheet');

  var Username2Name = s.getRange('I3');
  var Username2NameVal = s.getRange('I3').getDisplayValue();
  var Username2Start = s.getRange('I4');
  var Username2StartVal = s.getRange('I4').getDisplayValue();
  var Username2Finish = s.getRange('I5');
  var Username2FinishVal = s.getRange('I5').getDisplayValue();
  var Username2Break = s.getRange('K7');
  var Username2BreakVal = s.getRange('K7').getDisplayValue();
  var Username2Busy = s.getRange('K6');
  var Username2BusyVal = s.getRange('K6').getDisplayValue();

  var Username3Name = s.getRange('O3');
  var Username3NameVal = s.getRange('O3').getDisplayValue();
  var Username3Start = s.getRange('O4');
  var Username3StartVal = s.getRange('O4').getDisplayValue();
  var Username3Finish = s.getRange('O5');
  var Username3FinishVal = s.getRange('O5').getDisplayValue();
  var Username3Break = s.getRange('Q7');
  var Username3BreakVal = s.getRange('Q7').getDisplayValue();
  var Username3Busy = s.getRange('Q6');
  var Username3BusyVal = s.getRange('Q6').getDisplayValue();

  Username2Name.setValue(Username3NameVal);
  Username2Start.setValue(Username3StartVal);
  Username2Finish.setValue(Username3FinishVal);
  Username2Break.setValue(Username3BreakVal);
  Username2Busy.setValue(Username3BusyVal);
  Username3Name.clearContent();
  Username3Start.clearContent();
  Username3Finish.clearContent();
  Username3Break.clearContent();
  Username3Busy.clearContent();
}

function TwotoOne() {

  var s = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('UsernameSheet');

  var Username1Name = s.getRange('C3');
  var Username1NameVal = s.getRange('C3').getDisplayValue();
  var Username1Start = s.getRange('C4');
  var Username1StartVal = s.getRange('C4').getDisplayValue();
  var Username1Finish = s.getRange('C5');
  var Username1FinishVal = s.getRange('C5').getDisplayValue();
  var Username1Break = s.getRange('E7');
  var Username1BreakVal = s.getRange('E7').getDisplayValue();
  var Username1Busy = s.getRange('E6');
  var Username1BusyVal = s.getRange('E6').getDisplayValue();

  var Username2Name = s.getRange('I3');
  var Username2NameVal = s.getRange('I3').getDisplayValue();
  var Username2Start = s.getRange('I4');
  var Username2StartVal = s.getRange('I4').getDisplayValue();
  var Username2Finish = s.getRange('I5');
  var Username2FinishVal = s.getRange('I5').getDisplayValue();
  var Username2Break = s.getRange('K7');
  var Username2BreakVal = s.getRange('K7').getDisplayValue();
  var Username2Busy = s.getRange('K6');
  var Username2BusyVal = s.getRange('K6').getDisplayValue();

  Username1Name.setValue(Username2NameVal);
  Username1Start.setValue(Username2StartVal);
  Username1Finish.setValue(Username2FinishVal);
  Username1Break.setValue(Username2BreakVal);
  Username1Busy.setValue(Username2BusyVal);
  Username2Name.clearContent();
  Username2Start.clearContent();
  Username2Finish.clearContent();
  Username2Break.clearContent();
  Username2Busy.clearContent();
}

Что делает сценарий Во-первых запускается, чтобы проверить, если имена пользователей 1-4 имеют пустую клетку.Если они это делают, они устанавливают значения «Нет».

Затем выполняется оператор IF, чтобы проверить, если Имя пользователя 3 = Нет, если это так, тогда он запускает функцию FourtoThree, которая сама по себе перемещает значения изИмя пользователя 4 - Имя пользователя 3. Затем он проверяет Имя пользователя 2, затем имя пользователя 1 и выполняет те же функции перемещения данных, если значение равно «Нет».Затем вся эта функция запускается 3 раза, максимальное количество ходов, которое потребуется для конвейерной системы.

Я все еще новичок в Google Apps Script (ну, в общем, JavaScript), так что я бросил это вместеи был счастлив, что это сработало.

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

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

1 Ответ

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

Вот прототип, который вы можете попробовать, но я не использую «Нет», просто пусто

function conveyor() {
  var s = SpreadsheetApp.getActiveSpreadsheet();
  // Get range C3:W7
  var r = s.getSheetByName('Test').getRange(3,3,5,21);
  var users = r.getValues();
  var formulas = r.getFormulas();
  for( var i=0; i<13; i+=6 ) {  // Only do it 3 times
    if( users[0][i] === "" ) {
      users[0][i] = users[0][i+6];  // Username
      users[0][i+6] = "";
      users[1][i] = users[1][i+6];  // Start time
      users[1][i+6] = "";
      users[2][i] = users[2][i+6];  // Finish time
      users[2][i+6] = "";
      users[3][i+2] = users[3][i+8];  // Busy
      users[3][i+8] = false;
      users[4][i+2] = users[4][i+8];  // Break
      users[4][i+8] = false;
    }
  }
  for( var i=0; i<users.length; i++ ) {
    for( var j=0; j<users[0].length; j++ ) {
      if( formulas[i][j] !== "" ) users[i][j] = formulas[i][j].toString();
    }
  }

  r.setValues(users);

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