Google脚本可以自动隐藏空白单元格,是否应该刷新?

时间:2019-08-23 20:24:45

标签: google-apps-script google-sheets

因此,我希望自动隐藏完全空的行。有了代码,当我仍然希望显示带有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);
        }
    }
}

2 个答案:

答案 0 :(得分: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);   
        }   
    }
}

  

这似乎仅在我具有“编辑”功能的登录名时有效   当仅查看时不显示

正如您可以查阅documentation限制部分所述,很遗憾,如果以只读(查看或评论)模式打开文件,则简单触发器和可安装触发器都不会运行。

  

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

不幸的是,不会以编程方式(通过查询)对工作表进行更改:Script executions and API requests do not cause triggers to run.

但是,您仍然可以先取消隐藏所有行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);
}

此外:

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

enter image description here

答案 1 :(得分:0)

纯粹是为了提供替代方法(并证明在阳光下没有新事物)。这是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));
}