こんにちは! 健史です。
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日)、手動で折りたたみ、「グループ化」を押すと正常に処理されません。
グループ化の初期処理でグループ化を解除する際に、展開する処理を追加してみたのですが、グループ化がない状態ではラーメッセージが表示されます。
グループ化していない状態でグループ化を削除することはエラーにならないのですが。
おかしくなったら、手動でグループの削除と展開します。
解消方法が判明しましたら更新します。
コメント