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

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

ただいまの
回答率

88.93%

セル内の部分的な文字装飾(リッチテキスト)を維持して 文字を追加したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 151

sawa

score 996

以下の 画像のような形で セル内の部分的な太字や文字色を維持したまま、セル内のテキストの後ろに文字を追加したいと思っています。

イメージ説明

手動でやる場合は、パソコンからセルをダブルクリックし、文字を貼り付ける(または記入する)か、
正規表現で文末を置換する方法などあり、どちらもマクロの記録を試してみましたが、欲しいコードが得られませんでした。

以下のサイトを参考にコードを作成しましたが、リッチテキストの書式が消えてしまいます。
(テキストをいじらない単純コピーなら リッチテキストは保持される)

Googleドキュメントの body.replaceText() のようなことが出来ればよいのですが、良い方法ありましたらご教授ください。

「出来ない」なら出来ないと教えていただければ助かります。

参考
https://caymezon.com/gas-richtext/

function richcopy(){
  const sheet = SpreadsheetApp.getActiveSheet();
  const Range = sheet.getRange("A1");

  //追加するテキスト
  const Addtext = sheet.getRange("A2").getValue();

  //リッチテキストを取得
  const richtext = Range.getRichTextValue();

  //これだとログが出ない
  console.log(richtext);

  const basetext = Range.getRichTextValue().getText();

  //改行し 追加テキストを後ろに加える
  const newtext = basetext + "\n" + Addtext ;

  console.log(newtext);

  const TargetRange = sheet.getRange("C1");

  //ここが richtext.copy().build(); だとA1が書式維持されるのだが・・・
  const newrichtext = richtext.copy().setText(newtext).build();

  TargetRange.setRichTextValue(newrichtext);

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

一応可能です。流れとしては、

  1. Range.getRichTextValue()でリッチテキストを取得し、
  2. RichTextValue.getRuns()で各スタイル別の部分の配列を取得し、
  3. SpreadsheetApp.newRichTextValue()で新しいリッチテキストビルダーを作成し、
  4. リッチテキストビルダーに新しいテキストとスタイルを設定し、
  5. Range.setRichTextValue()でリッチテキストを設定する。
function myFunction() {
    const sheet = SpreadsheetApp.getActiveSheet();

    const value = sheet.getRange(1, 1).getRichTextValue();

    const text = value.getText() + "\nこれを改行した後ろに追加。";
    const builder = SpreadsheetApp.newRichTextValue();
    builder.setText(text);

    value.getRuns().forEach(run => {
      const startOffset = run.getStartIndex();
      const endOffset = run.getEndIndex() ;
      const style = run.getTextStyle();
      builder.setTextStyle(startOffset, endOffset, style);
    });

    const newValue = builder.build();

    sheet.getRange(1, 2).setRichTextValue(newValue);
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/08 12:46

    もっといい方法あっても良さそうですが。
    単純に追記するような方法やRichTextValueの配列(run)を直接RichTextValueBuilderに追加するメソッドはなさそうなんですよね。

    キャンセル

  • 2020/07/08 13:11

    ありがとうございます。回答の記述方法で、やりたかったことが出来るようになりました。
    追加や置き換えって感じではなくて、再構築するような手間のかかる処理なんですね。
    RichTextValue.getRuns() は、公式リファレンス見てもよくわからずでしたので、自分一人じゃ使い方がわからないままだったと思います。勉強になりました。

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る