google 工作表的问题自动隐藏行脚本 运行 一遍又一遍

Problems with google sheets auto hide rows script running over and over

GAS 的新手,但真的很高兴了解如何为我们的销售团队定制 Google 表格,以便他们可以使用平板电脑在现场生成项目定价。任何帮助将不胜感激。

我目前正在使用以下脚本以及帮助列 sheet 中的 hide/unhide 行,我们将其用作收集表格来收集屋顶更换项目的测量值和规格(方法在这里找到- https://productforums.google.com/forum/#!topic/docs/PnDxvRfDZ7A;context-place=topicsearchin/docs/authorid$3AAPn2wQcI1gyAZ6TGNLNixhJidWO7WxTAnkDDZmrnn18VK7N4DRU2VZKQwGG_XClrBImjg06chA6H%7Csort:date%7Cspell:false)

function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("Shingle Roof Intake Form");
var row = s.getRange('A:A').getValues();                         

s.showRows(1, s.getMaxRows());
for(var i=0; i< row.length; i++){ if(row[i] == 'hide') { s.hideRows(i+1, 1); } 
   else if(row[i] == 'unhide'){ s.unhideRow(ss.getDataRange()); } 
}}

我正在使用相同代码的变体以及辅助列来隐藏另一个 sheet 上的行,我们用它来计算上述屋顶项目的成本(自动隐藏规则仅隐藏总计 material 且人工成本为零)

function onOpen(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("Newman Costs");
var row = s.getRange('A:A').getValues();                

s.showRows(1, s.getMaxRows());
for(var i=0; i< row.length; i++){ if(row[i] == 'hide') { s.hideRows(i+1, 1); } 

}}

这两个脚本都在工作并根据其他选择或编辑隐藏行,但我遇到的问题是每次进行更改或编辑时脚本似乎都运行一遍又一遍,这使得隐藏的行重新出现然后再次隐藏。等待 运行 的脚本会拖延时间,因此我们希望尽可能避免这种情况。

我已经尝试根据我在研究问题时能够找到的信息修改脚本,但到目前为止还没有成功。接受有关编辑当前脚本或使用不同内容的建议。提前致谢!

好的,谢谢你的挑战! 试试这个,让我知道它是否适合你:

编辑: .indexOf() 如果找不到则返回 -1 会弄乱要显示/隐藏的行号。它还隐藏/显示从当前行开始的行:将 sh.showRows(row, numRowsToToggle) 更改为 sh.showRows(row+1, numRowsToToggle)。将 e.source 替换为 SpreadsheetApp.getActive(),将 e.range 替换为 SpreadsheetApp.getActiveRange(),将 e.range.getSheet() 替换为 SpreadsheetApp.getActiveSheet()。现在它应该可以正常工作了。

function onEdit(e) { 
  var ss = SpreadsheetApp.getActive(); // Current Spreadsheet
  var range = SpreadsheetApp.getActiveRange(); // Current range
  var sh = SpreadsheetApp.getActiveSheet(); // Current sheet 
  var row = range.getRow(); // Current row
  var col = range.getColumn(); // Current column
  var value = range.getCell(1,1).getValue().trim(); // Current value
  var data = ss.getDataRange(); // Data range
  // Gets the yes/no questions column starting from the row after the current one
  // .flatten() converts 2D Array in a flat Array
  var yesno = sh.getRange(row+1, col, sh.getLastRow()-row+1).getValues().flatten();
  // Gets the next occurrence of 'Yes' or 'No'
  var nextNo = yesno.indexOf('No');
  var nextYes = yesno.indexOf('Yes');
  var nextYesNoRow;
  if (nextNo > -1 && nextYes > -1) { 
    nextYesNoRow = Math.min(nextYes+row, nextNo+row);
  } else if (nextNo == -1 ) {
    nextYesNoRow = nextYes+row;
  } else if (nextYes == -1) {
    nextYesNoRow = nextNo+row;
  } else {
    return;
  }
  // Gets the number of rows to hide/show
  var numRowsToToggle = nextYesNoRow - row;
  if (numRowsToToggle == 0) { return; }
  /* PREVENT UNNECESSARY SCRIPT EXECUTIONS */
  // If the edited cell is in another sheet terminate script
  if ('Shingle Roof Intake Form' != sh.getName()) { return; }
  // If the edited cell is outside the table terminate script
  if (col > data.getLastColumn() || row > data.getLastRow()) { return; }
  // If the edited cell column is not 4 ('Yes/No' answers column) terminate the script
  if (col != 4) { return; }
  // If value is 'Yes' shows, if 'No' hides
  switch (value) {
    case 'Yes' :
      sh.showRows(row+1, numRowsToToggle);
      break;
    case 'No' :
      sh.hideRows(row+1, numRowsToToggle);
  }
};

Array.prototype.flatten = function() {
  return this.join('@').split('@');
};