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

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

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

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

JavaScript

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

Q&A

3回答

361閲覧

正規表現を含んだ文字列の置換を実行するJavascriptコードのGASへの移植について

shirokuroko

総合スコア0

Google Apps Script

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

JavaScript

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

0グッド

1クリップ

投稿2024/02/05 11:13

編集2024/02/05 16:10

実現したいこと

forループを用いた単純な文字列全置換による英文の浄書を行いたいです。具体的な動作のイメージは以下の通りです。

1:1 Here is an big tree.
1:2 This tree was planted in the time I was born.
1:3 My paternal grandfather planted this tree.
1:4 Today I tell about him.
2:1 He was born in 1921 as the third-eldest son among 9 children.
2:2 The village he raised up was so misery and he couldn't inherit the wealth of his family because there was the custom that the eldest son inherit all wealths in the country he was born.
2:3 Thus he decided to emigrate to The U.S at 18 years old.

 Here is an big tree. This tree was planted in the time I was born. My paternal grandfather planted this tree. Today I tell about him.

 He was born in 1921 as the third-eldest son among 9 children in the rural village of northeast Japan. The village he raised up was so misery and he couldn't inherit the wealth of his family because there was the custom that the eldest son inherit all wealths in Japan at that time. Thus he decided to emigrate to The U.S at 18 years old.

発生している問題

PCのメモ編集アプリ(Mery)で用いていたJavaScriptのコード(動作確認問題なし)をGASの Googleドキュメントで用いようと移植を試みたところ、GASとGoogleドキュメントの連携がうまくいきません。具体的には、GASで打った文字列置換のコードがGoogleドキュメントに反映されず、ビクともしておりません。

JavaScriptコード(動作は問題なし)

Javascript

1document.selection.SelectAll(); 2 3var paragragh_MAX = 21; 4var sentence_MAX = 21; 5 6for (var i = paragragh_MAX; i>0; i--) { 7 for (var j = sentence_MAX ; j>1; j--) { 8 document.selection.Replace("\n"+i+":"+j,"",meFindReplaceRegExp|meReplaceAll); //(※1) 9 10 } 11} 12 13for (var i = paragragh_MAX; i>0; i--) { 14 document.selection.Replace(i+":1","",meFindReplaceRegExp|meReplaceAll); 15} 16

GASコード(Googleドキュメントで)

GAS

1function myFunction() { 2 3 4 var doc = DocumentApp.openById('特定のドキュメントID'); 5 var body = doc.getBody(); 6 var text = body.getText();//(※2) 7 8 9 var paragragh_MAX = 13; 10 var sentence_MAX = 6; 11 var replacement = ""; 12 13 14 for (var i = paragragh_MAX; i>0; i--) { 15 for (var j = sentence_MAX ; j>1; j--) { 16 var pattern ="\\n"+i+":"+j; 17 var regex = new RegExp(pattern, 'g'); //(※3) 18 var newText = text.replaceText(regex.source, replacement) //(※4) 19 } 20 } 21 // 変更されたテキストをドキュメントに設定 22 body.setText(newText); 23 24} 25

コード上の補足事項

●Javascript
(※1) メソッドはアプリ(Mery)独自のもの。

●GASコード
(※2) Textを取得せずに、replaceを用いた場合、全ての文字列が削除されて、「bodysection」と言った文字列が出るだけとなりました。
(※3) 正規表現を操作するメソッドを用いず、元コード同様""と言う文字列を置換する形式でもできませんでした。
(※4) bodyからTextオブジェクトを取得して、replaceTextを用いる方法を用いても出来ませんでした。

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

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

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

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

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

guest

回答3

0

移植というご質問への回答になっているかどうかわかりませんが、
実行結果はご希望のとおりになりますでしょうか。

replaceTextで改行を超えた正規表現の検索ができるかどうか不明でしたので、
プレーンテキストの方から multiple line オプション付きの正規表現で検索し、
マッチした文字列の位置情報を配列に蓄積しておいて、
文字の色やフォントサイズなどの書式情報が維持されるように
文字列の削除は、リッチテキストの方で行うスクリプトです。

JavaScript

1// 段落番号と文番号を削除して一段落にする 2function deleteParagraphAndSentenceNumbers() { 3 // 初期設定 4 const maxParagragh = 13; 5 const maxSentence = 6; 6 const indentPoint = 11; // インデントをポイントで指定 7 // const indentSpace = ' '; // 空白2個でインデントする場合 8 const doc = DocumentApp.openById(特定のドキュメントID); 9 const body = doc.getBody(); 10 const text = body.editAsText(); 11 const planeText = text.getText(); 12 13 // 削除すべき位置を蓄積 14 let indexes = []; //[削除開始位置, 削除終了位置] 15 for (let i = 1; i <= maxParagragh; i++) { 16 for (let j = 1; j <= maxSentence; j++) { 17 const pattern = j == 1 ? `${i}:${1} ` : `\\n${i}:${j}`; 18 const addLength = pattern.length - (j == 1 ? 1 : 2); 19 const regEx = new RegExp(pattern, 'gm'); 20 const match = planeText.matchAll(regEx); 21 for (const m of match) { 22 indexes.push([m.index, m.index + addLength]); 23 } 24 } 25 } 26 27 // 位置情報を降順に並び替え 28 indexes.sort((a, b) => b[0] - a[0]); 29 30 // リッチテキストを編集(削除) 31 indexes.forEach(ix => text.deleteText(ix[0], ix[1])); 32 33 // 段落の先頭をインデント 34 const paragraphs = body.getParagraphs(); 35 paragraphs.forEach(p => p.setIndentFirstLine(indentPoint)); // ポイント指定のインデントを設定 36 // paragraphs.forEach(p => p.insertText(0, indentSpace)); // 空白でインデントする場合 37}

投稿2024/02/06 10:46

編集2024/02/07 00:55
YellowGreen

総合スコア731

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

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

YellowGreen

2024/02/06 21:50

念のためですが、変更(削除)は、本文に反映されていますので、bodyに書き戻す必要はありません。
guest

0

text.replaceText(...)ですが、textbody.getText()ですから文字列ですので、.replaceText()は存在しないと思います。おそらくエラーメッセージが出ているはずですから、確認してみてください。


bodyからTextオブジェクトを取得して、replaceTextを用いる方法を用いても出来ませんでした

この場合、.replaceText()は存在しますが、この戻り値は Element オブジェクトになるようです。
https://developers.google.com/apps-script/reference/document/text?hl=ja#replaceText(String,String)

その後のbody.setText(...)は引数に文字列を取りますから、おそらく思うような結果にならないのではないかと思います。(※2)についても同様の原因です。
https://developers.google.com/apps-script/reference/document/body?hl=ja#setText(String)


なお、現在のコードですがnewTextがドキュメントに戻される前にループごとに新しく上書きされていますから、一番最後の置換しか有効ではないのではないかな、と思うところです。

投稿2024/02/06 02:33

Lhankor_Mhy

総合スコア36057

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

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

0

GASのコードの18行目を

GAS

1text.replaceText(regex.source, replacement)

に変えてみてはいかがでしょうか?

投稿2024/02/05 11:28

scarlet_0626

総合スコア2

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

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

shirokuroko

2024/02/05 16:11

ありがとうございます。そちらも試しましたが、上手く行きません。また補足事項を加えましたので、ご参照下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問