回答編集履歴

3

幅も取得

2022/11/02 07:29

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -6,36 +6,48 @@
6
6
  ↓例えばこういう表があり、行ごとに結合した範囲を順番通り配列に格納したい場合、
7
7
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-11-02/eea32711-d9f9-4ee9-b85a-b8e4b7e1e003.png)
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 result = []; // 結果格納用
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()).map(cell => cell.getA1Notation());
23
+ const mr = row.getMergedRanges().sort((a, b) => a.getColumn() - b.getColumn());
27
24
 
28
25
  // 並べ替えた結合セル範囲の配列を、結果格納用配列の末尾に追加
29
- result.push(mr);
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(result);
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に対応

2022/11/02 04:40

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -4,9 +4,9 @@
4
4
  非常に単純で、範囲名の英数字によって昇順で並べ替えるだけです。
5
5
 
6
6
  ↓例えばこういう表があり、行ごとに結合した範囲を順番通り配列に格納したい場合、
7
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-11-02/626b33d8-993f-4370-883b-b57cc8516f59.png)
7
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-11-02/eea32711-d9f9-4ee9-b85a-b8e4b7e1e003.png)
8
8
 
9
- `.getA1Notation()`で取得した結合セル範囲は英数字なで、アルファベット&数字の昇順並べ替える。
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
- // Colloatorcompare文字列(結合セル範囲名)を比較して昇順並べ替え
25
+ // 列番号昇順並び替えたあと、セル範囲名に変換する
26
- const mr = row.getMergedRanges().map(rng => rng.getA1Notation()).sort(collator.compare);
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:Z1' ],
37
+ [ [ 'A1:C1', 'F1:I1', 'K1:M1', 'P1:S1', 'Y1:AA1' ],
38
- [ 'C2:D2', 'H2:M2', 'R2:V2', 'Y2:Z2' ],
38
+ [ 'C2:D2', 'H2:M2', 'R2:V2', 'Y2:AA2' ],
39
- [ 'B3:E3', 'L3:R3' ],
40
- [ 'E4:G4', 'P4:Q4', 'U4:W4' ] ]
39
+ [ 'B3:E3', 'L3:R3', 'AA3:AD3' ],
40
+ [ 'E4:G4', 'P4:Q4', 'U4:W4', 'AC4:AD4' ] ]
41
41
  ```

1

原因は不明、代替案

2022/11/02 03:22

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -1,22 +1,41 @@
1
- ### 原因
2
- セル複数行にまたがっ結合おり、対象行ではなく上の行所在してる扱いからです。
1
+ 検証すればするほど、`.getMergedRanges()`で取得する順番法則性分からなくなってしいましので、原因の言及についは一旦げさせていきま申し訳ございません
3
- (結合したセル達の中で一番左上が所属セル)
4
2
 
5
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-11-02/f84b59a8-5ecd-44e8-80cb-8417401d1704.png)
3
+ ということで、結合範囲を順番通り取得する代替案をご紹介いたします。
4
+ 非常に単純で、範囲名の英数字によって昇順で並べ替えるだけです。
6
5
 
7
- 値`D-E-F D-E-F`は左上のセル`D1`所属ます。
6
+ ↓例えばこういう表があり行ごとに結合した範囲を順通り配列格納場合、
7
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-11-02/626b33d8-993f-4370-883b-b57cc8516f59.png)
8
8
 
9
+ ↓`.getA1Notation()`で取得した結合セル範囲は英数字なので、アルファベット&数字の昇順に並べ替える。
10
+ ```javascript
9
- - 2行目を`.getMargedRange()`すると、
11
+ function getMergedRangesInAscendingOrder() {
12
+ const sheet = SpreadsheetApp.getActiveSheet();
10
- - セル`D1`を飛ばして結合されたセル達を先に全部取得し、
13
+ const lastRow = sheet.getLastRow();
11
- - 最後に、2行目に一応あるしついでに情報取得してやるか、と言わんばかりに、おまけでセル`D2`の情報も取得してくれます。
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
- Nov 2, 2022, 8:38:35 AM Info A2:B2
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
+ ```