質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1319閲覧

GASによる結合範囲の出力について

yuzumochi

総合スコア3

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2022/11/01 22:14

問題

google apps script(GAS)で結合されている幅を取得させようとしているのですが、
リストに格納される順番が変わってしまっています。
以下ではとりあえず取得されている順番を調べてみました。
何が原因か教えてください。。。

該当のソースコード

function myn() { var ss1 = SpreadsheetApp.openById("1JQ28-281sytemtJAs5q8Blo8-P3UVhiJlW25B62SCSU"); var r_sheet=ss1.getSheetByName('2日目'); var m_cell=r_sheet.getRange(162,1,1,47).getMergedRanges(); for(var i=0;i<m_cell.length;i++){ var m_cell_num=m_cell[i].getA1Notation(); Logger.log(m_cell_num); } }

出力されたもの

7:05:25 情報 V162:Y162 7:05:25 情報 Z162:AA162 7:05:25 情報 AB162:AC162 7:05:25 情報 AD162:AG162 7:05:25 情報 L162:M162 7:05:25 情報 N162:S162 7:05:25 情報 T162:U162

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bebebe_

2022/11/02 00:28

自分の環境で試してみたところ恐らく結合した順に配列になっている感じがします。
yuzumochi

2022/11/02 00:32

なるほど、ありがとうございます!! ちなみにスプレッドシートの順番に結合しているセルの幅を取得する方法はありますか??
YAmaGNZ

2022/11/02 00:55

順番が保証される、されないのどちらの資料も見つけることはできていませんが 順番の保証というものはないのではないでしょうか
sawa

2022/11/02 01:09

知らなかったけど、ためしてみたら マージした(日時)順に取得されましたね。 どこにそんな情報を保持しているのやら。 諦めて取得後に列番号でSORTした方が早そうな気がします。
Cocode

2022/11/02 03:24

sawa様 > マージした(日時)順に取得されましたね。 私もそうだと思ったんです。最初はその通りだったんです。 でもその後に結合セル範囲を追加していくと、順番がばらばらになったのです。 法則性が全く分かりませんでした。。。。
sawa

2022/11/02 04:20

あら、そう簡単にはいかないんですね。失礼しました。 法則性がないのは気持ち悪いですね・・・。
guest

回答1

0

ベストアンサー

検証すればするほど、.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 ] ]

投稿2022/11/01 23:42

編集2022/11/02 07:29
Cocode

総合スコア2314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cocode

2022/11/01 23:56

ありがとうございます!確かに行がまたがっているのはなさそうですね…>< 順番通り値を取得する暫定対策(他の方法)は分かりますが、原因はわからないです…ごめんなさいm(_ _)m
yuzumochi

2022/11/02 00:33

ありがとうございまず! よければですが、 スプレッドシートの順番に結合しているセルの幅を取得する方法は他にありますか??
Cocode

2022/11/02 01:11

あー順番がかわる原因わかりました。それも踏まえて回答更新します。少々お時間ください
yuzumochi

2022/11/02 04:16

ご回答ありがとうございます! A~Zの場合はうまくいくのですが、 AA、ABのような列が存在する場合にリストの前に来てしまいます。。。 もしよろしければ、この問題も解決していただけるとありがたいです。
Cocode

2022/11/02 04:40 編集

失礼しました修正しました! コードの行数が減りました!
yuzumochi

2022/11/02 04:49

ありがとうございます! 度々申し訳ないのですが、その幅を取得することはできますか?
Cocode

2022/11/02 05:01

とりあえずはうまくいったかな?よかったです!幅を変更とはどういう意味でしょう〜?
yuzumochi

2022/11/02 06:41

[ 'A1:C1', 'F1:I1', 'K1:M1', 'P1:S1', 'Y1:AA1' ]の場合、 [3,4,3,4,3]のように取得したいのですが、
Cocode

2022/11/02 07:30

コードを更新しました。rangeオブジェクトから.getWidth()で取得可能です。
yuzumochi

2022/11/02 08:23

ありがとうございます! 助かりました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問