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)は最後の列のみを返します (引数を 2 つだけ渡すと、1 つのセルを含む「範囲」が返されます)。そのため、配列には単一の値ヘッダーが含まれます。

getValues()は値の 2 次元配列を返すため、値の長さを決定するには次のようなものが必要です。

header[0][i].length

ドキュメントhideColumns(columnIndex, numColumns)によると: 指定されたインデックスから始まる 1 つ以上の連続する列を非表示にします。

メソッドhideColumns(columnIndex, numColumns)の 2 番目のパラメーターは、最初のパラメーターで指定されたインデックスから始まる非表示にする列の数を示します。

この場合、特定のインデックスから開始し、使用可能な列のほとんどを非表示にしようとするため、エラーが生成されます。たとえば、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 に答える