GAS

GAS グループ化,折りたたみ,グループ化削除,折りたたみ展開

GAS

こんにちは! 健史です。

Googleスプレッドシートでスクリプトを作成しました。

1つ目は、
・グループ化する
・グループ化した行を折りたたむ

2つ目は、
・折りたたみを展開する
・グループ化を削除する

です。

スポンサーリンク

処理概要

1つ目の「グループ化 & 折りたたみ」です。

キー列に値が設定されている行を残してグループ化し、折りたたみます。


2つ目の「折りたたみを展開 & グループ化を削除」で、上記1つ目の実行前の状態に戻します。

プログラム

コメントありです。

「定数を定義」で、[KEY_X]、[KEY_Y]の設定値を処理対象シートに合わせて修正します。

//---------------------------------------
// 定数を定義
//---------------------------------------
  const KEY_X = 2         //キーの開始行
  const KEY_Y = 2         //キーの列 1:A列、2:B列、3:C列・・・

//---------------------------------------
// グループ化 & 折りたたみ
//---------------------------------------
function myfunction1() {
// 変数定義
  var ix1,ix1_max,ix1_from,ix1_to,ix1_temp 
  
// 処理対象シートを取得する処理が必要で、お決まりの記述の1つ
  var sheet = SpreadsheetApp.getActiveSheet()

// 最初にグループ化している行があれば削除する。ただし想定しているグループ化のレベルは1のみ
// 1.範囲を取得する。[A1]から、データ全体の最大行を取得する
  var range = sheet.getRange(1,1,sheet.getLastRow(),1)
// 2.グループ化している深さ1レベルの行を取得する
  var groupDepth = sheet.getRowGroupDepth(1)
// 3.上記2で取得した深さ1レベルを「-1」する。結果は、1-1=0になりグループ化が無くなる
  range.shiftRowGroupDepth(-1)

// キーの開始位置が空白の場合は、メッセージを表示する
  if (sheet.getRange(KEY_X,KEY_Y).getValue() == '') {
    Browser.msgBox("キーの開始位置が空白です。\\n値があるものとして処理します!"
    , Browser.Buttons.OK)
  } 

// シートの最大行を取得する。[sheet.getLastRow()]のまま使っている処理もあるけど・・・
  ix1_max = sheet.getLastRow()

 // 2行目から最終行まで処理を繰り返す
  ix1 = KEY_X;
  while (ix1 <= ix1_max) {
//  グループ化の開始行を求めておく  
    ix1_from = ix1 + 1
//  最終行になるかか、2列目の値が入っているところまで添字ix1をカウントアップする
    do {
      ix1 = ix1 + 1
    } while (ix1 <= ix1_max && sheet.getRange(ix1,KEY_Y).getValue() == '')  
//  グループ化の最終行を求める
    ix1_to = ix1 - 1 
//  キー行のみの場合はグループ化しないための判断、Eの場合は[iix1_to:14]、[x1_from:15]になる
    if(ix1_to >= ix1_from) {
//    グループ化する行数を求める。
      ix1_temp = ix1_to - ix1_from + 1
//    グループ化する行を取得する
      range = sheet.getRange(ix1_from,1,ix1_temp ,1)
//    深さ1レベルでグループ化する
      range.shiftRowGroupDepth(1)
//    折りたたむ
      range.collapseGroups()
    }
  }
}

//---------------------------------------
// 折りたたみを展開 & グループ化を削除
//---------------------------------------
function myfunction2() {
// 処理対象シートを取得する処理が必要で、お決まりの記述の1つ
   var sheet = SpreadsheetApp.getActiveSheet()
// 範囲を取得する。[A1]から、データ全体の最大行を取得する
   var range = sheet.getRange(1,1,sheet.getLastRow(),1)
// 折りたたみを展開する
   sheet.expandAllRowGroups()
// 深さ1レベルを「-1」する。結果は、1-1=0になりグループ化が無くなる
   range.shiftRowGroupDepth(-1)
}

コメントなしです。

//---------------------------------------
// 定数を定義
//---------------------------------------
  const KEY_X = 2         //キーの開始行
  const KEY_Y = 2         //キーの列 1:A列、2:B列、3:C列・・・

//---------------------------------------
// グループ化 & 折りたたみ
//---------------------------------------
function myfunction1() {
  var ix1,ix1_max,ix1_from,ix1_to,ix1_temp 
  
  var sheet = SpreadsheetApp.getActiveSheet()

  var range = sheet.getRange(1,1,sheet.getLastRow(),1)
  var groupDepth = sheet.getRowGroupDepth(1)
  range.shiftRowGroupDepth(-1)

  if (sheet.getRange(KEY_X,KEY_Y).getValue() == '') {
    Browser.msgBox("キーの開始位置が空白です。\\n値があるものとして処理します!"
    , Browser.Buttons.OK)
  } 

  ix1_max = sheet.getLastRow()

  ix1 = KEY_X;
  while (ix1 <= ix1_max) {
    ix1_from = ix1 + 1
    do {
      ix1 = ix1 + 1
    } while (ix1 <= ix1_max && sheet.getRange(ix1,KEY_Y).getValue() == '')  
    ix1_to = ix1 - 1 
    if(ix1_to >= ix1_from) {
      ix1_temp = ix1_to - ix1_from + 1
      range = sheet.getRange(ix1_from,1,ix1_temp ,1)
      range.shiftRowGroupDepth(1)
      range.collapseGroups()
    }
  }
}

//---------------------------------------
// 折りたたみを展開 & グループ化を削除
//---------------------------------------
function myfunction2() {
   var sheet = SpreadsheetApp.getActiveSheet()
   var range = sheet.getRange(1,1,sheet.getLastRow(),1)
   sheet.expandAllRowGroups()
   range.shiftRowGroupDepth(-1)
}

補足

解除している状態で「解除」を押すとエラーになる

以下のメッセージが表示されます。

”Exception: 指定したグループは無効なため見つかりません。詳細 表示しない”

「表示しない」をクリックすることで戻ります。

「グループ化」を押すと、リセットしてからグループ化する
手動でグループ化したり折りたたんでも、「グループ化」を押すと手動で設定した内容がリセットされてからグループ化します。

手動で折りたたみ「グループ化」を押すと、正常に処理されない
今のところ(2022年10月16日)、手動で折りたたみ、「グループ化」を押すと正常に処理されません。

グループ化の初期処理でグループ化を解除する際に、展開する処理を追加してみたのですが、グループ化がない状態ではラーメッセージが表示されます。

グループ化していない状態でグループ化を削除することはエラーにならないのですが。


おかしくなったら、手動でグループの削除と展開します。

解消方法が判明しましたら更新します。

GAS
スポンサーリンク
- 面白かったらシェアお願いします! -
健史をフォローする
自分で改善

コメント