質問するログイン新規登録

Q&A

1回答

238閲覧

ExcelのOffice Script でJSONをパースしようとしたが正常に動作しない

gatolife

総合スコア3

0グッド

0クリップ

投稿2025/11/24 00:08

0

0

Office Scriptにて以下のようなJSONの文字列をセルから取得し、パースしようとしたのですが、JSON Parse error: Unrecognized token '\'というエラーが発生してしまい、うまく動作しませんでした。
どのように対処すればよいのでしょうか?

text

1\n{"a": "test", "b": "test"}

コード内で直接JSONの文字列を扱った場合には問題なく動作したのですが、ExcelのセルからJSONの文字列を取得したうえでJSONパースを行うとうまく動作しないようです...
なおJSONの文字列に\nが含まれない場合はセルから取得するか否かに関わらず、正常に動作しました
\nに原因がありそうです

typescript

1// うまくいったパターン 2function main(workbook: ExcelScript.Workbook) { 3 const parsedText = JSON.parse(`\n{"a": "test", "b": "test"}`) as string; 4 console.log(parsedText) 5} 6 7// うまくいかなかったパターン 8function main(workbook: ExcelScript.Workbook) { 9 const sheet = workbook.getActiveWorksheet(); 10 const cellValue = sheet.getRange("A1").getText(); 11 const parsedText = JSON.parse(cellValue) as string; 12 console.log(parsedText) 13} 14 15

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

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

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

guest

回答1

0

文字列リテラルの中での\nは「改行」を表し、「改行」は「うまくいったパターン」でお書きのその場所にあってもJSON的には無視されるだけです。
エラーメッセージからすると、セルの中の先頭には「改行」でなく\nという文字列をそのまま書いちゃっているのでしょうね。
それだとJSONじゃないので、JSONとしてパースしようとするとそういうエラーになります。
「うまくいったパターン」の\n\\nに書き換えると、「改行」でなく「\nという文字列」になるので「うまくいかなかったパターン」と同じエラーになります。

暫定対応(対症療法)としては、
「前段処理の都合で、セルの先頭に\nという文字列が入ることがある」なら、「セル先頭の\nを削除してからパースする」でしょう。
あるいは「セルのあちこちに改行のつもりの\nが入っている。それ以外には\nは無い」なら、「セル内すべての\nを削除してからパースする」でしょうが、「セルのあちこちに改行のつもりの\nが入っている。それ以外にJSON内の文字列リテラルの中にもJSONとして正当な\nはある」だと、JSONとして不正な\nと正当な\nを見分けないといけないので面倒です。

本格対応としては、
前段処理を修正して、セル内にJSONとして不正な\nという文字列が入ることが無いようにすることです。

投稿2025/11/25 09:12

otn

総合スコア86482

gatolife

2025/11/26 13:57

ご回答ありがとうございます! おっしゃる通り、\nを削除してパースしてみたところ、正常に動くようになりました! 1つだけ確認させていただきたいのですが、Excelのセル上で `\n`と表記されていた場合、それは内部的には(という表現が適切かはわかりませんが...)`\\n`というデータとして扱われているという認識で間違いないでしょうか?
otn

2025/11/26 14:22 編集

> Excelのセル上で `\n`と表記されていた場合 その場合、内部的には「\」と「n」とからなる2文字です。 各種プログラミング言語では、文字列リテラルの中に「\」を書くときは「\\」と書くことになっている文法が普通です。Office Scriptもそうです。そこでは『「\」と「n」とからなる2文字』は、「\\n」と書きます。それらのプログラミング言語では文字列リテラルの中に「\n」と書くと、「\」と「n」とからなる2文字ではなくて、「改行を表す1文字(文字コードは16進だと0A、10進で10)」を意味します。 こういうのは、プログラミングにきちんと入門すると、最初の方で学ぶはずです。 データの中身(内部表現)と、それをプログラムの文字面でどう書くかは別の話です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問