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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

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

Q&A

解決済

1回答

2386閲覧

Google Apps Script : 値が同じセルを結合したい

dwayne_johnson

総合スコア86

Google Apps Script

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

0グッド

0クリップ

投稿2018/07/18 09:31

掲題の通りです。
Googleスプレッドシートにて、値が同じセルの結合を行いたいと考えています。

具体的には、以下のような列があると考えてください。

num 1 1 2 2 2 2 3 4 4 4 5

数字は重複している場合も、していない場合もあり、重複数もまちまちです。

セルの結合にはmerge()を使えることはわかったのですが、どのように範囲を指定すれば良いか、良い解決策が思いつきませんでした。

先ほどまで考えていた案としては、1つ前の行のセルが現在の行のセルと同じ値を持つ場合は、それらを結合するという方法でしたが、
結合 / 結合解除するには、結合範囲のすべてのセルを選択する必要がありますというエラーが出てきて処理が中断されてしまいます。

function myFunc() { var before_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("csv"); for (var i = 2; i <= before_sheet.getLastRow(); i++) { for (var c = 1; c <= 3; i++) { var this_cell = before_sheet.getRange(i,c) var last_cell = before_sheet.getRange(i-1,c) // 1つ前の行のセル if (this_cell.getValue() === last_cell.getValue()) { before_sheet.getRange(i-1,c,i-1).merge(); } } } }

何か他に良い解決策はないでしょうか?

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

私だったらこう書くよ。というのを載せておきます。
Stathamさんのスクリプトでは、列方向もループがかかっていますが、質問に提示いただいている列のみがあると仮定してコードを書いています。

列方向も必要な場合には、colをループしてやればいいかと思います。

js

1function myFunc() { 2 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); 3 4 var tmpValue; 5 var count = 1; // 結合数 6 var col = 1; // 列番号 7 8 var data = sheet.getDataRange().getValues(); 9 10 for (var i = sheet.getLastRow(); i > 1; i--) { 11 var row = data[i - 1]; // 配列番号と行番号はずれる 12 Logger.log(row[col - 1] + ":" + tmpValue); 13 14 if (row[col - 1] === tmpValue) { 15 count++; 16 } else { 17 if (count > 1) { 18 // 結合 19 sheet.getRange(i + 1, col, count).merge(); 20 } 21 22 tmpValue = row[col - 1]; 23 count = 1; 24 } 25 } 26 27 // 最後が結合できないため、追加 28 if (count > 1) { 29 // 結合 30 sheet.getRange(2, col, count).merge(); 31 } 32}

投稿2018/07/19 00:30

macaron_xxx

総合スコア3191

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

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

dwayne_johnson

2018/07/19 07:35

後ろから処理していくこと、重複が起こらなくなったタイミングで、それより一つ前のセルからcountの数だけマージするという流れに納得、感動しました。 おかげさまで無事問題は解決しました。 ありがとうございました。
macaron_xxx

2018/07/19 07:44

この場合は実は前から処理していって、重複が起こらなくなったタイミングで、countの数だけ前の行からcount数マージしても同じことができます。 後ろから処理しているのは私の癖みたいなもんです。 *** 最初にスプレッドシートの全データを配列にとっているため、前から処理すると、行削除をしたときに配列番号と行番号にずれが生じます。そのためデータを配列にとって処理をするときには後ろから処理するという癖づけをしているだけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問