如何使用 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 脚本服务的调用。
- 避免在循环中调用 Google Apps 脚本服务
- 利用变量
即而不是
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
.
“一次”进行多项更改
资源
我正在尝试在 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 脚本服务的调用。
- 避免在循环中调用 Google Apps 脚本服务
- 利用变量
即而不是
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
.
资源