質問するログイン新規登録

Q&A

4回答

376閲覧

スプレッドシートで条件に合うセルを変色

退会済みユーザー

退会済みユーザー

総合スコア0

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2019/02/08 02:18

編集2019/02/08 02:33

0

0

スプレッドシートをデータベースとして使っており、次のようになっています。
/| A |   B  |
――――――――――――――
/| ID | 日付 |
1 | 111222 |2019/01/25|
2 | 333444 |      |
3 | 111222 |      |
4 | 555777 |      |

A列にID、B列には日付をいれるとします。

A列のIDには重複があるのですが、
B列に日付を入力したタイミングで、
IDが重複していて日付が入っていない方のみ、セルに色をつけることはできるでしょうか。

条件付き書式にて色々試しましたが、
日付が入る方のみ着色されたり、また両方日付が入っていない際には着色をしないという条件を踏まえるとどうしてもできませんでした。

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

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

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

papinianus

2019/02/08 02:26 編集

ExcelなのかGoogleスプレッドシートなのかどちらか明確にしていただけますか?(タグはExcel/Google、タイトルはスプレッドシートなので) もちろん、どちらでもいいならそう書いていただいても結構です
退会済みユーザー

退会済みユーザー

2019/02/08 02:33

すみません、スプレッドシートの方でお願いしたいです。 タグは編集しました。
papinianus

2019/02/08 02:52

Googleスプレッドシートのタグがあった気がする
papinianus

2019/02/08 03:20 編集

「入力したときに着色したい」の意味なんですが、仮に質問のB1を消したらB3の色は解除されるべきでしょうか?
退会済みユーザー

退会済みユーザー

2019/02/08 03:22

はい、その通りです。
guest

回答4

0

Googleスプレッドシートが実行できない環境なので確認できていませんが。。。
Excelの条件付き書式なら次のような感じの数式で判定できました。
A列を選択してから設定。

Excel

1=AND(COUNTIF($A:$A,$A1)>1,$B1="")

投稿2019/02/08 02:36

ttyp03

総合スコア17002

退会済みユーザー

退会済みユーザー

2019/02/08 02:49

回答ありがとうございます。 こちらでやってみたら、日付が入っていない場合に該当のIDで両方共着色されてしまいました。 日付が入ったタイミングで、 IDが重複しており、日付が入らない方のみに着色したいのです。
papinianus

2019/02/08 02:50

動きました。 隣の参照が良く分かんなくて(というか隣の参照がちゃんと相対的に動いてくれるかの挙動が判断できなくて)INDIRECTとかつかってめっちゃがんばったのがこちらになります。 =AND(B1="", COUNTIF(A:A, INDIRECT(ADDRESS(ROW(B1),COLUMN(B1) - 1))) > 1 )
ttyp03

2019/02/08 02:52

おふた方確認修正ありがとうございます。 やはりGoogleスプレッドシートとExcelは若干挙動が違うのですね。
退会済みユーザー

退会済みユーザー

2019/02/08 02:58

ありがとうございます! 感動しました。素晴らしいです!!!
papinianus

2019/02/08 03:03 編集

ttyp03様へ 多分私の見たところ、今回は挙動は同じです(両方確認しました) 質問者様は、B列に色をつけたく、かつA列で重複があるとしても、重複する値群の右側のB列が全て空白だったら色をつけたくないのだと思いました。 (未入力状態ではスルーし、入力がおこったイベントで、多分同じ値を別セルに書くことを促すか、重複ID列を削除する目的があると推測しました) 回答編集が起こっていないのに「感動」に至ったんで訳わからなくなりましたが。
退会済みユーザー

退会済みユーザー

2019/02/08 03:04

すみません、やっぱり確認した所望むものではなかったです。 日付が入った時に変色です。 両方日付が入っていない時には着色しないようにしたいです。
ttyp03

2019/02/08 04:50 編集

よくわからなくなったので確認です。 ・IDが重複するとき ・そのIDの日付の入力が1件でもあって全件ではないとき ・日付が入力されている行を色づけする であってます?
ttyp03

2019/02/08 05:12

あれ、違うか。 ・IDが重複するとき ・日付が入力されている行を色づけする かな。
ttyp03

2019/02/08 05:13

(相変わらずExcelです) 前者の場合。 =AND(COUNTIF($A:$A,$A1)>1,SUMPRODUCT(($A:$A=$A1)*($B:$B<>""))>0,SUMPRODUCT(($A:$A=$A1)*($B:$B<>""))<COUNTIF($A:$A,$A1),$B1<>"") 後者の場合。 =AND(COUNTIF($A:$A,$A1)>1,SUMPRODUCT(($A:$A=$A1)*($B:$B<>""))>0,$B1<>"")
ttyp03

2019/02/08 05:14

どちらも超絶重くなる可能性があるので、この数式をC列あたりに設定して、このC列の結果で色づけしたほうが軽くなります。
guest

0

スクリプト書いた都合上DとEになってますが、ご容赦下さい

F列をつかっていいなら条件書式でこう書けます

=AND(COUNTIF($D:$D,$D1)>1,$E1="", COUNTIF($D:$D,$D1) <> COUNTIF($F:$F,$D1))

投稿2019/02/08 04:58

papinianus

総合スコア12707

0

関数苦手なんでスクリプトでやってみた。
色をつけはずしする処理は重いうえ、それを繰り返し処理するので、データが多いと使いものにならないかな。
(ロジックを考えて繰り返し回数を抑制しようとしたがバグを生みそうだったので、全部色を外して、対象につける操作にしています)

javascript

1function onEdit(e) { 2 const col = e.range.getColumn(); 3 if(col !== 2) { return; } //B列以外は何もしない 4 const row = e.range.getRow(); 5 adjustColors(e.source, e.range.getSheet().getRange(row, col - 1).getValue()); 6} 7function getPairs(activeSheet, needle) { 8 const checkRange = "A:B"; 9 const vals = activeSheet.getRange(checkRange).getValues().map(function(e,i) { return [e[0], e[1], i+1];}).filter(function(e) { return e[0] === needle;}); 10 return vals; 11} 12function adjustColors(activeSheet, needle) { 13 const colour = "red"; 14 const targetCol = 2; //B 15 const sameIdPairs = getPairs(activeSheet, needle); 16 resetColorOfRowsCol(sameIdPairs.map(function(e) { return e[2]; }), targetCol); //全セルの色消す 17 const isAllEmpty = sameIdPairs.filter(function(e) { return e[1] === ""; }).length === sameIdPairs.length; 18 if(isAllEmpty) { return; } //着色しない 19 setColorOfRowsCol(sameIdPairs.filter(function(e){ return e[1] === "";}).map(function(e) { return e[2]; }), targetCol, colour); 20} 21function setColorOfRowsCol(rows, column, colour) { 22 rows.forEach(function(e) { 23 SpreadsheetApp.getActiveSheet().getRange(e, column).setBackground(colour); 24 }); 25} 26function resetColorOfRowsCol(rows, column) { 27 rows.forEach(function(e) { 28 SpreadsheetApp.getActiveSheet().getRange(e, column).setBackground(null); 29 }); 30}

投稿2019/02/08 04:12

papinianus

総合スコア12707

0

結局機能的に無理だったと

投稿2019/02/08 03:10

退会済みユーザー

退会済みユーザー

総合スコア0

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問