谷歌工作表问题自动隐藏行脚本反复运行

时间:2018-01-30 20:30:39

标签: javascript google-apps-script google-sheets google-sheets-api

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

我目前正在使用以下脚本以及帮助列来隐藏/取消隐藏工作表中的行,我们将其用作进样形式以收集屋顶更换项目的测量和规格(此处的方法 - https://productforums.google.com/forum/#!topic/docs/PnDxvRfDZ7A;context-place=topicsearchin/docs/authorid $ 3AAPn2wQcI1gyAZ6TGNLNixhJidWO7WxTAnkDDZmrnn18VK7N4DRU2VZKQwGG_XClrBImjg06chA6H %7Csort:日期%7Cspell:假)

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()); } 
}}

我使用相同代码的变体以及辅助列来隐藏我们用于计算所述屋顶项目成本的另一张纸上的行(自动隐藏规则仅隐藏总材料和人工成本等于零的行)< / p>

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); } 

}}

这两个脚本都在工作并根据其他选择或编辑隐藏行,但我遇到的问题是,每次进行更改或编辑时脚本似乎都会反复运行,这会使隐藏的行重新出现然后隐藏再次。等待脚本运行就是把事情搞砸了,所以我们想尽可能避免这种情况。

我已经尝试根据我在研究我的问题时能够找到的信息来修改脚本,但到目前为止还没有运气。打开有关编辑当前脚本或使用其他内容的建议。提前谢谢!

1 个答案:

答案 0 :(得分:0)

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

修改: .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('@');
};