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