我有以下代码根据第一行/列的内容(无论是大于还是小于0)在工作表中显示或隐藏列/行,当从可安装的触发器调用时,它可以很好地工作,但是作为一个onEdit
函数,它不起作用。
理想情况下,我想避免使用可安装的触发器,因为它不会随工作表一起复制,并且主要是作为要重复复制的模板。
数据保存在表单“输入”中,然后在表单“表”(受保护)中提供查询数据。理想情况下,它应该以编辑方式(在工作表输入上)或以一分钟的时间间隔运行(这是首选选项,但如果涉及使用如上所述的触发器程序,则不可以)。
如下所示的当前版本不会创建任何错误消息,但也无法正常运行。
function onEdit(){
hideEmptyRows();
hideCols();
}
function hideCols() {
var sh = SpreadsheetApp.getActive().getSheetByName('table');
var totalsRow = 1;
sh.getRange(totalsRow, 3, 1, sh.getMaxColumns()-3).getValues()[0]
.forEach(function(el, i) {
if (!el || el >= 1) sh.showColumns(i + 3)
});
sh.getRange(totalsRow, 3, 1, sh.getMaxColumns()-3).getValues()[0]
.forEach(function(el, i) {
if (!el || el <= 0) sh.hideColumns(i + 3)
})
}
function hideEmptyRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("Table"); // Enter sheet name
var row = s.getRange('A:A').getValues(); // Enter
column letter that has the text "hide" and "unhide"
s.showRows(1, s.getMaxRows());
for(var i=0; i< row.length; i++){s.showRows(i+1, 1); if(row[i] == 0) { s.hideRows(i+1, 1); } // Value to hide
}}
您的代码应该工作正常。
但是,建议利用事件对象 e
。在当前解决方案中,如果您对另一张纸进行任何更改,则onEdit
可能会更改该纸table
。也许这是理想的行为,但我不建议这样做。
您可以使用事件对象在此特定项目中进行的另一项改进forEach
是在第一行发生更改时执行零件。即,例如,如果编辑了第2行,则无需执行for循环来执行第1行的计算。
在这里,我为您提供了更易于维护/面向未来的解决方案:
function onEdit(e) {
const sheet_name = 'table';
const row = e.range.getRow();
const col = e.range.getColumn();
const sh = e.source.getActiveSheet();
const totalsRow = 1;
if(sh.getName() == sheet_name && row == totalsRow ){
sh.getRange(totalsRow, 3, 1, sh.getMaxColumns()-3).getValues()[0]
.forEach(function(el, i) {
if (!el || el <= 0) sh.hideColumns(i + 3);
if (!el || el > 0) sh.showColumns(i + 3);
})
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句