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

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

ただいまの
回答率

90.04%

Google App Script(GAS)を用いて、Googleスプレッドシート上のセル内の一部のみの文字色変える方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,074

nikukyu

score 23

前提・実現したいこと

イメージ説明
上の画像のように、パセリだったら緑、トマトだったら赤、バナナだったら黄のようにセル内の一部の色を入力規則で変えたいです。
リストを作成して、参照したとしても実際は画像右のように色を参照することができません。

そこでGoogle App Scriptで”パセリ”がセル内にあったら、4文字目を緑(JISコード)にするというスクリプトを作成しようという考えにいたったのですが、上手くいかなかったので質問させていただきます。
入力規則のドロップダウン内では色がついてなくてもいいので、選んでセルに入力されたら該当部に色が付けばいいなと思ったのですが、叶わずでした...
どうか有識者のお力をお借りしたいです。m(_ _)m

該当のソースコード

Sub mojiiro()
Dim myRng As Range
Dim myStr As String
Dim i As Integer
For Each myRng In Selection
With myRng.Font
.ColorIndex = xlColorIndexAutomatic
.Size = 11
End With
’----セルの文字列を1文字ずつ順番に調べる
For i = 1 To Len(myRng)
myStr = Mid(myRng.Value, i, 1)
'----数字があったら書式を変更する
If myStr Like "[0-9]" Then
With myRng.Characters(Start:=i, Length:=1).Font
.ColorIndex = 3
.Size = 14
End With
End If
Next i
Next myRng
End Sub

Sub test01()
Dim cl As Range
For Each cl In Range("a1:c6")
r = InStr(cl, "eee")
If r <> 0 Then
cl.Characters(r, 3).Font.Color = vbRed
End If
Next
End Sub

試したこと

EXCELのほうだとVBAで似たようなことができることは分かったのですが、Googleスプレッドシートではなかなか調べても出てきませんでした(T_T)
上記のコードは調べてていて使えそうだったものを載せているだけなのであまり気にしないでください...

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

GoogleAppsScript で文字に色を付けるメソッドは Range.setFontColor ですが、セル単位での色変更となるため、セル内の一部文字色変更はできません。

そこで、値を入力したタイミングで「入力範囲に指定しているセル」を「入力中のセル」に上書きする、という方法で実現してみました。
私は添付画像のように A1~A3 を入力規則リストに、B列を入力列としてますので、質問者さんの環境に応じて、サンプルコードの頭の方にある const の箇所を書き換えて試してみてください。
実行環境

function onEdit(event) {
  const INPUT_SHEET_NAME = "シート1"  // 入力シート名
//  const INPUT_COLUMN = 2;       // 入力セルの列位置
  const INPUT_COLUMNS = [2,3];       // 入力セルの列位置(複数列)
  const INPUT_RANGE = "A1:A3";       // 入力規則にしている範囲

  // 処理中のシート、範囲、値を取得
  var editSheet = event.source.getActiveSheet();
  // Event.range をそのまま上書きしようとすると実行時エラーとなるあるため再取得
  var editRange = editSheet.getRange(event.range.getRow(), event.range.getColumn());
  var newValue  = editRange.getValue();

  // onEdit イベントは全シート全セルの編集で起動されるため、
  //「シート1」「入力可能列」かつ「入力値あり」の場合のみ後続処理
  if ( editSheet.getName() != INPUT_SHEET_NAME ) return;
//  if ( editRange.getColumn() != INPUT_COLUMN ) return;
  if ( INPUT_COLUMNS.indexOf(editRange.getColumn()) == -1) return;  // 入力可能列の複数に対応
  if ( newValue == "") return;

  // 入力値に対応した一部文字色付きセルで入力セルを上書きする
  var inputRange = editSheet.getRange(INPUT_RANGE);
  loop1:
  for (var row = 1; row <= inputRange.getNumRows(); row++) {
    for (var col = 1; col <= inputRange.getNumColumns(); col++) {
      var cell = inputRange.getCell(row, col);
      // 入力セルを上書きしてループ終了
      if (cell.getValue() == newValue) {        
        cell.copyTo(editRange);
        break loop1;
      }
    }
  }

  // 上書きにより入力規則が消えてしまうため、入力規則を再作成する
  var rule = SpreadsheetApp.newDataValidation().requireValueInRange(inputRange).build();
  editRange.setDataValidation(rule);     

}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/04 14:09

    すみません、入力セルの行位置を複数にしたいのですが、どうすればいいか教えていただきたいです。
    新たに質問を作ったほうがいいのでしたら、そちらのほうで回答リクエストさせていただきますm(_ _)m
    先日教えていただいたもので、自分の環境のものに合わせてみたのですが、複数行で上記の機能を反映させれず、つまずいています...

    function onEdit(event) {
    const INPUT_SHEET_NAME = "シート1" // 入力シート名
    const INPUT_ROW = 2; // 入力セルの行位置
    const INPUT_RANGE = "A1:H1"; // 入力規則にしている範囲

    // 処理中のシート、範囲、値を取得
    var editSheet = event.source.getActiveSheet();
    // Event.range をそのまま上書きしようとすると実行時エラーとなるあるため再取得
    var editRange = editSheet.getRange(event.range.getRow(), event.range.getColumn());
    var newValue = editRange.getValue();

    // onEdit イベントは全シート全セルの編集で起動されるため、
    //「シート1」「2行」かつ「入力値あり」の場合のみ後続処理
    if ( editSheet.getName() != INPUT_SHEET_NAME ) return;
    if ( editRange.getRow() != INPUT_ROW ) return;
    if ( newValue == "") return;

    // 入力値に対応した一部文字色付きセルで入力セルを上書きする
    var inputRange = editSheet.getRange(INPUT_RANGE);
    loop1:
    for (var row = 1; row <= inputRange.getNumRows(); row++) {
    for (var col = 1; col <= inputRange.getNumColumns(); col++) {
    var cell = inputRange.getCell(row, col);
    // 入力セルを上書きしてループ終了
    if (cell.getValue() == newValue) {
    cell.copyTo(editRange);
    break loop1;
    }
    }
    }

    // 上書きにより入力規則が消えてしまうため、入力規則を再作成する
    var rule = SpreadsheetApp.newDataValidation().requireValueInRange(inputRange).build();
    editRange.setDataValidation(rule);

    }

    キャンセル

  • 2017/11/04 14:20

    入力可能列を複数列にできるよう、プログラムを修正しました。
    INPUT_COLUMN ⇒ INPUT_COLUMNS に変更し、条件判定時に、単純な == ではなく、 indexOf で INPUT_COLUMNS に存在しているかどうか判定するようにしました。
    (修正箇所は、私の回答の「編集」から確認できます)

    キャンセル

  • 2017/11/07 22:57

    すみません、通知がこなかったため確認が遅れましたm(_ _)m
    修正ありがとうございました!
    無事作りたかったものができました(*^^*)
    本当に助かりました。

    キャンセル

0

GASを使わなくても「条件付き書式」というものを使えばできます。

【条件付き書式|Googleスプレッドシート入門】
http://excel-ubara.com/spreadsheet1/spreadsheet008.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/28 00:03

    セル内すべての文字ではなく、セル内の一部の文字のみ変えたいという質問になりますm(_ _)m
    分かりづらくて申し訳ありません...

    キャンセル

  • 2017/10/28 00:11

    質問文を読みとれていませんでした、すみません。

    キャンセル

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Javaに関する質問
  • Google App Script(GAS)を用いて、Googleスプレッドシート上のセル内の一部のみの文字色変える方法