如何使用 for 循环加速 if 语句

How to speed up if statements with for loop

我正在尝试在 Google Apps 脚本中创建一个编辑功能,自动 checks/changes 格式化 Sheet 2 上的某些复选框(“干预Sheet” ) 基于在 Sheet 1(“sessionFocus”)上选中的复选框。 Sheet 1 上的每个复选框都与 Sheet 2 上它自己独特的一组复选框相关联。我已经想出如何通过使用重复的 if 语句来做到这一点,但这会显着降低处理速度。我正在寻求有关如何使用批处理(数组、for 语句等)来提高代码效率的帮助。请参阅下面的当前(低效)代码。

function populateInterventions(e) 
{
  var sessionFocus = SpreadsheetApp.getActive().getSheetByName('Session Focus');
  var interventionSheet = SpreadsheetApp.getActive().getSheetByName('Therapeutic Intervention');

  if(e.range.getA1Notation()=='B23')
  {
  var range3a = interventionSheet.getRangeList(['J78','Q69','Q71','Q72']);
  var range3b = interventionSheet.getRangeList(['J78','K78','Q69','R69','Q71','R71','Q72','R72']);

  if(sessionFocus.getRange('B23').isChecked()==true)
      { 
        range3a.check();
        range3b.setBackground('#cfe2f3');
        range3a.setBorder(null,null,null,true,null,null,'#cfe2f3',null);
      }
  else
      {
        range3a.uncheck();
        range3b.setBackground('#ffffff');
        range3a.setBorder(null,null,null,true,null,null,'#ffffff',null);
      }
  }

  if(e.range.getA1Notation()=='B24')
  {
  var range4a = interventionSheet.getRangeList(['J18','J20','J32','J84','J85']);
  var range4b = interventionSheet.getRangeList(['J18','K18','J20','K20','J32','K32','J84','K84','J85','K85']);

  if(sessionFocus.getRange('B24').isChecked()==true)
      { 
        range4a.check();
        range4b.setBackground('#cfe2f3');
        range4a.setBorder(null,null,null,true,null,null,'#cfe2f3',null);
      }
  else
      {
        range4a.uncheck();
        range4b.setBackground('#ffffff');
        range4a.setBorder(null,null,null,true,null,null,'#ffffff',null);
      }
  }

  if(e.range.getA1Notation()=='B26')
  {
  var range5a = interventionSheet.getRangeList(['J86','J87','N61','Q79','Q80']);
  var range5b = interventionSheet.getRangeList(['J86','K86','J87','K87','N61','O61','Q79','R79','Q80','R80']);

  if(sessionFocus.getRange('B26').isChecked()==true)
      { 
        range5a.check();
        range5b.setBackground('#cfe2f3');
        range5a.setBorder(null,null,null,true,null,null,'#cfe2f3',null);
      }
  else
      {
        range5a.uncheck();
        range5b.setBackground('#ffffff');
        range5a.setBorder(null,null,null,true,null,null,'#ffffff',null);
      }
  }

在这种特定情况下,使用循环看起来没有意义,因为脚本的代码部分仅在编辑特定单元格时执行。


为了使您的脚本在执行时间方面尽可能高效,您必须尽可能减少对 Google Apps 脚本服务的调用。

  1. 避免在循环中调用 Google Apps 脚本服务
  2. 利用变量

即而不是

if(e.range.getA1Notation()=='B23')
if(e.range.getA1Notation()=='B24')
if(e.range.getA1Notation()=='B26')

在做变量声明之前

const cellAddress = e.range.getA1Notation()

然后使用变量而不是执行多个 Google Apps 脚本服务调用

if(cellAddress=='B23')
if(cellAddress=='B24')
if(cellAddress=='B26')

关于使用数组、for 循环等,这可能有助于编写更好的脚本,使它们更具可读性、可维护性、可扩展性等,但您可能会发现它们不会对脚本性能产生真正相关的影响仅使用“基本”服务(即 SpreadsheetApp)时。

在更复杂的脚本上,可能值得使用 Advanced Sheets Service,以便能够通过使用 batchUpdate.

“一次”进行多项更改

资源