需要优化Google Apps脚本以减少脚本运行时间

时间:2019-02-20 16:10:51

标签: google-apps-script google-sheets

我已经在Google表格中构建了一个“传送带”样式的系统,以便在有空位时将用户从其他位置移到更近的位置。

正在实施此设置的Google表格布局的屏幕截图。

Screenshot of the Google Sheets layout

例如,如果某人位于“用户1”中但又离开了,它将“用户2”中的用户移动到“用户1”,“用户3”中的用户移动到“用户2”,依此类推,沿着链条推动它们,确保按顺序使用插槽。

由于要求是基于时间的,因此通常情况下,同时删除用户1、2和3,这意味着一个人留在“用户4”插槽中。使用当前脚本,它将把它们从“用户4”->“用户3”->“用户2”->“用户1”中移出。

此外,由于我已经设置了某些格式(索引匹配),因此我需要单元格显示单词“ None”而不是保持空白。通过检查单元格是否为空白,然后将其值设置为“ None”,我可以轻松地做到这一点。

该脚本有效,但是速度很慢。脚本的总执行时间超过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。如果值是“ None”,则执行相同类型的数据移动功能。然后,整个功能将运行3次,这是传送带系统需要完成的最大移动次数。

我仍然是Google Apps脚本的新手(嗯,一般来说是JavaScript),所以我把它组合在一起并很高兴它能起作用。

现在,脚本的运行缓慢对于它的使用场景来说正成为问题,请寻找一种优化它的方法。

  

我根本不希望任何人写一个脚本来减轻我的麻烦,但是如果有人可以提出一个可以实现我想要做的功能的示例,和/或关于如何实现的想法实施它。

1 个答案:

答案 0 :(得分:0)

这是您可以尝试的原型,但我不会只使用空白的“ None”

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);

}