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

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

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

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

Q&A

解決済

1回答

905閲覧

GAS:replaceText()で置換されない

akiaki-t

総合スコア20

Google Apps Script

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

0グッド

1クリップ

投稿2023/06/15 23:32

実現したいこと

GAS(GoogleAppScript)で
Google Spread Sheetから日付(YYYY年M月D日)を取得し、
Google Document内の指定文字列をreplaceText()で当該日付に置換したいが、置換されません。

docText.replaceText(targetWord,replaceword);
を実行するとエラーにならず処理を通過します。

Google Documentの文字数は6530文字です。
文字数制限があるのかなとも思いましたが、Google検索ではそういった情報は無いようでした。

該当のソースコード

Google

1// targetWord = 【開始年月日(〇〇年〇〇月〇〇日)】 2targetWord = targetSheet.getRange(TargetWordRow,c).getValue().toString(); 3 4// replaceword = Wed Aug 15 2012 00:00:00 GMT+0900 (GMT+09:00) 5// を2012年8月15日にする 6replaceWord = Utilities.formatDate(replaceWord, 'Asia/Tokyo','yyyy年M月d日'); 7 8// ドキュメントファイルを置換したいが置換されず、エラーが出ずに次の行に進む。 9 docText.replaceText(targetWord,replaceWord);

試したこと

docText.replaceText("【開始年月日(〇〇年〇〇月〇〇日)】",replaceWord);
docText.replaceText('【開始年月日(〇〇年〇〇月〇〇日)】',replaceWord);
docText.replaceText(targetWord,"2012年8月15日");
docText.replaceText(targetWord,'2012年8月15日');

replaceWord = replaceWord.toString();

上記試しても同様にエラーにならず置換されもしませんでした。

なお、他の文字列(targetword = 【タイトル】, repalceword = "過去プロジェクトについて" )の場合は問題なく置換されます。

よろしくお願いいたします。

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

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

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

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

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

YellowGreen

2023/06/16 00:23 編集

7行目に console.log('target: ' + targetWord + ' replace: ' + replaceWord); を入力して変数の値を比較してみましたか? 特にtargetWordの値が文書と合っているかどうか?(記号や数字の半角全角などです。文書の方が全角文字とかの可能性が高いですが。)
akiaki-t

2023/06/16 00:36 編集

はい比較しました。 var objType = Object.prototype.toString.call(targetWord); var objType = Object.prototype.toString.call(replaceWord); でデータ型もString型であること確認しました。 >targetword = 【放送開始年月(〇〇月〇〇日)】, データ型:[object String] >replaceWord = 2012年8月15日データ型:[object String] targetWordは、GoogleDocumentでCtrl +Fでヒットします。 サクラエディタでも、スプレッドシートとドキュメントのものを並べてCtrl+Fし、合致しました。
YellowGreen

2023/06/16 00:35

提示のコードは、放送の2文字がないですが単なるミスですか?
akiaki-t

2023/06/16 00:37 編集

転記ミスです、失礼しました。 放送の2文字はあってもなくても変わらない(私が気を付ければ良い)ので、下記に読み替えてください。 >targetword = 【開始年月(〇〇月〇〇日)】, データ型:[object String] >replaceWord = 2012年8月15日データ型:[object String]
YellowGreen

2023/06/16 00:52

ドキュメントとスプレッドシートを作成して追試してみました。 文書もコードも手入力したためか最初は置換に失敗しましたが、 間違いのないように文書の方からコピペでコードに【放送開始年月日(⚪︎⚪︎月⚪︎⚪︎日)】を貼り付けてから、再度試行したところ、2012年8月15日に置換されました。
guest

回答1

0

ベストアンサー

おそらく原因がわかりました。
replaseText()の構文は、
replaceText(searchPattern, replacement) です。
最初の引数も2番目の引数も文字列ですが、
最初の引数の文字列は正規表現(/と/との間の部分)として解釈されますので、
半角の括弧が正規表現として扱われているからだと考えられます。
私の試行では、括弧が全角だったので置換できたようです。

解決方法としては、targetWordを
セルの値なら【放送開始年月日\(◯◯月◯◯日\)】
コードの中の文字列なら '【放送開始年月日\\(◯◯月◯◯日\\)】'
のように括弧をエスケープすることになります。

投稿2023/06/16 01:53

編集2023/06/16 01:54
YellowGreen

総合スコア861

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

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

akiaki-t

2023/06/16 02:26 編集

仰るように修正したら期待どおり動きました! docText.replaceText("【放送開始年月\\(〇〇月〇〇日\\)】", replaceWord); わざわざ【放送】の2文字を付けてくださってありがとうございます。 正規表現の一覧ページでGoogle検索して、半角()が見当たらなかったので(さらっとしか探さなかったのが悪い)、その可能性は除外してました。 おかげさまで何日も悩んでたのが解消されました。 検証までしていただいて、感謝です。
YellowGreen

2023/06/16 02:25

お役に立ててよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問