やりたいこと
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; }
回答1件
あなたの回答
tips
プレビュー