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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

1447閲覧

セル内の特定の文字だけ色を変えたい

Noeru

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

0グッド

2クリップ

投稿2023/06/08 11:14

編集2023/06/09 20:50

セルの特定の文字だけ色を変更したいです。

あるセルに『赤・青・緑・黄』と入力されていて、
赤は赤字、青は青字、緑は緑字、黄は黄字にしたいです。

GASは初心者の為、コードを書いてくださると助かります。

よろしくお願いします。

追記
下記のコードにて、キーワードを赤のみに変更して実行
次にキーワードを青のみに変更して実行
すると、セルの中に『赤青』が入ってる場合、赤しか赤字にならない。
同一セルに対象の文字列が含まれる場合どうも上手くいかず、理由が分かりません。

Googleスプレッドシートで、特定の列全体のセル内の特定の単語だけ着色したい
https://teratail.com/questions/173480

function ChangeKeyWordColor() {

// 列の指定 1→A列、2→B列、3→C列・・・
var col = 3;

// 色の指定
var color = '#ff0000';

// キーワードの指定
var keywords = ['あいうえお', 'かきくけこ', 'さしすせそ'];

var sheet = SpreadsheetApp.getActiveSheet();
var last_row = sheet.getLastRow();
var row = 1;
var values = sheet.getRange(row, col, last_row).getValues();

for (var i = 0; i < last_row; i++) {

var cell_value = values[i]; var reg_test = new RegExp(keywords.join("|")); // セルの値の中にキーワードが無ければ、スキップして次のセルへ if (reg_test.test(cell_value) === false) { continue; } // リッチテキストを作成して、セルのテキストを設定 var rich_text = SpreadsheetApp.newRichTextValue().setText(cell_value); keywords.forEach(function (value) { var regexp = new RegExp(value, "g"); var result; // キーワードの開始位置をグローバル検索 while (result = regexp.exec(cell_value)) { var start_pos = result.index; var end_pos = start_pos + value.length // テキストスタイルを設定 rich_text = rich_text.setTextStyle( // 開始位置、終了位置、色 start_pos, end_pos, SpreadsheetApp.newTextStyle().setForegroundColor(color).build() ); } }); // キーワードに色がついたテキストをセルに設定 sheet.getRange((i + 1), col).setRichTextValue(rich_text.build());

}
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

できるだけ元のスクリプトを活用して、一部修正が必要な箇所をご提示します。

提示するコードで従前のコードをコメントアウトして新たなコードを追加していますので、
修正内容を確認の上で修正してみてください。

修正後は、
C列のセルに「赤・青・緑・黄」という文字列があるとそれぞれの文字の色を変更します。
「赤色」などの文字は赤だけが赤くなり色は黒いままです。

色の指定をキーワードにあわせて(同じindexで)配列を作成します。

js

1 // 色の指定 2 // var color = '#ff0000'; 3 // キーワードの指定 4 // var keywords = ['あいうえお', 'かきくけこ', 'さしすせそ']; 5 // キーワードと色の指定 6 var keysAndColors = [ 7 ['赤', '#ff0000'], 8 ['青', '#0000ff'], 9 ['緑', '#008000'], 10 ['黄', '#ffff00'], 11 ]; 12 //それぞれの配列に再構成(インデックスは同じまま) 13 var keywords = keysAndColors.map(v => v[0]); 14 var colors = keysAndColors.map(v => v[1]);

そして色の指定の際にキーワードに対応した色にするためにキーワードのindexを引数に追加します。

js

1 // リッチテキストを作成して、セルのテキストを設定 2 var rich_text = SpreadsheetApp.newRichTextValue().setText(cell_value); 3 // keywords.forEach(function (value) { 4 keywords.forEach(function (value, index) {

最後に色の指定をキーワードのインデックスで指定した色(colorではなく配列colorsの要素)にします。

js

1 // 開始位置、終了位置、色 2 // start_pos, end_pos, SpreadsheetApp.newTextStyle().setForegroundColor(color).build() 3 start_pos, end_pos, SpreadsheetApp.newTextStyle().setForegroundColor(colors[index]).build()

(追記です。)

GASは初心者の為、コードを書いてくださると助かります。

ということなので修正後のコード全文を追記しておきます。

JavaScript

1function changeKeyWordColor() { 2 // 列の指定 1→A列、2→B列、3→C列・・・ 3 var col = 3; 4 // 色の指定 5 // var color = '#ff0000'; 6 // キーワードの指定 7 // var keywords = ['あいうえお', 'かきくけこ', 'さしすせそ']; 8 // キーワードと色の指定 9 var keysAndColors = [ 10 ['赤', '#ff0000'], 11 ['青', '#0000ff'], 12 ['緑', '#008000'], 13 ['黄', '#ffff00'], 14 ]; 15 //それぞれの配列に再構成 16 var keywords = keysAndColors.map(v => v[0]); 17 var colors = keysAndColors.map(v => v[1]); 18 var sheet = SpreadsheetApp.getActiveSheet(); 19 var last_row = sheet.getLastRow(); 20 var row = 1; 21 var values = sheet.getRange(row, col, last_row).getValues(); 22 for (var i = 0; i < last_row; i++) { 23 var cell_value = values[i]; 24 var reg_test = new RegExp(keywords.join("|")); 25 // セルの値の中にキーワードが無ければ、スキップして次のセルへ 26 if (reg_test.test(cell_value) === false) { 27 continue; 28 } 29 // リッチテキストを作成して、セルのテキストを設定 30 var rich_text = SpreadsheetApp.newRichTextValue().setText(cell_value); 31 // keywords.forEach(function (value) { 32 keywords.forEach(function (value, index) { 33 var regexp = new RegExp(value, "g"); 34 var result; 35 // キーワードの開始位置をグローバル検索 36 while (result = regexp.exec(cell_value)) { 37 var start_pos = result.index; 38 var end_pos = start_pos + value.length 39 // テキストスタイルを設定 40 rich_text = rich_text.setTextStyle( 41 // 開始位置、終了位置、色 42 // start_pos, end_pos, SpreadsheetApp.newTextStyle().setForegroundColor(color).build() 43 start_pos, end_pos, SpreadsheetApp.newTextStyle().setForegroundColor(colors[index]).build() 44 ); 45 } 46 }); 47 // キーワードに色がついたテキストをセルに設定 48 sheet.getRange((i + 1), col).setRichTextValue(rich_text.build()); 49 } 50}

投稿2023/06/08 22:33

編集2023/06/08 23:44
YellowGreen

総合スコア683

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

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

Noeru

2023/06/09 11:50

返事が遅くなり申し訳ございません。 親切に丁寧な説明ありがとうございます! 実際にコードを使ってみましたが、自分の希望通りになりました 本当にありがとうございます。助かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問