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

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

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

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

Google Apps Script

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

Q&A

1回答

1031閲覧

GAS スプレッドシート セルの範囲を指定できるように変更したい

watao...

総合スコア0

Google スプレッドシート

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

Google Apps Script

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

0グッド

1クリップ

投稿2021/09/18 07:42

編集2021/09/18 07:45

前提・実現したいこと

GASを使用して
スプレッドシート内で指定した文字のみの色を変更する
※指定した文字があるセルの色を変更させるわけではない。

発生している問題・エラーメッセージ

【問題点】
文字を変更できる範囲が1列分のみ
下記のコードが原因
「// 列の指定 1→A列、2→B列、3→C列・・・
var col = 6;」

【理想の解決策】
変更できる範囲をシート全体にする
もしくは変更範囲の行と列を指定できるようにする

該当のソースコード

【コード名】
GAS
【ソースコード】
function ChangeKeyWordColor() {

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

// 色の指定
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());

}
}

試したこと

以下のサイトのコードを記入しました。
https://teratail.com/questions/173480

補足情報(FW/ツールのバージョンなど)

getrangeなどセルの範囲をしていするやり方を見ましたが、うまくいきませんでした。
お手すきの際で構いませんのでお答えいただけますと大変助かります。

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

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

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

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

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

guest

回答1

0

基本的な考え方は、「行と列でforループを二重に回して処理する」です。

  • 正規表現オブジェクトを生成するnew RegExpは、ループの外側に出す。繰り返しの最中に変化しないのに、いちいち生成するのは効率が悪い。
  • テキストスタイルの生成もループの外側に出す。理由は上と同じ。
  • ループの中でひとつのセルごとにsetRichTextValueで書き込むのではなく、rich_text.build()の値を保持する二次元配列を作って、setRichTextValuesで一気に書き込む。スクリプトの動作速度に影響する。
  • 最初にgetRangeで選ぶ範囲が、1行目から始まる場合のみ使える式になっているので修正する。

GAS

1function ChangeKeyWordColor() { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 4 const color = '#FF0000'; 5 const text_style = SpreadsheetApp.newTextStyle().setForegroundColor(color).build(); 6 7 const keywords = ['ライター', '貴社', '採用']; 8 const reg_test = new RegExp(keywords.join("|")); 9 const reg_keys = keywords.map(x => new RegExp(x, "g")); 10 11 const last_col = sheet.getLastColumn(); 12 const first_col = 1; 13 const num_cols = last_col - first_col + 1; 14 15 const last_row = sheet.getLastRow(); 16 const first_row = 1; 17 const num_rows = last_row - first_row + 1; 18 19 const values = sheet.getRange(first_row, first_col, num_rows, num_cols).getValues(); 20 21 const rich_text_values = []; 22 23 for (let row = 0; row < num_rows; row++) { 24 const rich_text_row_values = []; 25 for (let col = 0; col < num_cols; col++) { 26 const cell_value = values[row][col]; 27 let rich_text = SpreadsheetApp.newRichTextValue().setText(cell_value); 28 if (reg_test.test(cell_value)) { 29 reg_keys.forEach(function (reg_key) { 30 let result; 31 while (result = reg_key.exec(cell_value)) { 32 rich_text = rich_text.setTextStyle(result.index, result.index + result[0].length, text_style); 33 } 34 }); 35 } 36 rich_text_row_values.push(rich_text.build()); 37 } 38 rich_text_values.push(rich_text_row_values); 39 } 40 sheet.getRange(first_row, first_col, num_rows, num_cols).setRichTextValues(rich_text_values); 41}

投稿2021/09/18 08:58

Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問