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



コメント