回答編集履歴
3
幅も取得
test
CHANGED
@@ -6,36 +6,48 @@
|
|
6
6
|
↓例えばこういう表があり、行ごとに結合した範囲を順番通り配列に格納したい場合、
|
7
7
|

|
8
8
|
|
9
|
-
↓1行ごとに結合セルを取得し → その列番号昇順で並べ替えてから → セル範囲名に変換
|
9
|
+
↓1行ごとに結合セルを取得し → その列番号昇順で並べ替えてから → 「セル範囲名」または「幅」に変換
|
10
10
|
```javascript
|
11
11
|
function getMergedRangesInAscendingOrder() {
|
12
12
|
const sheet = SpreadsheetApp.getActiveSheet();
|
13
13
|
const lastRow = sheet.getLastRow();
|
14
14
|
const lastCol = sheet.getLastColumn();
|
15
15
|
|
16
|
-
const res
|
16
|
+
const mergedRanges = []; // 結果格納用
|
17
|
-
|
18
|
-
// 英語を基準とした文字列比較のCollator
|
19
|
-
const collator = new Intl.Collator('en');
|
20
17
|
|
21
18
|
for (let i = 1; i <= lastRow; i++) {
|
22
19
|
// 1行ごとに
|
23
20
|
const row = sheet.getRange(i, 1, 1, lastCol);
|
24
21
|
|
25
|
-
// 列番号の昇順で並び替え
|
22
|
+
// 列番号の昇順で並び替える
|
26
|
-
const mr = row.getMergedRanges().sort((a, b) => a.getColumn() - b.getColumn())
|
23
|
+
const mr = row.getMergedRanges().sort((a, b) => a.getColumn() - b.getColumn());
|
27
24
|
|
28
25
|
// 並べ替えた結合セル範囲の配列を、結果格納用配列の末尾に追加
|
29
|
-
res
|
26
|
+
mergedRanges.push(mr);
|
30
27
|
}
|
31
28
|
|
29
|
+
// セルの範囲名(例 'A1:C1')の2次元配列を生成
|
30
|
+
const a1Notations = mergedRanges.map(row => row.map(cell => cell.getA1Notation()));
|
31
|
+
console.log('--- a1Notations ---');
|
32
|
+
console.log(a1Notations);
|
33
|
+
|
34
|
+
// セルの幅(例 3)の2次元配列を生成
|
35
|
+
const widths = mergedRanges.map(row => row.map(cell => cell.getWidth()));
|
36
|
+
console.log('--- widths ---');
|
32
|
-
console.log(
|
37
|
+
console.log(widths);
|
33
38
|
}
|
34
39
|
```
|
35
40
|
出力結果
|
36
41
|
```
|
42
|
+
// .getA1Notation()
|
37
43
|
[ [ 'A1:C1', 'F1:I1', 'K1:M1', 'P1:S1', 'Y1:AA1' ],
|
38
44
|
[ 'C2:D2', 'H2:M2', 'R2:V2', 'Y2:AA2' ],
|
39
45
|
[ 'B3:E3', 'L3:R3', 'AA3:AD3' ],
|
40
46
|
[ 'E4:G4', 'P4:Q4', 'U4:W4', 'AC4:AD4' ] ]
|
47
|
+
|
48
|
+
// .getWidth()
|
49
|
+
[ [ 3, 4, 3, 4, 3 ],
|
50
|
+
[ 2, 6, 5, 3 ],
|
51
|
+
[ 4, 7, 4 ],
|
52
|
+
[ 3, 2, 3, 2 ] ]
|
41
53
|
```
|
2
AAに対応
test
CHANGED
@@ -4,9 +4,9 @@
|
|
4
4
|
非常に単純で、範囲名の英数字によって昇順で並べ替えるだけです。
|
5
5
|
|
6
6
|
↓例えばこういう表があり、行ごとに結合した範囲を順番通り配列に格納したい場合、
|
7
|
-

