繁体   English   中英

Google Script自动隐藏空白单元格,应该刷新吗?

[英]Google Script to autohide empty cells, should refresh?

所以我想自动隐藏完全空的行。 有了代码,当我仍然希望显示带有N / A的列和行时,它可以自动隐藏所有带有空A列的内容,请参阅屏幕快照#1。 我还希望它更新onOpen或onChange并“取消隐藏”以前具有值的空行。 通过这个,我的意思是这个电子表格是基于另一个电子表格的查询和导入范围,而该电子表格仅提取某些列。 因此,另一个工作表是要编辑的工作表,并且此工作表使用importrange更新。 因此,如果将某些内容添加到先前为空的行中(出于此电子表格的目的,这是对个人的分配),我希望它取消隐藏现在也包含数据的行。

此外,这仅在我具有“编辑”功能的登录名时才起作用,而在仅查看且公众可访问的情况下则无法使用。

屏幕截图#1(显示所有行)

https://imgur.com/a/9SgJj8C

屏幕截图2(隐藏“空白”行)

https://imgur.com/a/Jzka2CG

屏幕快照3(仅查看模式不会使用脚本更新)

https://imgur.com/a/3CWnfIE

这是通过隐藏空行来清理格式。 通过寻找解决方案,我已经取得了进展,但步入僵局。

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn());

function onOpen() {
    var menuEntries = [];
  menuEntries.push({name: "Show All Rows", functionName: "showAllRows"});
  menuEntries.push(null);
  menuEntries.push({name: "Hide Empty Rows", functionName: "hideEmptyRows"});

  ss.addMenu("Row Visibility", menuEntries);
}{

    //get the values to those rows
    var values = range.getValues();

    //go through every row
    for (var i=0; i<values.length; i++){

        //if row value is equal to empty  
        if(values[i][0] === ""){

        //hide that row
        sheet.hideRows(i+1);   
        }   
    }
}

function showAllRows(){
    sheet.showRows(1,sheet.getLastRow());
}

function hideEmptyRows(){
        //get the values to those rows
    var values = range.getValues();

    //go through every row
    for (var i=0; i<values.length; i++){

        //if row value is equal to empty  
        if(values[i][0] === ""){

        //hide that row
        sheet.hideRows(i+1);
        }
    }
}

几点:

我仍然希望显示N / A的列和行

您当前的代码

if(values[i][0] === ""){

        //hide that row
        sheet.hideRows(i+1);   
        }   

如果第一列中的单元格为空,则隐藏整个行。 要仅在所有单元格为空时隐藏该行,您需要遍历所有单元格:

function hideEmptyRows(){
    //go through every row
    for (var i=0; i<values.length; i++){
        var empty=true;
        //go through every column
        for (var j=0; j<values[0].length; j++) {
         if(values[i][j] != ""){
           empty=false;
           break;
           }
          }
        if(empty == true){
        //hide that row
        sheet.hideRows(i+1);   
        }   
    }
}

这仅在我具有“编辑”功能登录时才起作用,而在仅查看时不起作用

正如您可以验证查阅文档的“ 限制”部分一样,不幸的是,如果以只读(查看或评论)模式打开文件 ,则简单触发器和可安装触发器都不会运行。

我还希望它更新onOpen或onChange并“取消隐藏”以前具有值的空行。

不幸的是,无法以编程方式(通过查询)对工作表进行更改: 脚本执行和API请求不会导致触发器运行。

但是,您仍然可以先取消隐藏onOpen()所有行,然后隐藏空行。 为此,您只需要将函数showAllRows()hideEmptyRows()嵌入到onOpen()

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn());
var values = range.getValues();
function onOpen() {
  showAllRows();
  hideEmptyRows();
  var menuEntries = [];
  menuEntries.push({name: "Show All Rows", functionName: "showAllRows"});
  menuEntries.push(null);
  menuEntries.push({name: "Hide Empty Rows", functionName: "hideEmptyRows"});
  ss.addMenu("Row Visibility", menuEntries);
}

另外:

如果您要定期更新行,即使尚未关闭并重新打开工作表,则可以安装一个时间驱动的触发器 ,该触发器将定期更新隐藏的行。 为此,您需要将其绑定到已经存在的onOpen函数,并选择一个时间间隔:

在此处输入图片说明

纯粹是为了提供替代方法(并证明在阳光下没有新事物)。 这是2014年@Mogsdad的拍摄。


/**
 * Mogsdad's "whole row" checker.
 //https://stackoverflow.com/a/27179633/1330560
 */
function getFirstEmptyRowWholeRow() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getDataRange();
  var values = range.getValues();
  var row = 0;
  for (var row=0; row<values.length; row++) {
    if (!values[row].join("")) break;
  }
  // return (row+1);
  Logger.log("the row to hide is = "+(row+1));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM