Javascript 显示/隐藏行的Google脚本非常慢(并且崩溃)

Javascript 显示/隐藏行的Google脚本非常慢(并且崩溃),javascript,performance,google-apps-script,google-sheets,Javascript,Performance,Google Apps Script,Google Sheets,我有一个脚本,通过隐藏和显示适当的行,根据单元格(A1)过滤工作表。它正在工作,但由于工作表每年都变大,它已经在一行一行地隐藏/取消隐藏时运行得非常慢。我想以某种方式批处理这些,并只执行一次隐藏/取消隐藏功能。不幸的是,我没那么幸运。下面是两张工作表的代码,但速度太慢(太慢,有时会崩溃): 函数选择earadj(){ var ss=SpreadsheetApp.getActiveSpreadsheet(); var表=ss.getSheetByName(“调整”); var yrCell=she

我有一个脚本,通过隐藏和显示适当的行,根据单元格(A1)过滤工作表。它正在工作,但由于工作表每年都变大,它已经在一行一行地隐藏/取消隐藏时运行得非常慢。我想以某种方式批处理这些,并只执行一次隐藏/取消隐藏功能。不幸的是,我没那么幸运。下面是两张工作表的代码,但速度太慢(太慢,有时会崩溃):

函数选择earadj(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var表=ss.getSheetByName(“调整”);
var yrCell=sheet.getRange(“A1”).getValue()
//var lastRow=sheet.getLastRow();额外的不必要的var?
var allRange=sheet.getRange(“A3:A”)
变量i=1
如果(yrCell==“全部”| | yrCell==“全部”){
//var rowAll=sheet.getRange(“A:A”);额外的不必要的var?
表.未被忽略的行(所有范围);
}
其他的
{
sheet.hideRow(allRange);//隐藏标题下的所有行

while(sheet.getRange(“A”+i.getValue()!=”){//i这里有一个更快的ChooseEarAlt函数替代方案:

function chooseYearAlt() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("ADJUSTMENTS");
  var yrCell = sheet.getRange("A1").getValue();
  var allRange = sheet.getRange("A3:A");

  sheet.unhideRow(allRange);

  if (yrCell != "ALL" && yrCell != "all"){
    var lastRow = sheet.getLastRow();
    var year
    for (var i = 3;i<lastRow;i++) {
      year = sheet.getRange(i, 18).getValue(); // The 18 means column R
      if (year != yrCell) {sheet.hideRow(sheet.getRange(i, 1));}
    }
  }
}
您可以对团队销售表使用相同的逻辑


PS:如果您使用公式,请确保在两次调整中都替换“Z”!A:Z为工作表调整的最后一列,这样它会带来整个工作表。

这里有一个更快的选项供您选择EARALT函数:

function chooseYearAlt() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("ADJUSTMENTS");
  var yrCell = sheet.getRange("A1").getValue();
  var allRange = sheet.getRange("A3:A");

  sheet.unhideRow(allRange);

  if (yrCell != "ALL" && yrCell != "all"){
    var lastRow = sheet.getLastRow();
    var year
    for (var i = 3;i<lastRow;i++) {
      year = sheet.getRange(i, 18).getValue(); // The 18 means column R
      if (year != yrCell) {sheet.hideRow(sheet.getRange(i, 1));}
    }
  }
}
您可以对团队销售表使用相同的逻辑


PS:如果您使用该公式,请确保在两次调整中都替换“Z”!A:Z为工作表调整的最后一列,这样它会带来整个工作表。

您不能在脚本开始时按年份对它们进行排序,然后使用
hideRows()整体隐藏行吗
的性能要比循环和隐藏每一列要好得多。我不这么认为,因为大多数列都是从另一张表中导入的。至少在我看来,排序会弄乱导入功能。我希望我可以共享这些表,这样每个人都能更好地看到这一点,但这是私人购房者信息,并且在3张表之间链接工作表,所有这些私有数据我最近还想添加一个helper列,该列为任何应该显示的行返回+行号。然后我使用concatenate创建一个helper单元格,其中包含要显示的行的完整列表,如:A1、A2、A5、A10、A50-等。但是,无论我如何格式化(“A1、A2”[“A1”、“A2”];等等)当我使用getRangeList来决定在脚本中显示什么时,它会返回错误“在对象中找不到函数getRangeList”。因此,解决这个问题可能也会解决这个问题。能否在脚本开始时按年份对它们进行排序,然后集体隐藏行?使用
hideRows()
的性能要比循环和隐藏每一列要好得多。我不这么认为,因为大多数列都是从另一张表中导入的。至少在我看来,排序会弄乱导入功能。我希望我可以共享这些表,这样每个人都能更好地看到这一点,但这是私人购房者信息,并且在3张表之间链接工作表,所有这些私有数据我最近还想添加一个helper列,该列为任何应该显示的行返回+行号。然后我使用concatenate创建一个helper单元格,其中包含要显示的行的完整列表,如:A1、A2、A5、A10、A50-等。但是,无论我如何格式化(“A1、A2”[“A1”、“A2”];等等)当我使用getRangeList决定在脚本中显示什么时,它返回错误“在对象中找不到函数getRangeList”。所以,也许解决这个问题也能解决问题。谢谢你的这些想法。遗憾的是,修改后的代码没有比我已有的更快。你关于在另一张工作表上使用查询的想法对TEAM SALES工作表来说是一个很好的解决方案。但是,这无助于调整,因为该工作表由用户编辑。现在,我已经完成了为筛选器视图添加了一个不幸的列,但我仍在寻找一种使用脚本的方法。感谢您的这些想法。遗憾的是,修改后的代码没有比我已有的更快。您关于在另一个工作表上使用查询的想法对TEAM SALES工作表是一个很好的修复。但是,这无助于调整,因为现在,我为过滤器视图添加了一个不幸的列,但我仍在寻找一种使用脚本的方法。
function chooseYearAlt() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("ADJUSTMENTS");
  var yrCell = sheet.getRange("A1").getValue();
  var allRange = sheet.getRange("A3:A");

  sheet.unhideRow(allRange);

  if (yrCell != "ALL" && yrCell != "all"){
    var lastRow = sheet.getLastRow();
    var year
    for (var i = 3;i<lastRow;i++) {
      year = sheet.getRange(i, 18).getValue(); // The 18 means column R
      if (year != yrCell) {sheet.hideRow(sheet.getRange(i, 1));}
    }
  }
}
=IF(OR(ADJUSTMENTS!A1="ALL",ADJUSTMENTS!A1="all",ISBLANK(ADJUSTMENTS!A1)),QUERY(ADJUSTMENTS!A:Z,"SELECT *"),QUERY(ADJUSTMENTS!A:Z,"SELECT * WHERE R = "&ADJUSTMENTS!A1&""))