隐藏列脚本返回“那些列超出范围。”

时间:2013-10-04 16:01:34

标签: google-apps-script google-sheets

我正在创建一个脚本来隐藏工作表中的空列。每个包含数据的列在标题上都有某种值。所以我正在创建一个数组,它封装所有标题并减去所有空单元格。然后我使用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());
}

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

1 个答案:

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