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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

310閲覧

Googleスプレッドシートのセル内の文章の一部を、条件付きで色を変えたい。

Doutor

総合スコア1

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

3クリップ

投稿2024/07/24 09:16

実現したいこと

まず初めに、私はGASは初心者の為、説明不足な点や見当違いな箇所があれば申し訳ございません。
ご指摘いただけますと幸いです。
また、教えていただく際にコードを記載していただけると助かります。
出来れば教わった内容をそのまま使うだけでなく、自分なりにアレンジを加えたり内容を調整したい為
ここでなんの処理をしているかなどもコード内に記載していただけるとより助かります。

実現したいこととして
様々な文章の特定の単語の色付けを、GoogleスプレッドシートのAppsScriptを使って効率化したいです。
①、セルA1に文章を挿入
②、Apps Scriptを実行
③、設定した条件に沿ってセルA1の文章に色がつく
このような流れができる事を期待しております。

条件としては現時点では下記のような内容を想定しております。

  • "〇"から始まる行はその行全体を青色に変更する。(〇を含む先頭から改行するまでの文字列)
  • "・"から始まっていて、上の行に"注意"の単語が含まれている場合、行全体を赤色に変更する。
  • "・"から始まっていて、上の行も赤色の場合、行全体を赤色に変更する。(元文章は全て黒字の為、上記で変更した赤色を参照している前提の為、処理順的に難しければ他の条件を考えたい)
  • "1時間"の文字を赤色に変更する。(これは行ではなく「1時間」だけが赤くなって欲しい)
  • "00:00"などの、時間を表す文字を赤色に変更する。

あくまで、現時点ではなので応用が利きやすいコードであればより嬉しいです。

発生している問題・分からないこと

現時点で困っている部分は下記になります。

1.特定の文字列を参照して、行全体の色を変更するスクリプトの書き方
※〇〇から始まる行の~といった条件指定が上手くいきません
2.複数の条件を指定する方法
3.if関数のように、この場合はこう、この場合はこう、といったスクリプトの書き方

該当のソースコード

