简体   繁体   English

如何在 Google 表格脚本中隐藏少于一个输入的列?

[英]How to hide columns with less than one input in Google sheets script?

I have a very large data set with clients and prices but not all clients get charged every price.我有一个包含客户和价格的非常大的数据集,但并非所有客户都会按每个价格收费。 When I filter out a client, I need to be able to run a macro to hide all of the columns that do not have a price associated with the header.当我过滤掉一个客户时,我需要能够运行一个宏来隐藏所有没有与标题相关联的价格的列。 I had the macro in Excel working fine but cannot transfer it into google sheets.我在 Excel 中的宏工作正常,但无法将其传输到 Google 表格中。

Excel VBA that worked perfectly:完美运行的 Excel VBA:

Sub KolumnHider()
    Dim wf As WorksheetFunction
    Dim i As Long, r As Range

    Set wf = Application.WorksheetFunction
    For i = 1 To 1000
        Set r = Cells(1, i).EntireColumn
        If wf.Subtotal(3, r) < 2 Then r.Hidden = True
    Next i
End Sub

This formula below is almost what I need.下面的这个公式几乎是我需要的。 My issue is that I need it to hide the columns based on what is showing.我的问题是我需要它根据显示的内容隐藏列。 When I filter out the data, I then want to run the macro and hide the columns with empty cells.当我过滤掉数据时,我想运行宏并隐藏带有空单元格的列。 It works when I filter to the certain row that 'ss.GetRange(3,1,1)' implies.当我过滤到 'ss.GetRange(3,1,1)' 暗示的特定行时,它起作用。 For this example, If I filter to row 3 it works, but I have to change the code to say 6,1,1 for it to hide the correct info on row 6. I need it to hide only the row showing.对于这个例子,如果我过滤到第 3 行,它可以工作,但我必须将代码更改为 6,1,1 以隐藏第 6 行的正确信息。我需要它只隐藏显示的行。 Please help!请帮忙!

  function hideEmptyHeaders() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var headers = ss.getRange(3, 1, 1, ss.getMaxColumns()).getValues()[0];
var columnIndex = 0, numColumns = 0;
headers.forEach(function(header, index) {
  if (!header) {
    if (!columnIndex)
      columnIndex = index + 1;
    numColumns++;
  } else if (columnIndex > 0) {
    ss.hideColumns(columnIndex, numColumns);
    columnIndex = numColumns = 0;
  }
});
if (columnIndex > 0) ss.hideColumns(columnIndex, numColumns);

} }

Try this:尝试这个:

function hideBlankColumns() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var width=rg.getWidth();//could also be sh.getMaxColumns()
  for(var c=1;c<=width;c++) {
    if(getColHeight(c,sh,ss)==0) {
      sh.hideColumns(c);
    }
  }
}

function getColHeight(col,sh,ss){
  var ss=ss || SpreadsheetApp.getActive();
  var sh=sh || ss.getActiveSheet();
  var col=col || sh.getActiveCell().getColumn();
  var rg=sh.getRange(1,col,sh.getLastRow(),1);
  var vA=rg.getValues();
  if(vA) {
    while(vA.length && vA[vA.length-1][0].length==0){
      vA.splice(vA.length-1,1);
    }
    return vA.length;
  }
  return 0;
}

Try this,尝试这个,

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  var i;
  var j;
  for(i=1;i<=1000;i++)
  {
    var count = 0;
    var r = sheet.getLastRow();
    for(j=1;j<r;j++)
    {
      if(!sheet.getRange(j,i).isBlank())
      {
        count++;
      }
    }
    if(count < 2)
    {
      sheet.hideColumns(i);
    }    
  }  
}

Problem问题

  • You have rows hidden by a filter您有被过滤器隐藏的行
  • You want to hide all columns, which do not have contents in the non-hidden cells您想隐藏所有列,这些列在非隐藏单元格中没有内容

Solution解决方案

  • You need a function that returns you the hidden rows您需要一个返回隐藏行的函数
  • You loop through all columns您遍历所有列
  • For each column you loop through all rows and check if the row is not hidden对于每一列,您遍历所有行并检查该行是否未隐藏
  • For all non-hidden rows, you check if the cell in given column has contents对于所有非隐藏行,您检查给定列中的单元格是否有内容
  • If non of the non-hidden cells in a column has contents, you hide this column如果列中没有非隐藏单元格有内容,则隐藏此列

If I understood right that this is what you want to do - here is a script that allows you to do so.如果我理解正确,这就是您想要做的 - 这是一个允许您这样做的脚本。

function getIndexesOfFilteredRows(ssId, sheetId) {
  var hiddenRows = [];  
  // get row metadata to find the hidden rows
  var fields = "sheets(data(rowMetadata(hiddenByFilter)),properties/sheetId)";
  var sheets = Sheets.Spreadsheets.get(ssId, {fields: fields}).sheets;  
  //Find the right sheet
  for (var i = 0; i < sheets.length; i++) {
    if (sheets[i].properties.sheetId == sheetId) {
      var data = sheets[i].data;
      var rows = data[0].rowMetadata;
      for (var j = 0; j < rows.length; j++) {
        //push the indexes of all hodden rows into an array
        if (rows[j].hiddenByFilter) hiddenRows.push(j);
      }
    }
  }
  //return indexes of hidden rows
  return hiddenRows;
} 

function hideEmptyHeaders() {
  var ssId='XXXXX';
  var sheetId=0;// adjust if necessary
  //get the rows that are hidden by a filter
  var hidden=getIndexesOfFilteredRows(ssId, sheetId);
  var sheet=SpreadsheetApp.openById(ssId).getSheets()[sheetId];
  //get all sheet contents
  var rangeValues=sheet.getDataRange().getValues();
  //check for every column either the not hidden part of the column is empty
   for(var j=0;j<rangeValues[0].length;j++)  {
  // loop through all data rows  
    for(var i=0;i<rangeValues.length;i++)    {
    //check if the row is not hidden
     if((hidden.indexOf(i)+1)==false)       {
     // if the row is not hidden, check if the cell in column j has content
        if(rangeValues[i][j]!=""||rangeValues[i][j]!="")        {
        //if the cell has content, jump to the next column, otherwise check first all the other rows
          break;
        }
      }
      // if no content has been found in column j after ite5rating through all non-hidden rows, hide column j
      if(i==(rangeValues.length-1))      {
        sheet.hideColumns(j+1)
      }
    }
 }
}

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

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