0

我正在创建一个脚本来隐藏工作表中的空列。每个包含数据的列在标题上都有某种值。所以我正在创建一个包含所有标题并减去所有空单元格的数组。然后我使用 hideColumns 隐藏最后一个标题旁边的所有列,并带有一个值。

这是脚本:

function hiding() {
  var hoja = SpreadsheetApp.getActiveSheet();
  var header = hoja.getRange(1, hoja.getMaxColumns()).getValues();

  for (i in header) {
    if (header[i].length == 0) {
      header.splice(i, 1);
      }
    }

  var k = header.length + 1;
    hoja.hideColumns(k, hoja.getMaxColumns());
}

我不断收到错误消息“那些列超出范围。” 当我调试代码时。

4

1 回答 1

0

原则上getRange(row, column)只返回最后一列(只传递两个参数返回一个带有单个单元格的“范围”),因此数组将有一个单值标题。

getValues()返回值的二维数组​​​,因此要确定值的长度需要类似:

header[0][i].length

根据文档hideColumns(columnIndex, numColumns):隐藏从给定索引开始的一个或多个连续列。

hideColumns(columnIndex, numColumns)方法的第二个参数表示从第一个参数中指定的索引开始隐藏的列数。

在这种情况下,会生成错误,因为它从某个索引开始并尝试隐藏大部分可用列,例如,hoja.getMaxColumns()返回 20 并尝试执行:

hoja.hideColumns(k, hoja.getMaxColumns());

从索引 2(k 的值)开始,隐藏接下来的 20 列,这实际上超出了界限。

也许这样的代码会有所帮助:

/* CODE FOR DEMONSTRATION PURPOSES */
function hideEmptyHeaders() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var headers = ss.getRange(1, 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);
}
于 2013-10-05T07:35:50.877 回答