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

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

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

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

Google Apps Script

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

Q&A

解決済

2回答

2333閲覧

Googleスプレッドシートで、1つのセル内の文章内で、特定の単語だけ着色したい

OnoDeluxe

総合スコア12

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2019/02/25 02:01

編集2019/02/27 03:15

実現したいこと

GoogleスプレッドシートでGASを利用し、複数の単語をリスト(配列)で持っていて、1つのセル内に該当する単語があれば複数個文字を赤くするようにしたい。

分かっていること・試したこと

調べたところ newRichTextValue() を使うことで、セル内の一部分に色をつけられることは分かりました。
スプレッドシートのマクロ機能でやりたい作業を記録させてみたところ、

function myFunction() { var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('A1').activate(); spreadsheet.getCurrentCell().setRichTextValue( SpreadsheetApp.newRichTextValue().setText('あああああああああああああああああ') .setTextStyle(1, 5, SpreadsheetApp.newTextStyle().setForegroundColor('#ff0000').build()) .setTextStyle(11, 14, SpreadsheetApp.newTextStyle().setForegroundColor('#ff0000').build()) .build() ); };

このようなスクリプトが生成されたので、下記部分を配列に対して繰り返し処理が出来れば実現出来るかもというところまでは分かりました。

.setTextStyle(1, 5, SpreadsheetApp.newTextStyle().setForegroundColor('#ff0000').build()) .setTextStyle(11, 14, SpreadsheetApp.newTextStyle().setForegroundColor('#ff0000').build())

が、どのような書き方をすれば良いのかまったく分かりません。お力添えをお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

対象セルから取り出したTEXTに対して、match()で正規表現を使って配列の1つ目の単語を指定すれば複数箇所まとめて一致した単語が含まれる位置を返してくれるので、これを使ってテキストスタイルを指定すればイケルと思います。あとは配列内で2つ目以降の単語も繰り返せばご希望の動きが実現できるかと。

「match」で複数の文字列を検索する方法については、リンク先参考になさってはいかがでしょうか?
https://www.sejuku.net/blog/21049

投稿2019/02/25 10:09

hiroshi0240

総合スコア640

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

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

OnoDeluxe

2019/02/26 02:33

位置情報の取得について回答ありがとうございます! 困っていることとしては、テキストスタイルの箇所を繰り返し処理させる記述をどう書けばよいか分からない点なのです。 メソッドチェーン?となっているようで、間に記述ができずどのような構文で書けばよいか知識不足で困っています。
hiroshi0240

2019/02/26 05:44 編集

こんな感じでどうでしょうか? 作ってみてわかったのですが、先のmatchはキーワードしか値を返さなかったので、exec()とindexで場所を特定しました。 var keywords =単語リスト配列; var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var text = sheet.getRange(対象セル).getValue(); var richText = SpreadsheetApp.newRichTextValue().setText(text); for(var i in keywords){ var keyword = keywords[i]; var keywordLength = keyword.length; var keyword = new RegExp(keyword,"g") var result; while(result= keyword.exec(text)){ var start = result.index; var end = start + keywordLength var NewStyleText = richText.setTextStyle(start, end, SpreadsheetApp.newTextStyle().setForegroundColor('#ff0000').build()); } } sheet.getRange(対象セル).setRichTextValue(NewStyleText).build();
OnoDeluxe

2019/02/27 04:00 編集

回答ありがとうございます! コードは下記とし、A1セルに「ああありんごあああみかんあああばなな」と仮で文字を入れ実行してみましたがエラーが出てしまいました。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー メソッド setRichTextValue(RichTextValueBuilder) が見つかりません。(行 23、ファイル「コード」) ーーーーーーーーーーーーーーーーーーーーーーーーーーーー function test() { var keywords = ["りんご","みかん","ばなな"]; var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var text = sheet.getRange("A1").getValue(); var richText = SpreadsheetApp.newRichTextValue().setText(text); for(var i in keywords){ var keyword = keywords[i]; var keywordLength = keyword.length; var keyword = new RegExp(keyword,"g") var result; while(result= keyword.exec(text)){ var start = result.index; var end = start + keywordLength var NewStyleText = richText.setTextStyle(start, end, SpreadsheetApp.newTextStyle().setForegroundColor('#ff0000').build()); } } sheet.getRange("A1").setRichTextValue(NewStyleText).build(); } ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
OnoDeluxe

2019/02/27 04:10

下記に修正したら動きました!!感激です!!!! 書いて頂いたコードを読み解いてみましたが「.build()」のタイミングがイマイチ理解出来ず、テキトーに試したら動いた次第です。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー function test() { var keywords = ["りんご","みかん","ばなな"]; var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var text = sheet.getRange("A1").getValue(); var richText = SpreadsheetApp.newRichTextValue().setText(text); for(var i in keywords){ var keyword = keywords[i]; var keywordLength = keyword.length; var keyword = new RegExp(keyword,"g") var result; while(result= keyword.exec(text)){ var start = result.index; var end = start + keywordLength var NewStyleText = richText.setTextStyle(start, end, SpreadsheetApp.newTextStyle().setForegroundColor('#ff0000').build()).build(); } } sheet.getRange("A1").setRichTextValue(NewStyleText); } ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
guest

0

過去質問で全く同じようなことをしているのがあるので、検索してください。

投稿2019/02/26 06:02

papinianus

総合スコア12705

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

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

OnoDeluxe

2019/02/27 03:18

ありがとうございます。 今回実現したいのは複数セルにたいしてではなく、1つのセルの複数の単語の文字色の変更でした。 そちらの質問も拝見していましたが、実現したいことが違うため今回質問を立てさせていただいた次第です。 ついては、記載していた実現したいことの言葉がたりずわかりにくいため加筆いたしました。
papinianus

2019/02/27 04:55

複数セルについて各セルに複数の単語を複数回、文字色をセットするコードだと思っていたので、今回の質問者様のやりたいことは完全に下位互換だと思いました。 1単語しか対応できない回答だったんですね。だったら失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問