2

我正在谷歌应用程序中为电子表格构建一个脚本,它可以让我隐藏 H 列包含星号 (*) 的行。电子表格目前有 700 多行,当我运行脚本时,它需要大约 90 秒才能完成,我可以看到结果。没有人有时间做这个,所以我试图让它更有效率。

这就是拼凑起来的代码的样子,我不知道如何重写它以使其更快。我从这里得到了灵感;根据单元格中的第一个字符隐藏 Google 电子表格中的行

/**
 * Hides rows where H = Astrisk, Unhides where H != Astrisk
 */
function updateProgram() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Week 1-4");
  var data = sheet.getRange('H:H').getValues();

//iterate over all rows
  for(var i=0; i< data.length; i++){
    //compare first character, if asterisk, then hide row
    if(data[i][0].charAt(0) == '*'){
      sheet.hideRows(i+1);
    } else sheet.showRows(i+1);
  }
}

它目前正在运行所有行并在单个条件下执行函数并在每一行上执行一个函数。我已经考虑过这个可能的解决方案;

  • 如果 H = * || 行显示 然后隐藏
  • 如果 H != * || 行被隐藏然后显示
  • 否则什么都不做

所以只有需要隐藏/显示的行才能得到它。

感谢您花时间阅读本文 - 如果您能帮助我,我们将不胜感激!

更新;

我想出了一种对行进行分组的方法,根据一个值显示和隐藏许多行。代码现在看起来像这样,运行需要 10 秒。

这是我的第一个自己编写的代码,欢迎任何反馈!

function updateProgramWeek1to4() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("Week 1-4");
var row = s.getRange('G:G').getValues();
var maxRows = s.getMaxRows();

s.showRows(1, maxRows);

for(var i=0; i< row.length; i++){
   if(row[i] == '0'){
     s.hideRows(i+1, 11);
   } 
     else if(row[i] == '1'){
     s.hideRows(i+3, 9);
   } 
     else if(row[i] == '2'){
     s.hideRows(i+4, 8);   
   } 
     else if(row[i] == '3'){
     s.hideRows(i+5, 7);
   } 
     else if(row[i] == '4'){
     s.hideRows(i+6, 6);   
   } 
     else if(row[i] == '5'){
     s.hideRows(i+7, 5);
   } 
     else if(row[i] == '6'){
     s.hideRows(i+8, 4);
   } 
     else if(row[i] == '7'){
     s.hideRows(i+9, 3);
   } 
     else if(row[i] == '8'){
     s.hideRows(i+10, 2);
   } 
     else if(row[i] == '9'){
     s.hideRows(i+11, 1);
   } 
     else if(row[i] == '10'){
     s.hideRows(i+12);  
   }
     else if(row[i] == '11'){
     s.hideRows(i+1);  
   }
  }
 }
4

2 回答 2

2

您可以通过使用 sheet.hideRows/showRows 中的第二个参数来让它更快,它告诉它要处理多少。您需要更改循环并记住有多少行具有相同的状态。当状态更改时,您会批量显示/隐藏。

于 2013-10-04T13:17:03.410 回答
2

我创建了这个脚本的修改版本。

是一个演示电子表格。创建您自己的副本。它一次隐藏多达 500 行。这个想法类似于使用最少数量的纸币支付现金。该脚本从工作表上的列中读取数字 1、5、10、50、100 和 500,并一次隐藏那么多行。每个连续行块都是单独计算的。这意味着如果您希望中间的某些行可见,那么在这些行之前或之后的隐藏行的处理速度同样快。假设您有一些可见行,然后是 63 个隐藏行,然后是一些可见行,然后是 756 个隐藏行。这 63 行将分 5 步处理为 50+10+1+1+1。756 行分 6 步处理,即 500+100+100+50+5+1。

感谢上面的 user2845885 编写和共享代码的初始版本。这是我的修改版本:

function hideRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("Demo sheet"); // Enter sheet name
var row = s.getRange('B:B').getValues(); // Enter column letter that has the numbers 500, 100, 50, 10, 5, 1

s.showRows(1, s.getMaxRows());

for(var i=0; i< row.length; i++){ 
if(row[i] == '500') { s.hideRows(i+1, 500); }
else if(row[i] == '100'){ s.hideRows(i+1, 100); }
else if(row[i] == '50'){ s.hideRows(i+1, 50); }
else if(row[i] == '10'){ s.hideRows(i+1, 10); }
else if(row[i] == '5'){ s.hideRows(i+1, 5); }
else if(row[i] == '1'){ s.hideRows(i+1, 1); } } }

我对编码不太了解,但我对公式相当熟悉。然而,令人惊讶的是,为数字列编写公式比脚本要困难得多。这是棘手的部分:假设数字列中的下一个数字是 10,这意味着脚本将一次隐藏 10 行。仅当 10 之后的接下来的 9 行不包含脚本正在查找的任何数字时,这才有效。因此这个公式非常棘手。以下是如何创建数字列:假设在从 A2 开始的列 A 中,它在要隐藏的行中显示“隐藏”并且可见行是空白的。将此公式输入到单元格 B2 并向下复制:

=IF(OR(A2="",
SUM($B1:INDEX(B$1:B1,IF(row()-499<1,1,row()-499)))>=500,
SUM($B1:INDEX(B$1:B1,IF(row()-99<1,1,row()-99)))>=100,
SUM($B1:INDEX(B$1:B1,IF(row()-49<1,1,row()-49)))>=50,
SUM($B1:INDEX(B$1:B1,IF(row()-9<1,1,row()-9)))>=10,
SUM($B1:INDEX(B$1:B1,IF(row()-4<1,1,row()-4)))>=5),
"",
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=500,500,
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=100,100,
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=50,50,
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=10,10,
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=5,5,
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)<5,1)))))))
于 2016-02-22T23:38:22.860 回答