検証すればするほど、.getMergedRanges()
で取得する順番の法則性が分からなくなってしまいましたので、原因の言及については一旦さげさせていただきます申し訳ございません。
ということで、結合範囲を順番通り取得する代替案をご紹介いたします。
非常に単純で、範囲名の英数字によって昇順で並べ替えるだけです。
↓例えばこういう表があり、行ごとに結合した範囲を順番通り配列に格納したい場合、

↓1行ごとに結合セルを取得し → その列番号昇順で並べ替えてから → 「セル範囲名」または「幅」に変換
javascript
1function getMergedRangesInAscendingOrder() {
2 const sheet = SpreadsheetApp.getActiveSheet();
3 const lastRow = sheet.getLastRow();
4 const lastCol = sheet.getLastColumn();
5
6 const mergedRanges = []; // 結果格納用
7
8 for (let i = 1; i <= lastRow; i++) {
9 // 1行ごとに
10 const row = sheet.getRange(i, 1, 1, lastCol);
11
12 // 列番号の昇順で並び替える
13 const mr = row.getMergedRanges().sort((a, b) => a.getColumn() - b.getColumn());
14
15 // 並べ替えた結合セル範囲の配列を、結果格納用配列の末尾に追加
16 mergedRanges.push(mr);
17 }
18
19 // セルの範囲名(例 'A1:C1')の2次元配列を生成
20 const a1Notations = mergedRanges.map(row => row.map(cell => cell.getA1Notation()));
21 console.log('--- a1Notations ---');
22 console.log(a1Notations);
23
24 // セルの幅(例 3)の2次元配列を生成
25 const widths = mergedRanges.map(row => row.map(cell => cell.getWidth()));
26 console.log('--- widths ---');
27 console.log(widths);
28}
出力結果
// .getA1Notation()
[ [ 'A1:C1', 'F1:I1', 'K1:M1', 'P1:S1', 'Y1:AA1' ],
[ 'C2:D2', 'H2:M2', 'R2:V2', 'Y2:AA2' ],
[ 'B3:E3', 'L3:R3', 'AA3:AD3' ],
[ 'E4:G4', 'P4:Q4', 'U4:W4', 'AC4:AD4' ] ]
// .getWidth()
[ [ 3, 4, 3, 4, 3 ],
[ 2, 6, 5, 3 ],
[ 4, 7, 4 ],
[ 3, 2, 3, 2 ] ]