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

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

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

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

ドキュメント

ドキュメントは、IT用語では、ソフトウェアやハードウェアに関する情報であり、意図された目的、機能性、メインテナンスを含みます。ドキュメントは、多くの様々なフォームとフォーマットに存在しますが、その目的は常に教育することにあります。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1956閲覧

GoogleAppsScript:ドキュメントの文を、スプレッドシートの二次元配列で置換する方法

chi1

総合スコア5

Google Apps Script

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

ドキュメント

ドキュメントは、IT用語では、ソフトウェアやハードウェアに関する情報であり、意図された目的、機能性、メインテナンスを含みます。ドキュメントは、多くの様々なフォームとフォーマットに存在しますが、その目的は常に教育することにあります。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/01/08 10:44

前提・実現したいこと

Googleドキュメントの文章を、
Googleスプレッドシートにつくった変換表に基づいて、
文字列を置換し、置換した文字列の背景色を変えたいと考えています。

変換表は2列100行ほど、
左に検索する文字、右に置換する文字を入れています。

また、上記の処理は、
同一のフォルダ内にあるいくつかのGoogleドキュメントファイル全てに処理するようにしたいと考えています。

発生している問題・エラーメッセージ

下記のコードでエラーが発生、ログも残りませんが、
なぜかフォルダ内の一つのファイルだけ置換、背景色付けの処理がされます。
無効な引数: searchPattern(行 16、ファイル「コード」)

並び変えたり削除したりして分かったのですが、
findTextや、replaceTextの第一引数に
tableValues[i][0]という書き方をするのがよくないようです。
以下の書き方でも同様にエラーが出ました。

for (var i in tableValues) { body.replaceText(tableValues[i][0],tableValues[i][1]);

どのように記述するのがよいのでしょうか。

該当のソースコード

GoogleAppsScript

1function myFunction() { 2 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 3 var sheetTable = spreadsheet.getSheetByName("変換表"); 4 var tableValues = sheetTable.getRange(5,3,sheetTable.getLastRow(),2).getValues(); 5 6 var files =DriveApp.getFolderById('ここにIDを入れました').getFilesByType(MimeType.GOOGLE_DOCS); 7 while (files.hasNext()){ 8 var file = files.next(); 9 var url =file.getUrl(); 10 var body = DocumentApp.openByUrl(url).getBody(); 11 12 var result = null; 13 for (var i in tableValues) { 14 while (result = body.findText(tableValues[i][0],result)){ 15 var text = result.getElement().asText(); 16 text.setBackgroundColor(result.getStartOffset(), result.getEndOffsetInclusive(),'#FF8C00'); 17 //text.setUnderline(result.getStartOffset(), result.getEndOffsetInclusive(),true); 18 } 19 body.replaceText(tableValues[i][0],tableValues[i][1]); 20 } 21 } 22 Logger.log(body.getText()); 23}

試したこと

replaceTextの第一引数に入れる
tableValues[i][0]がよくないのだと思い、
RegExpを使ったものもやってみました。
こちらはエラーなく、
ログを見る限り3つのGoogleドキュメントファイルに処理を行おうとしているようですが、
置換も色変えもされません。

GoogleAppsScript

1function myFunction() { 2 var files =DriveApp.getFolderById('ここにIDを入れました').getFilesByType(MimeType.GOOGLE_DOCS); 3 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 4 var sheetTable = spreadsheet.getSheetByName("変換表"); 5 var tableValues = sheetTable.getRange(5,3,sheetTable.getLastRow(),2).getValues(); 6 while (files.hasNext()){ 7 var file = files.next(); 8 var url =file.getUrl(); 9 var body = DocumentApp.openByUrl(url).getBody(); 10 Logger.log(body.getText()); 11 var str = body.getText() 12 var result = null; 13 for (var i in tableValues) { 14  var regExp = new RegExp( tableValues[i][0], "g" ) ; 15  str.replace(regExp,tableValues[i][1]); 16 }Logger.log(body.getText()); 17 } 18 } 19

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

GAS

1var tableValues = sheetTable.getRange(5,3,sheetTable.getLastRow(),2).getValues();

この部分に問題があります。
getRange()の第3引数はnumRowsで行数です。
sheetTable.getLastRow() - 4としておかないと、最終行以下の空白行が取得されています。
そのため、findTextreplaceTextの第1引数に空文字列が指定され、エラーとなっています。

投稿2020/01/09 00:29

macaron_xxx

総合スコア3191

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

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

chi1

2020/01/09 02:00

エラーが出ていたのは、空文字列が指定されてしまっていたからだったんですね! getLastRow()では見出しなどの行数分、-しないといけないのですね。 丁寧に回答いただき助かりました。有難うございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問