|
8
8
|
|
9
|
-
↓
|
9
|
+
↓1行ごとに結合セルを取得し → その列番号昇順で並べ替えてから → セル範囲名に変換
|
10
10
|
```javascript
|
11
11
|
function getMergedRangesInAscendingOrder() {
|
12
12
|
const sheet = SpreadsheetApp.getActiveSheet();
|
@@ -18,12 +18,12 @@
|
|
18
18
|
// 英語を基準とした文字列比較のCollator
|
19
19
|
const collator = new Intl.Collator('en');
|
20
20
|
|
21
|
-
for (let i=1; i<=lastRow; i++) {
|
21
|
+
for (let i = 1; i <= lastRow; i++) {
|
22
22
|
// 1行ごとに
|
23
23
|
const row = sheet.getRange(i, 1, 1, lastCol);
|
24
24
|
|
25
|
-
//
|
25
|
+
// 列番号の昇順で並び替えたあと、セル範囲名に変換する
|
26
|
-
const mr = row.getMergedRanges().map(
|
26
|
+
const mr = row.getMergedRanges().sort((a, b) => a.getColumn() - b.getColumn()).map(cell => cell.getA1Notation());
|
27
27
|
|
28
28
|
// 並べ替えた結合セル範囲の配列を、結果格納用配列の末尾に追加
|
29
29
|
result.push(mr);
|
@@ -34,8 +34,8 @@
|
|
34
34
|
```
|
35
35
|
出力結果
|
36
36
|
```
|
37
|
-
[ [ 'A1:C1', 'F1:I1', 'K1:M1', 'P1:S1', 'Y1:
|
37
|
+
[ [ 'A1:C1', 'F1:I1', 'K1:M1', 'P1:S1', 'Y1:AA1' ],
|
38
|
-
[ 'C2:D2', 'H2:M2', 'R2:V2', 'Y2:
|
38
|
+
[ 'C2:D2', 'H2:M2', 'R2:V2', 'Y2:AA2' ],
|
39
|
-
[ 'B3:E3', 'L3:R3' ],
|
40
|
-
[ 'E
|
39
|
+
[ 'B3:E3', 'L3:R3', 'AA3:AD3' ],
|
40
|
+
[ 'E4:G4', 'P4:Q4', 'U4:W4', 'AC4:AD4' ] ]
|
41
41
|
```
|
1
原因は不明、代替案
test
CHANGED
@@ -1,22 +1,41 @@
|
|
1
|
-
### 原因
|
2
|
-
|
1
|
+
検証すればするほど、`.getMergedRanges()`で取得する順番の法則性が分からなくなってしまいましたので、原因の言及については一旦さげさせていただきます申し訳ございません。
|
3
|
-
(結合したセル達の中で一番左上が所属セル)
|
4
2
|
|
5
|
-
|
3
|
+
ということで、結合範囲を順番通り取得する代替案をご紹介いたします。
|
4
|
+
非常に単純で、範囲名の英数字によって昇順で並べ替えるだけです。
|
6
5
|
|
7
|
-
|
6
|
+
↓例えばこういう表があり、行ごとに結合した範囲を順番通り配列に格納したい場合、
|
7
|
+

|
8
8
|
|
9
|
+
↓`.getA1Notation()`で取得した結合セル範囲は英数字なので、アルファベット&数字の昇順に並べ替える。
|
10
|
+
```javascript
|
9
|
-
|
11
|
+
function getMergedRangesInAscendingOrder() {
|
12
|
+
const sheet = SpreadsheetApp.getActiveSheet();
|
10
|
-
|
13
|
+
const lastRow = sheet.getLastRow();
|
11
|
-
|
14
|
+
const lastCol = sheet.getLastColumn();
|
12
15
|
|
13
|
-
|
16
|
+
const result = []; // 結果格納用
|
14
17
|
|
18
|
+
// 英語を基準とした文字列比較のCollator
|
19
|
+
const collator = new Intl.Collator('en');
|
20
|
+
|
21
|
+
for (let i=1; i<=lastRow; i++) {
|
22
|
+
// 1行ごとに
|
23
|
+
const row = sheet.getRange(i, 1, 1, lastCol);
|
24
|
+
|
25
|
+
// Colloatorのcompareで文字列(結合セル範囲名)を比較して昇順に並べ替え
|
26
|
+
const mr = row.getMergedRanges().map(rng => rng.getA1Notation()).sort(collator.compare);
|
27
|
+
|
28
|
+
// 並べ替えた結合セル範囲の配列を、結果格納用配列の末尾に追加
|
29
|
+
result.push(mr);
|
15
|
-
|
30
|
+
}
|
31
|
+
|
32
|
+
console.log(result);
|
33
|
+
}
|
16
34
|
```
|
17
|
-
|
35
|
+
出力結果
|
18
|
-
Nov 2, 2022, 8:38:35 AM Info H2:L2
|
19
|
-
Nov 2, 2022, 8:38:35 AM Info N2:X2
|
20
|
-
Nov 2, 2022, 8:38:35 AM Info Y2:Z2
|
21
|
-
Nov 2, 2022, 8:38:35 AM Info D1:F2
|
22
36
|
```
|
37
|
+
[ [ 'A1:C1', 'F1:I1', 'K1:M1', 'P1:S1', 'Y1:Z1' ],
|
38
|
+
[ 'C2:D2', 'H2:M2', 'R2:V2', 'Y2:Z2' ],
|
39
|
+
[ 'B3:E3', 'L3:R3' ],
|
40
|
+
[ 'E4:G4', 'P4:Q4', 'U4:W4' ] ]
|
41
|
+
```
|