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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スライド

Google スライドは、Google社が提供している文書作成ツール。Googleアカウントがあれば利用が可能です。プレゼンテーション用テンプレートフォーマットやフォントなどが多く用意されています。

Google Apps Script

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

Q&A

解決済

2回答

881閲覧

スプレッドシートで項目が切り替わるごとに交互に色分けしたい

sawa

総合スコア3002

Google スライド

Google スライドは、Google社が提供している文書作成ツール。Googleアカウントがあれば利用が可能です。プレゼンテーション用テンプレートフォーマットやフォントなどが多く用意されています。

Google Apps Script

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

0グッド

0クリップ

投稿2019/07/02 04:24

スプレッドシートにおいて、GASを使ってB列の項目で色分けをして見やすくしたいと考えています。
イメージ的にはB列にはフォルダ名があって、そのフォルダごとに2色で交互に色分けがしたいのです。
(同じフォルダ内のファイルは同じセルの色とし、フォルダが変わるごとに 色1、色2が交互になる)

で、以下のようなスクリプトを作成したのですが、当たり前ですが目視できるレベルの遅さです。。
この色分けをよりスマートで早い処理で行うにはどういったコードの書き方がありますでしょうか。

GAS

1 var LRow = logsheet.getLastRow(); 2 3 var can = "#e0ffff"; 4 var oldlace = "#fdf5e6"; 5 logsheet.getRange(4,1,1,6).setBackground(oldlace); 6 7 for(var i= 5; i < LRow+1; i++){ 8 var ssName1 = logsheet.getRange(i-1,2).getValue(); 9 var ssName2 = logsheet.getRange(i,2).getValue(); 10 if(ssName1 === ssName2){ 11 var BColor = logsheet.getRange(i-1,2).getBackground(); 12 logsheet.getRange(i,1,1,6).setBackground(BColor); 13 } 14 else{ 15 var BColor = logsheet.getRange(i-1,2).getBackground(); 16 17 if(BColor === oldlace){ 18 logsheet.getRange(i,1,1,6).setBackground(can); 19 } 20 else{ 21 logsheet.getRange(i,1,1,6).setBackground(oldlace); 22 } 23 } 24 }

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

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

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

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

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

guest

回答2

0

ベストアンサー

例えば次のような修正はいかがでしょうか。主な変更点はsetBackground()の代わりにsetBackgrounds()を使うことです。簡単な流れは、最初にB列の値を取得し、これを元にして各行の色をセットしたArrayを作成し、それをsetBackgrounds()を使ってシートへ反映させます。

修正したスクリプト

javascript

1var LRow = logsheet.getLastRow(); 2var can = "#e0ffff"; 3var oldlace = "#fdf5e6"; 4 5// 下記を変更しました。 6var values = logsheet.getRange("B4:B" + LRow).getValues(); 7var colors = [can, oldlace]; 8var f = 1; 9var res = values.map(function(e, i) { 10 var ar = Array.apply(null, new Array(6)).map(function() {return colors[f]}); 11 if (i < values.length - 1 && e[0] != values[i + 1][0]) f ^= 1; 12 return ar; 13}); 14logsheet.getRange(4, 1, res.length, res[0].length).setBackgrounds(res);
  • logsheetはすでにどこかで定義されているものと仮定しています。

参考

上記の修正で少しは速度改善すると思われますが、予想されているよりも遅い場合は申し訳ありません。また、おそらくいくつかの修正方法があるかと思われます。そのため、この修正方法は複数ある中の一つとしてお考え下さい。

投稿2019/07/02 09:20

kisojin

総合スコア899

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

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

sawa

2019/07/03 01:24

コードの中身は理解できない箇所多々ありますが、コピペで実行したところ格段にスピードアップしました。 ありがとうございます。コードの内容はしっかり調べて理解するようにします。 色をセットしたArrayを作成という発想、私の知識ではたどり着けない記述でした。 (mapは配列処理で重要とわかっていても、難しいイメージでうまく使えません) 今回やりたかったことが出来て、かつ勉強にもなりました。ベストアンサーとさせていただきます。 ありがとうございました。
kisojin

2019/07/05 00:07

ご返事ありがとうございます。無事解決したとのことで安心しました。
guest

0

スプレッドシートの条件付き書式で行全体を色付け

適当に範囲を選択して、条件をカスタム数式にして=$B1="fold1"とかって書く

投稿2019/07/02 10:13

papinianus

総合スコア12705

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

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

sawa

2019/07/03 01:19

回答ありがとうございます。"fold1"のところにフォルダ名セットすると色分けできました。 ただ説明不足で恐縮ですが、今回はログシートをGASで新規に作成した上で、 色分けも自動化したいなーということで相談させていただいており、 スクリプトでの処理を希望しております。
papinianus

2019/07/03 22:29

マイナス評価を質問者様がつけたのでないときのための説明 条件付き書式のほうが早いと思ったので、遅いという問いへの回答です スクリプトで完結すべきという要件、およびこの要件に基づく調査、調査によって得られたであろうAPIコールの削減についての言及がない質問に対して客観的にマイナスをつける根拠をお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問