Исключение GoogleApiException: параметр «spreadsheetId» отсутствует » исключение при попытке доступа к API Google Таблиц

#unity3d #google-api #google-sheets-api

#unity3d #google-api #google-sheets-api

Вопрос:

Я пытаюсь получить доступ к API Google Таблиц в Unity с помощью этого скрипта:

 using System.Collections.Generic;
using UnityEngine;

using Google.Apis.Auth.OAuth2;
using Google.Apis.Sheets.v4;
using Google.Apis.Services;
using Google.Apis.Sheets.v4.Data;
using System.Security.Cryptography.X509Certificates;

using System.Text;
using TMPro;
public class GoogleSheetsTest : MonoBehaviour
{

 public TextMeshProUGUI text;

 string p12PathFromAsset;

 
 const string sheetNameAndRange = "A!A1:D13";
 const string serviceAccountEmail = "MY_SERVICE_ACCOUNT";
 static SheetsService service;

 private void Awake()
 {
     RequestPath();
 }

 void RequestPath()
 {
     string keyPath = "P12_KEY_LOCATION";
     string realPath;

     if (Application.platform == RuntimePlatform.Android)
     {
         // Android
         string oriPath = System.IO.Path.Combine(Application.streamingAssetsPath, keyPath);

         // Android only use WWW to read file
         WWW reader = new WWW(oriPath);
         while (!reader.isDone) { }

         realPath = Application.persistentDataPath   "P12_KEY_STUFF";
         System.IO.File.WriteAllBytes(realPath, reader.bytes);

         Debug.Log("Running Android");

         p12PathFromAsset = realPath.Replace("p12",".p12");
     }
     else
     {
         // iOS
         p12PathFromAsset = System.IO.Path.Combine(Application.streamingAssetsPath, keyPath);
     }

     SyncData();

 }

 void SyncData()
 {

     var certificate = new X509Certificate2(p12PathFromAsset, "notasecret", X509KeyStorageFlags.Exportable);

     text.text = p12PathFromAsset;

     ServiceAccountCredential credential = new ServiceAccountCredential(
        new ServiceAccountCredential.Initializer(serviceAccountEmail)
        {
            Scopes = new[] { SheetsService.Scope.Spreadsheets }
            /*
             Without this scope, it will :
             GoogleApiException: Google.Apis.Requests.RequestError
             Request had invalid authentication credentials. Expected OAuth 
             2 access token, login cookie or other valid authentication 
             credential.
             lol..
             */
        }.FromCertificate(certificate));

     service = new SheetsService(new BaseClientService.Initializer()
     {
         HttpClientInitializer = credential,
     });

     string spreadsheetid = "MY_SPREADSHEET_ID";
     var request = service.Spreadsheets.Values.Get(spreadsheetid, sheetNameAndRange);

     StringBuilder sb = new StringBuilder();

     ValueRange response = request.Execute();
     IList<IList<object>> values = response.Values;
     if (values != null amp;amp; values.Count > 0)
     {
         foreach (IList<object> row in values)
         {
             foreach (object cell in row)
             {
                 sb.Append(cell.ToString()   " ");
             }

             //Concat the whole row
             Debug.Log(sb.ToString());
             text.text = sb.ToString();

             sb.Clear();
         }
     }
     else
     {
         Debug.Log("No data found.");
     }
 }
    
  

Это относительно простой скрипт, который получает таблицу Google с идентификатором таблицы: MY_SPREADSHEET_ID и разрешает доступ с помощью учетной записи службы Google с помощью ключа p12. «A! A1: D13» — это строки и столбцы таблицы, которые он ищет.

Это отлично работает в редакторе Unity.Ему удается получить местоположение ключа p12 на Android и авторизовать доступ, но он выдает это исключение и не может получить данные электронной таблицы:

2020.10.09 16:42:06.910 6047 6067 Ошибка Исключение Unity GoogleApiException: параметр «spreadsheetId» отсутствует

2020.10.09 16:42:06.910 6047 6067 Ошибка Unity в Google.Apis.Запросы.ClientServiceRequest`1[TResponse].AddParameters (Google.Apis.Запросы.RequestBuilder RequestBuilder, Google.Apis.Запросы.Parameters.ParameterCollection InputParameters) [0x00000] в <000000000000000000000000000000000000>:0

2020.10.09 16:42:06.910 6047 6067 Ошибка Unity в Google.Apis.Запросы.ClientServiceRequest 1[TResponse].CreateBuilder () [0x00000] in <00000000000000000000000000000000>:0 2020.10.09 16:42:06.910 6047 6067 Error Unity at Google.Apis.Requests.ClientServiceRequest 1 [TResponse].CreateRequest (System.Значение Nullable 1[T] overrideGZipEnabled) [0x00000] in <00000000000000000000000000000000>:0 2020.10.09 16:42:06.910 6047 6067 Error Unity at DG.Tweening.TweenCallback 1[T].EndInvoke (System.Результат IAsyncResult) [0x00000] в <000000000000000000000000000000000000>:0

2020.10.09 16:42:06.910 6047 6067 Ошибка Unity в System.Net.Http.Headers.HttpHeaders.setValue [T] (System.Имя строки, значение T, система.Функция `2[T,TResult] toStringConverter) [0x00000] в <000000000000000000000000000000000000>:0

2020.10.09 16:42:06.910 6047 6067 Ошибка Unity в Google.Apis.Запросы.ClientServiceRequest`1[TResponse].ExecuteUnparsedAsync (System.Многопоточность.CancellationToken ca

Я попробовал постоянную строковую переменную для spreadsheetid, избавившись от переменной и просто введя строку в методе, но я не думаю, что проблема связана с идентификатором, поскольку скрипт отлично работает в UnityEditor.

Я в полной растерянности и ценю любую помощь. Заранее спасибо.

Ответ №1:

Оказывается, Google Sheets официально не поддерживается для Unity. Вы можете принудительно использовать надстройку NuGetforUnity, и она будет нормально работать с монопортом ПК, но API может сломаться на разных портах.

Я просто отказался от Sheets и использую Google Firebase для передачи данных. Он полностью поддерживается для Unity и до сих пор работал нормально.