目标。 点击一个按钮选择一个选项来隐藏一些行。例如,点击选择单元格A4,隐藏A5-A8行,另一个A45隐藏A46-A59行。一个按钮会是首选,但我会接受任何东西。如果我可以使用自定义的图片,那就加分。
我有一个隐藏行的功能,但它只是有时工作,可能很慢(需要5s或20s以上,虽然我有900行),或者有时只隐藏一些列表,不管长度。我从别的地方复制了这个函数,我可能没有以最好的方式实现它,这可能解释了一些问题,但它是如何工作的。
在B8上有一个下拉列表(数据验证,项目列表)。有两个选项,一个是空白(技术上说是不可移动的字符),另一个是 "H"。在C列中,我将这段代码复制到我想要隐藏的特定单元格中。
=IF(B8="H","Hide","Show")
这就是脚本
/** HideRow */
function onEdit()
{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var lastRow = sheet.getLastRow();
for( i=1 ; i<=lastRow ; i++) { // i <= lastRow
var status = sheet.getRange("C"+i).getValue(); // C = the column that writes Show/Hide
if (status == "Hide") { // status == "Hide"
sheet.hideRows(i);
}
if (status == "Show"){ // status == "Show"
sheet.showRows(i);
}
}
}
随着时间的推移,我会添加更多的行,我不知道脚本是否会在单元格移动时跟踪它,这就是为什么我在单个单元格中写了一行代码(也许一个数组可以解决由于冗余而导致的速度减慢?虽然如果它在脚本中的效果比任何方式都要好。在这种情况下,一个命名的范围是否有用?
我已经看了一些其他的东西,但没有运气,主要是因为除了变量之外,我不知道我还需要改变什么。
onSelectionChange触发器
你只需要进行新的选择,然后选择A4或A45,这样就可以切换指定行的可见性。 重点是,如果你已经在其中一个单元格上,你再选择它那就不行了,必须在选定的范围内进行更改。
新的好处是,你不需要任何按钮或复选框。
function onSelectionChange(e) {
//Logger.log(JSON.stringify(e));
//e.source.toast('Entry');
const C=['A4','A45'];//trigger ranges
const R=[{row:5,count:4},{row:46,count:14}];//hide/show ranges with row and count for each
const sh=e.range.getSheet();
const idx=C.indexOf(e.range.getA1Notation());
if(idx!=-1) {
//e.source.toast('idx= ' + idx);
if(sh.isRowHiddenByUser(R[idx].row)) {
sh.showRows(R[idx].row,R[idx].count);
}else{
sh.hideRows(R[idx].row,R[idx].count);
}
}
}
这个版本使用了触发字符串 ~1~ 和 ~2~,并且工作时的相对偏移量为 1 行,这是可以配置的。
function onSelectionChange(e) {
//Logger.log(JSON.stringify(e));
//e.source.toast('Entry');
const T=['~1~','~2~'];
const R=[{row:0,offset:1,count:4},{row:0,offset:1,count:14}];
const sh=e.range.getSheet();
const idx=T.indexOf(e.range.getValue());
R[idx].row=e.range.getRow()+R[idx].offset
if(idx!=-1) {
//e.source.toast('idx= ' + idx);
if(sh.isRowHiddenByUser(R[idx].row)) {
sh.showRows(R[idx].row,R[idx].count);
}else{
sh.hideRows(R[idx].row,R[idx].count);
}
}
}
另一个版本。
function onSelectionChange(e) {
e.source.toast('Entry');
const obj={T:[],R:[new shrows(1,5,'~1~'),new shrows(1,5,'~2~'),new shrows(1,5,'~3~'),new shrows(1,5,'~4~')]};
obj.R.forEach(function(e,i){obj.T.push(e.tstring)});
const sh=e.range.getSheet();
const idx=obj.T.indexOf(e.range.getValue());
obj.R[idx].row=e.range.getRow()+obj.R[idx].offset
if(idx!=-1) {
//e.source.toast('idx= ' + idx);
if(sh.isRowHiddenByUser(obj.R[idx].row)) {
sh.showRows(obj.R[idx].row,obj.R[idx].count);
}else{
sh.hideRows(obj.R[idx].row,obj.R[idx].count);
}
}
}
function shrows(offset,count,tstring) {
this.offset=offset;
this.count=count;
this.tstring=tstring;
this.row=0;
}
关于这个触发器的坏消息是,目前还没有一个可安装的版本,所以你不能执行需要权限的操作。