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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

5012閲覧

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

sawa

総合スコア3002

Google スプレッドシート

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

Google Apps Script

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

1グッド

1クリップ

投稿2020/07/08 01:42

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

イメージ説明

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

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

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

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

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

GAS

1function richcopy(){ 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 const Range = sheet.getRange("A1"); 4 5 //追加するテキスト 6 const Addtext = sheet.getRange("A2").getValue(); 7 8 //リッチテキストを取得 9 const richtext = Range.getRichTextValue(); 10 11 //これだとログが出ない 12 console.log(richtext); 13 14 const basetext = Range.getRichTextValue().getText(); 15 16 //改行し 追加テキストを後ろに加える 17 const newtext = basetext + "\n" + Addtext ; 18 19 console.log(newtext); 20 21 const TargetRange = sheet.getRange("C1"); 22 23 //ここが richtext.copy().build(); だとA1が書式維持されるのだが・・・ 24 const newrichtext = richtext.copy().setText(newtext).build(); 25 26 TargetRange.setRichTextValue(newrichtext); 27 28}
mbcztpw👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

JavaScript

1function myFunction() { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 4 const value = sheet.getRange(1, 1).getRichTextValue(); 5 6 const text = value.getText() + "\nこれを改行した後ろに追加。"; 7 const builder = SpreadsheetApp.newRichTextValue(); 8 builder.setText(text); 9 10 value.getRuns().forEach(run => { 11 const startOffset = run.getStartIndex(); 12 const endOffset = run.getEndIndex() ; 13 const style = run.getTextStyle(); 14 builder.setTextStyle(startOffset, endOffset, style); 15 }); 16 17 const newValue = builder.build(); 18 19 sheet.getRange(1, 2).setRichTextValue(newValue); 20}

投稿2020/07/08 03:43

draq

総合スコア2573

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

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

draq

2020/07/08 03:46

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

2020/07/08 04:11

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問