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

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

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

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

9962閲覧

UnityでArgumentException: JSON parse error: Invalid value.とエラー

Jejeje

総合スコア38

Google スプレッドシート

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/05/06 14:26

編集2021/05/11 07:43

やりたいこと

UnityでGASを使用してGoogleスプレッドシートから値を取得しようと思いました。
実現したいことはスプレッドシート内にあるセルの値を一つ取得するということです。

スマホアプリをリリースしていて新バージョンをリリースした時に現バージョンとGoogleスプレッドシート内に記入してあるバージョンを比較してもしバージョンが古ければ更新を促すということをしようと思いこれに至りました。

やってみたこと

以下の記事リンク内容
をそのまま拝借してUnityで実行してみました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using System.Text; 4using UnityEngine.Networking; 5using UnityEngine; 6 7 8public class GASTest : MonoBehaviour 9{ 10 string URI = "https://script.google.com/macros/s/AKfycbwn3jshQvlBsq-ZThWh5Zok_mi8DhaSRI6uUXrliEm7R0vAYkRcAX0Yb4Oyrk3dtGkAIA/exec"; 11 12 private void Start() 13 { 14 StartCoroutine(Get()); 15 } 16 17 public IEnumerator Get() 18 { 19 int point = 10; 20 UnityWebRequest request = UnityWebRequest.Get($"{URI}?point={point}"); 21 22 yield return request.SendWebRequest(); 23 24 if (request.isHttpError || request.isNetworkError) 25 { 26 Debug.Log(request.error); 27 } 28 else 29 { 30 var result = request.downloadHandler.text; 31 var response = JsonUtility.FromJson<ResponseData>(result); 32 Debug.Log(response.key); // 0 33 } 34 } 35 36 [System.Serializable] 37 public class ResponseData 38 { 39 public int key; 40 } 41}

エラー

以下の記事リンク内容
をそのまま拝借して実行してみたのですがUnityで

C#

1ArgumentException: JSON parse error: Invalid value. 2UnityEngine.JsonUtility.FromJson (System.String json, System.Type type) (at /Users/bokken/buildslave/unity/build/Modules/JSONSerialize/Public/JsonUtility.bindings.cs:42) 3UnityEngine.JsonUtility.FromJson[T] (System.String json) (at /Users/bokken/buildslave/unity/build/Modules/JSONSerialize/Public/JsonUtility.bindings.cs:30) 4GASTest+<Get>d__2.MoveNext () (at Assets/C#/Other/GASTest.cs:31) 5UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/Coroutines.cs:17)

といったエラーが表示されてしまいます。

ここが問題のようです。↓

C#

1var response = JsonUtility.FromJson<ResponseData>(result);

プログラミング経験はUnityでしかなく、一からJavaを勉強したいところなのですが緊急を要していることのため出来れば解決方法を教えていただきたいです。

追記

Debug.Logでresultの中身を確認してみました。

var result = request.downloadHandler.text; Debug.Log(result);

結果resultの中身は以下のように表示されました。

<!DOCTYPE html><html><head><link rel="shortcut icon" href="//ssl.gstatic.com/docs/script/images/favicon.ico"><title>エラー</title><style type="text/css" nonce="YiUDz9WwGp8ADq1djaBIjQ">body {background-color: #fff; margin: 0; padding: 0;}.errorMessage {font-family: Arial,sans-serif; font-size: 12pt; font-weight: bold; line-height: 150%; padding-top: 25px;}</style></head><body style="margin:20px"><div><img alt="Google Apps Script" src="//ssl.gstatic.com/docs/script/images/logo.png"></div><div style="text-align:center;font-family:monospace;margin:50px auto 0;max-width:600px">スクリプト関数が見つかりません: doGet</div></body></html> UnityEngine.Debug:Log(Object) <Get>d__3:MoveNext() (at Assets/C#/Other/GASTest.cs:32) UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr) (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/Coroutines.cs:17)

スクリプト関数が見つかりません: doGet と表示されますがスプレッドシートのスクリプトエディタにはしっかりdoGet関数をかけているように見えます。なぜこのようなエラーが起こるのでしょうか。

GAS↓ //function myFunction()はテスト用です

function myFunction() { var sheetID = "1ErZm_pEtjrYavDzlbuAdf60z4vLq57MSAtlVfUDcazA"; // スプレッドシートから値を取得する var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); //現在のシートを取得 var sheet = spreadsheet.getActiveSheet();  // シートの最後の列数を取得 var lastRow = sheet.getLastRow(); Logger.log(lastRow); //3. 指定するセルの範囲(A1)を取得 var range = sheet.getRange(2,1); //4. 値を取得する var value = range.getValues(); Logger.log(value); } function doGet(e){ // 「url?point=10」というGETメソッドなら10が格納される const point = e.parameter.point; // データを加工しありスプレッドシートを操作したり const value = 0; // レスポンスとしてJsonを返す const response = JSON.stringify({key: value}); let output = ContentService.createTextOutput(); output.setMimeType(ContentService.MimeType.JSON); output.setContent(response); return output; }

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

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

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

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

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

itagagaki

2021/05/06 15:15

JSON pparse error: Invalid value. ということはJSONデータが疑われるわけですよね。 var result = request.downloadHandler.text; Debug.Log(result); var response = JsonUtility.FromJson<ResponseData>(result); でJSONデータを確認してみては? それでわからなければ、このログ出力を質問に加えてください。 質問は編集できます。
Jejeje

2021/05/06 16:10

追記しました。 すみません、本当に無知なものでもしよければ教えていただけないでしょうか。
K_3578

2021/05/08 00:35

Javaタグは関係ありますかね?これ。 多分JavaScriptと勘違いされているかと
Jejeje

2021/05/11 07:43

ありがとうございます。タグ変更しました。
guest

回答1

0

ベストアンサー

リクエストしている https://script.google.com/macros/s/AKfycbwn3jshQvlBsq-ZThWh5Zok_mi8DhaSRI6uUXrliEm7R0vAYkRcAX0Yb4Oyrk3dtGkAIA/exec にブラウザでアクセスすると、JSONは返されず、エラーページが表示されますね。
したがってresultにはそのエラーページのHTMLコードが入っています。
これはJSONではないのでJsonUtility.FromJson<ResponseData>(result);の実行はエラーになります。
起こっているのは、そういうことです。

ではなぜJSONが返されずエラーページが表示されたかというと、ブラウザで確認すると「スクリプト関数が見つかりません: doGet」と表示されています。つまりGASスクリプトでdoGetが無いということです。GASスクリプトを確認してください。そしてGASスクリプトを修正したらブラウザでリクエストURLを開いてJSONが返されることを確認するようにしてください。

投稿2021/05/06 23:22

編集2021/05/06 23:29
itagagaki

総合スコア8402

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

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

Jejeje

2021/05/07 10:03

回答ありがとうございます。 追記しました。doGet関数は欠けているように見えるのですがこれではいけないのでしょうか?
itagagaki

2021/05/07 10:29

「プロジェクトを保存」してからデプロイしましたか?
Jejeje

2021/05/07 21:24

スクリプトを変更するたびに新しくデプロイする必要があったのですね。新しくデプロイを作成して実行したしたらエラーが消えました。 ただ値のみを取得する方法がわかりません。 GASのconst response = JSON.stringify({key: value}); のvalueの値(1.0.2とする)はUnityに持ってくることができたのですが Unity上では{"key":[["1.0.2"]]}と表示されてしまいます。 GAS上でkey:を削除すればvalueだけ持ってこれるのではないかと思いましたエラーが出ました。
itagagaki

2021/05/07 22:41

JsonUtility.FromJson<ResponseData>(result); してますけど ResponseData の定義はどうなってます? Class ResponseData { public string key; } という具合に定義されていないといけませんよね?
Jejeje

2021/05/11 08:22

GASの方でconst response = JSON.stringify(value);としていたのをconst response = value;にした結果Unityのvar result = request.downloadHandler.text;で1.0.2のみを取得できました・ しかし Unityの var response = JsonUtility.FromJson<ResponseData>(result); の行で ArgumentException: JSON parse error: The document root must not follow by other values. といったエラーが表示されてしまいます。 一応スプレッドシート内のセル値を取得できているので良いのでしょうか? このJsonUtility.FromJson<ResponseData>(result); という処理はどのような意味があるのでしょうか ArgumentException: JSON parse error: The document root must not follow by other values.
itagagaki

2021/05/11 10:08

それは単純にGASで文字列 "1.0.2" を出力したのをUnityで受け取っただけですよね。 そもそもJSONでデータを受け渡す必要はなかったということですかね? もしJSONをご存じなかったのなら(そして興味があれば)「JSONとは」を調べてください。
Jejeje

2021/05/21 08:02

すみません、ひとつだけよろしいでしょうか。 文字列などの値のみ受け取るのと、 JSONデータで受け取るのではどういった違いがあるのでしょうか。
itagagaki

2021/05/21 09:04

文字列でやり取りできるのは、あくまでも単一の文字列ですよね。 対して、JSONは、うんと簡単に言えば、その中にたくさんのデータを抱えることができます。 そこには、文字列、数値、それらの配列、あるいはオブジェクトといったものが含まれます。 JSONとは、そういったたくさんのデータおよびデータ構造を文字列の中に表現する記法です。
Jejeje

2021/05/21 17:43

JSONで受け取るとなるとやはりこのエラー(タイトルに書いたエラー)を直す以外に道はなさそうですね。。。 うーん何が原因なのでしょうか。 GASからUnityに持ってくるデータを1つのセルの値からシート全体に変えてみたらエラー内容が ArgumentException: JSON parse error: The document root must not follow by other values. と少し変わったのですがなにか心当たりありますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問