谷歌表格自动隐藏行脚本一遍又一遍运行的问题



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

我目前正在使用以下脚本以及辅助列来隐藏/取消隐藏工作表中的行,我们将其用作接收表单来收集屋顶更换项目的测量值和规格(方法可在此处找到 - 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()); } 
}}

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

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

最新更新