如何基于另一个单元格显示隐藏行?(Google Apps ScriptSheets)

问题描述 投票:1回答:1

目标。 点击一个按钮选择一个选项来隐藏一些行。例如,点击选择单元格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); 
    }
   }
}

随着时间的推移,我会添加更多的行,我不知道脚本是否会在单元格移动时跟踪它,这就是为什么我在单个单元格中写了一行代码(也许一个数组可以解决由于冗余而导致的速度减慢?虽然如果它在脚本中的效果比任何方式都要好。在这种情况下,一个命名的范围是否有用?

我已经看了一些其他的东西,但没有运气,主要是因为除了变量之外,我不知道我还需要改变什么。

google-apps-script google-sheets hide show-hide show
1个回答
1
投票

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

关于这个触发器的坏消息是,目前还没有一个可安装的版本,所以你不能执行需要权限的操作。

onSelectionChange()

© www.soinside.com 2019 - 2024. All rights reserved.