7

グループの最初と最後の列を見つける Google スプレッドシートの関数を作成しようとしています。次に、グループを非表示にするか、既に非表示になっている場合は表示します。

ただし、列が非表示かどうかを判断する方法を見つけることができませんでした。Google の Class Sheet ページhttps://developers.google.com/apps-script/reference/spreadsheet/sheetで何も見つけることができず、Excel の .hidden に相当するものが見つかりませんでした

getColumnWidth(column) は、非表示の場合でも非表示の列幅を返します。

これが私のコードです:

function hideShowColumns(startCol, endCol) { 
  //endCol is one column past the last data set that should be hidden
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Transposed Data");
  //import the data from the Column Headers
  var colHeaderData = sheet.getRange(1, 1, 2, sheet.getMaxColumns()).getValues(); 
  var startColNum = 0;
  var endColNum = 0;

  // This section searches for the column names in the header rows and returns their column number
  for (var i =0; i < 2; ++i) {
    for (var j = 0; j < colHeaderData[0].length; ++j) {
      if (colHeaderData[i][j] == startCol) 
        startColNum = j;
      if (colHeaderData[i][j] == endCol) 
        endColNum = j;
    }
  }

  //This is the wrong command getColumnWidth doesn't change if column is hidden
  if (sheet.getColumnWidth(startColNum + 1) != 0) {
    sheet.hideColumns(startColNum + 2, endColNum - startColNum - 1);
    Logger.log(sheet.getColumnWidth(startColNum + 2));
    return;
  }

  //This is the wrong command getColumnWidth doesn't change if column is hidden
  if (sheet.getColumnWidth(startColNum + 1) == 0) { 
    for (var j = startColNum + 1; j < endColNum - 1; ++j) {
      sheet.unhideColumn(j);
      Logger.log(sheet.getColumnWidth(startColNum + 2));     
    }
    return;
  }
}

助けてくれてありがとう!

4

5 に答える 5

3

回避策。2 行を作成します。1 つ目は常に値を持つ必要があり、2 つ目は一連の数式を持ちます。これらの 2 行は次のようになります。

  |           A             |           B             |            C            |
---------------------------------------------------------------------------------
1 |                       1 |                       1 |                       1 |
2 | =NOT(SUBTOTAL(103, A1)) | =NOT(SUBTOTAL(103, B1)) | =NOT(SUBTOTAL(103, C1)) |

SUBTOTAL指定された集計関数を使用して小計を返します。最初の引数 103 は、集計に使用される関数のタイプを定義します。2 番目の引数は、関数を適用する範囲です。

  • 3 はCOUNTA、範囲内の値の数を意味し、カウントします
  • +100 は、範囲内の非表示のセルを無視することを意味します。

セル範囲が 1 の場合の結果はSUBTOTAL、セルが非表示の場合は 0 になり、セルが表示されている場合は 1 になります。NOTそれを反転します。

これで、スクリプトで 2 行目を読み取って、列が非表示になっているかどうかを確認できます。

転置された質問と回答は次のとおりです。https://stackoverflow.com/a/27846202/1385429

于 2015-01-08T17:35:53.733 に答える
2

申し訳ありませんが、私も方法を見つけることができず、このスタック オーバーフローに遭遇しました。しかし、このスクリプトをどこかで共有することもできます。

-- または || のプレースホルダーとして最初の列を使用します。非表示か表示かを示す値。(最高ではありませんが、私が見つけたように見えるのはそれだけです)

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name: "Toggle Rows",
    functionName: "toggleRows"
  },{
    name: "Hide Rows",
    functionName: "hideRows"
  },{
    name: "Show Rows",
    functionName: "showRows"
  }];
  sheet.addMenu("Script", entries);
};

function toggleRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var maxRows = sheet.getMaxRows();

  var r = sheet.getRange(1, 1, maxRows+1);
  var values = r.getValues();
  var hideRanges = [];
  var showRanges = [];

  var toggleValue = null;
  var startRow = null;

  var tmp;
  var len = values.length;
  var i;
  for (i = 0; i < len; i++) {
    tmp = values[i][0];
    if (startRow === null && (tmp === '--' || tmp === '||')) {
      startRow = i + 1;
      toggleValue = tmp;
    } else if (startRow !== null && tmp !== toggleValue) {
      if (toggleValue === '--') {
        hideRanges.push([startRow, (i + 1) - startRow]);
      } else {
        showRanges.push([startRow, (i + 1) - startRow])
      }

      if (tmp === '--' || tmp === '||') {
        startRow = i + 1;
        toggleValue = tmp;
      } else {
        startRow = null;
      }
    }
  }

  var customRange = null;
  var range = null;

  i = hideRanges.length;
  while (i--) {
    customRange = hideRanges[i];
    range = sheet.getRange(customRange[0], 1, customRange[1]);
    range.setValue('||');
    sheet.hideRows(customRange[0], customRange[1]);
  }

  i = showRanges.length;
  while (i--) {
    customRange = showRanges[i];
    range = sheet.getRange(customRange[0], 1, customRange[1]);
    range.setValue('--');
    sheet.showRows(customRange[0], customRange[1]);
  }

};

function hideRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var maxRows = sheet.getMaxRows();

  var r = sheet.getRange(1, 1, maxRows+1);
  var values = r.getValues();
  var startRow = null;

  var tmp;
  var len = values.length;
  var i;
  for (i = 0; i < len; i++) {
    tmp = values[i][0];
    if (startRow === null && (tmp === '--' || tmp === '||')) {
      startRow = i + 1;
    } else if (startRow !== null && (tmp !== '--' && tmp !== '||')) {
      var numRows = (i + 1) - startRow;
      sheet.getRange(startRow, 1, numRows).setValue('||');
      sheet.hideRows(startRow, numRows);
      startRow = null;
    }
  }

};

function showRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var maxRows = sheet.getMaxRows();

  var r = sheet.getRange(1, 1, maxRows+1);
  var values = r.getValues();
  var startRow = null;

  var tmp;
  var len = values.length;
  var i;
  for (i = 0; i < len; i++) {
    tmp = values[i][0];
    if (startRow === null && (tmp === '--' || tmp === '||')) {
      startRow = i + 1;
    } else if (startRow !== null && (tmp !== '--' && tmp !== '||')) {
      var numRows = (i + 1) - startRow;
      sheet.getRange(startRow, 1, numRows).setValue('--');
      sheet.showRows(startRow, numRows);
      startRow = null;
    }
  }

};

更新については、こちらをご覧ください: https://gist.github.com/LiamKarlMitchell/81cef19a530261c4af93

于 2015-08-22T23:30:18.073 に答える