function changeTextColor() { // 対象のスプレッドシートを取得 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // 対象のシートを取得 var sheet = spreadsheet.getSheetByName("シート1"); // 変更したい文字列が含まれるセルを取得 var cell = sheet.getRange("A1"); // セルの値を取得 var cellValue = cell.getValue(); // richTextBuilderを使って、特定の文字列の色を変更 var richTextBuilder = SpreadsheetApp.newRichTextValue() .setText(cellValue) // この部分のスクリプトを変更したいが、変更の仕方が分からない .setTextStyle(0, 5, SpreadsheetApp.newTextStyle().setForegroundColor("blue").build()) .build(); // 変更したrichTextを再度セルに設定 cell.setRichTextValue(richTextBuilder); }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

AIやGoogle検索などを使い初心者ながらスクリプトを書いています。
セル全体ではなく、セルの中身の一部を変更する場合は「setRichText」でないとダメなようなので
現在はこれを使ってなんとかならないかと考えております。

補足

特になし

atlanticSalmon👍を押しています

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

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

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

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

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

codemaker

2024/07/24 18:39 編集

検索すれば色々と参考になるコードは(例えばここでも)見つかると思うのですが、それらの活用のしかたを知りたいのではなく、 やってみたらこうなった(エラー、動作不良)でもなく、 最初からあれがわからない… これもわからない…ということなのですね。 プログラミングの教科書的なコメント付きコードの作成依頼と受け止めた方がいいのでしょうか
pecmm

2024/07/24 13:36

1セルに対する条件/処理が複雑すぎて明らかにスプレッドシートの使い方として非効率的なので やり方から見直してみてはいかがでしょうか。 (そもそもの要求から考えて、A!セルだけに全てのテキストを入れてリッチな装飾を頑張る方向性でしか実現できないものなんでしょうか?) シンプルで扱いやすい構造として例えば ・特定のcolumnのテキストが「〇」から開始していれば、そのrow全体の背景色を変える ・特定のcolumnのテキストが「注意」と完全一致すれば、そのrowの別columnの文字色を変える ……等の組み合わせであれば、GASでの制御も簡単ですし 条件付き書式だけでも対応できたりします。
YAmaGNZ

2024/07/24 22:50

現状での方針としては // richTextBuilderを使って、特定の文字列の色を変更 var richTextBuilder = SpreadsheetApp.newRichTextValue() .setText(cellValue); と基本部分を作成しておいて if (条件1) { richTextBuilder.setTextStyle(条件1開始オフセット, 条件1終了オフセット, SpreadsheetApp.newTextStyle().setForegroundColor("blue").build()); } if (条件2) { richTextBuilder.setTextStyle(条件2開始オフセット, 条件2終了オフセット, SpreadsheetApp.newTextStyle().setForegroundColor("red").build()); } // 変更したrichTextを再度セルに設定 cell.setRichTextValue(richTextBuilder.build()); といった感じで条件それぞれに対してsetTextStyleしていけばいいかと思います。 ただ1つのセルに入力された文章を1行に分割して複数行のセルに入れ直し、それぞれに対して装飾を追加する といった方法のほうが現状よりは簡単な気がします。
Doutor

2024/07/25 01:29

皆様、返信いただきありがとうございます。 参考になりそうなコードは調べた限り複数あり このサイトでいうと例えば https://teratail.com/questions/173480 https://teratail.com/questions/98163#reply-152044 などを参考に色々と試してみたのですが、やりたい事が微妙に違っていたり どのスクリプトがなんの効果を担っているかなどが分からず 質問した方が早い気がした為、不躾ながら質問させていただきました。 全てお任せするのは流石に申し訳ないので、助言を頂けるだけでも大変ありがたいですが 「プログラミングの教科書的なコメント付きコード」を頂けるのであればより助かります。 まず「セルA1内だけで完結させない方が良い」とのアドバイスについてですが 最終的には、完成した色分けされた文章をスプレッドシート内に一覧として並べたいと考えております。 その為、シートの1行ごとに文章の1文を割り当てると色分けは簡単になるかもしれませんが その後その文章をコピペした時などに色が反映されず困る為、セルA1内で全て処理するのが良いかと考えました。 ※セルA1内だけで完結させる事にこだわりがあるわけではありませんので、分けてもやりたい事が全て実現可能でその後最終的に1つのセルに色分けされた文章が挿入できる方法があれば、ご教授いただければ幸いです。 if条件を重ね掛けする方法については1度試してみます、ありがとうございます
YAmaGNZ

2024/07/25 02:59

ここでの質問でしたら https://teratail.com/questions/lyslkwff8ag0hz こちらも参考になるかと思います。 また色を変更する条件を作成するものとして「正規表現」といったものを利用することになるかと思います。
Doutor

2024/07/25 05:26

ありがとうございます https://teratail.com/questions/lyslkwff8ag0hz こちらも確認したのですが、同一セル内での〇行目が~という条件指定ではない為 コードを参考にするのが難しいと判断しておりました。 既に数人からご指摘のある通り、1つのセル内で色々やるのは難しそうですので 一度セル内の文章を分割して複数行のセルに入れ直し、そこでHTMLを使って装飾してから セルに戻す方法が無いかの方針で考えてみております
guest

回答2

0

ベストアンサー

なんだか呼ばれたような気がしたのですが...

JavaScript

1/* 2 "〇"から始まる行はその行全体を青色に変更する。(〇を含む先頭から改行するまでの文字列) 3 "・"から始まっていて、上の行に"注意"の単語が含まれている場合、行全体を赤色に変更する。 4 "・"から始まっていて、上の行も赤色の場合、行全体を赤色に変更する。(元文章は全て黒字の為、上記で変更した赤色を参照している前提の為、処理順的に難しければ他の条件を考えたい) 5 "1時間"の文字を赤色に変更する。(これは行ではなく「1時間」だけが赤くなって欲しい) 6 "00:00"などの、時間を表す文字を赤色に変更する。 7 8 最後の2つは"〇"から始まる行の中では青になります。 9 赤にしたいならそれぞれの着色のif (…) {…}を"〇"から始まる行の処理の後に移動してください 10 "〇"から始まる行に注意という文字があって、続く行が"・"から始まるなら 11 "〇"から始まる行は青文字で、続く"・"から始まる行が赤文字になります 12 注意という文字が含まれるだけの行は条件を満たさないので文字色は変更されません 13*/ 14function changeTextColor() { 15 // 初期設定(検索する文字列(str)または正規表現(exp)と文字色(color)) 16 const circle = {str: '〇', color: 'blue'}; // 〇は質問文からコピペした文字です 17 const dot = {str: '・', color: 'red'}; 18 const notice = {str: '注意', color: null}; 19 const oneHour = {exp: /1時間/, color: 'red'}; // 1時間ではなくxx時間なら/1時間/を/\d+時間/に変更 20 const time = {exp: /[0-9][0-9]:[0-9][0-9]/, color: 'red'}; 21 22 // スプレッドシートのA1の値を取得 23 const ss = SpreadsheetApp.getActiveSpreadsheet(); 24 const sheet = ss.getSheetByName('シート1'); 25 const range = sheet.getRange('A1'); 26 const value = range.getValue(); 27 28 // A1の値の各行の値(line)と開始位置(linePos)を正規表現の照査でresultsに取得 29 const results = value.matchAll(/.+(\n|$)/g); // 改行(\n)または文字列の最後($)までを取得する正規表現 30 let richText = SpreadsheetApp.newRichTextValue().setText(value); 31 // 注意の行に続く行かどうかのフラグ 32 let isNotice = false; 33 34 // 各行の値ごとに繰り返し処理 35 for (const result of results) { 36 // 各行の値 37 const line = result[0]; 38 // 各行の開始位置(終了位置はlineの文字数lengthを加算して取得) 39 const linePos = result.index; 40 41 // 行に1時間が含まれている場合は、1時間を指定の文字色にする 42 if (oneHour.exp.test(line)) { 43 const regExp = new RegExp(oneHour.exp, 'g'); 44 const lineResults = line.matchAll(regExp); 45 for (const lineResult of lineResults) { 46 richText = richText.setTextStyle( 47 linePos + lineResult.index, 48 linePos + lineResult.index + lineResult[0].length, 49 SpreadsheetApp.newTextStyle().setForegroundColor(oneHour.color).build() 50 ) 51 } 52 } 53 54 // 行に時刻が含まれている場合は、時刻を指定の文字色にする 55 if (time.exp.test(line)) { 56 const regExp = new RegExp(time.exp, 'g'); 57 const lineResults = line.matchAll(regExp); 58 for (const lineResult of lineResults) { 59 richText = richText.setTextStyle( 60 linePos + lineResult.index, 61 linePos + lineResult.index + lineResult[0].length, 62 SpreadsheetApp.newTextStyle().setForegroundColor(time.color).build() 63 ) 64 } 65 } 66 67 // 注意の行に継続する行は、行が・で始まっているかどうかで処理を分ける 68 if (isNotice) { 69 if (line.startsWith(dot.str)) { 70 // 行が「・」で始まっている場合は、行の開始位置から終了位置までを指定の文字色にする 71 richText = richText.setTextStyle( 72 linePos, 73 linePos + line.length, 74 SpreadsheetApp.newTextStyle().setForegroundColor(dot.color).build() 75 ); 76 } else { 77 // 行が「・」で始まっていない場合、注意の行に継続するフラグをオフにする 78 isNotice = false; 79 } 80 } 81 82 // 行が「〇」で始まっている場合は、行の開始位置から終了位置までを指定の文字色にする 83 if (line.startsWith(circle.str)) { 84 richText = richText.setTextStyle( 85 linePos, 86 linePos + line.length, 87 SpreadsheetApp.newTextStyle().setForegroundColor(circle.color).build() 88 ); 89 } 90 91 // 行に「注意」が含まれているときは、注意の行に継続するフラグをオンにする 92 if (line.includes(notice.str)) { 93 isNotice = true; 94 }; 95 } 96 97 // 全ての行の処理が終わったらリッチテキストをセルに記入する 98 range.setRichTextValue(richText.build()); 99}

投稿2024/07/25 14:20

YellowGreen

総合スコア774

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

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

YellowGreen

2024/07/25 14:29

教科書的な説明かどうかわかりませんがコメントを付してあります。 Google検索しても不明な点はご質問ください。
Doutor

2024/07/26 01:54

ご回答ありがとうございます。大変助かりました。 設定していただいた内容は全て期待通りの動きをしており コメントアウトで各処理も丁寧に記載していただいている為 追加で条件を増やしたい時にも対応できそうで、とてもありがたいです。 ひとまず、YellowGreen様をはじめ、他の方に頂いた内容も参考にしつつ頑張ってみたいと思います もし、どうしても分からない事がありましたらまたお呼びさせて頂く事もあるかもしれませんが その時はどうかお力添え頂ければ幸いです。
Doutor

2024/07/26 02:01

皆様とても親切にアドバイスして頂いたり、コードを添えて頂いたりしており ベストアンサーが1人しか選べないのはとても心苦しいところではありますが 今回は、懇切丁寧にコメントアウトでコードの解説をしてくださった こちらの回答がスクリプト初心者としてとても助かった為 ベストアンサーに設定させて頂きました。 エラーしかでず心が折れかけていましたが、とても親切な人たちと素敵なサイトに出会えて良かったです。 今後も精進いたしますので、また何かあればよろしくお願いいたします。 ありがとうございました
guest

0

パッとですがサンプルを作成しました。
セルを読み込み、1行ごとに分割し、行ごとに処理をしていくという感じです。
条件全ては作っていませんが、これを参考に判定できるのではないかと思います。

javascript

1function changeTextColor() { 2 let sheet = SpreadsheetApp.getActiveSheet(); 3 let cell = sheet.getRange('A1'); 4 5 let cellText = cell.getValue(); 6 7 // 処理する行の最初の文字がセル全体の何文字目になるか格納する変数 8 let offset = 0; 9 10 // セルの文字全体のrichTextBuilderを作成する。 11 let richTextBuilder = SpreadsheetApp.newRichTextValue().setText(cellText); 12 13 // セルの文字を改行で分割する 14 let lines = cellText.split('\n'); 15 16 for(line in lines) 17 { 18 // 1行ごとに処理する 19 console.log(lines[line]); 20 21 // 処理する行の先頭が〇か判断 22 if (lines[line].match(/^〇/)) 23 { 24 richTextBuilder.setTextStyle(offset, offset + lines[line].length, SpreadsheetApp.newTextStyle() 25 .setForegroundColor("blue").build()) 26 27 befor = false; 28 } 29 30 // 処理する行に'1時間'が含まれるのか判断する 31 let result; 32 let reg = /1時間/g; 33 while (result = reg.exec(lines[line])) { 34 richTextBuilder.setTextStyle(offset + result.index, offset + result.index + result[0].length , SpreadsheetApp.newTextStyle() 35 .setForegroundColor("red").build()) 36 } 37 38 // 現在処理した行の文字数を加算して次の行の先頭の文字が全体の何文字目か計算する 39 // \nがあるのでその分も考慮する 40 offset += lines[line].length + 1; 41 42 } 43 44 sheet.getRange(2,1).setRichTextValue(richTextBuilder.build()); 45 46} 47

投稿2024/07/25 07:23

編集2024/07/25 08:07
YAmaGNZ

総合スコア10383

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

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

Doutor

2024/07/25 13:58

回答ありがとうございます。試してみましたが解決できませんでした。 スクリプトの保存時に下記のエラーがでます 構文エラー: SyntaxError: Unexpected token '.' 行: 20 ファイル: テスト(ログ).gs この場合どの辺りに原因がありそうでしょうか? AIを利用してエラー箇所をチェックしてみたところ richTextBuilder.setTextStyle(offset, offset + lines[line].length, SpreadsheetApp.newTextStyle() .setForegroundColor("blue").build()) この部分を richTextBuilder.setTextStyle(offset, offset + lines[line].length, SpreadsheetApp.newTextStyle() .setForegroundColor("blue") .build()); こうする事で解決すると言われたのですが、同じエラーがでます。 ですが、スクリプト自体はとても参考になりそうなものばかりですので 是非上手く活用できないか試させていただきます。ありがとうございます
YAmaGNZ

2024/07/25 22:16

私の回答のソースをコピーしてエディタへ張り付けてみましたがエラーは出ませんでした。 20行目となるとAIが提示した箇所ではなさそうに思えます。 もし私のコードをそのままコピーしたのであれば20行目は // 1行ごとに処理する console.log(lines[line]); この次の行の空白行のはずです。 このあたりに不必要な"."があったりしませんか?
Doutor

2024/07/26 01:14

お返事いただきありがとうございます。 私もコピーして、未記入のエディタへ貼り付けただけなので 間違いはなさそうなのですが… 私も20行目は空白行なので、空白行を除く20行目の事を指しているのかなど 色々試してみましたが分かりませんでした…
Doutor

2024/07/26 01:30

申し訳ございません キャッシュをクリアしてPCを再起動した所、正常に動作しました 原因は分かりませんが、私の環境の問題だったようです。 色の変更も正常に動作しておりますので、参考にさせていただきます ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問