C# Консоль не может считывать данные Google листов в список в программе - PullRequest
1 голос
/ 31 марта 2020

Я работаю над консольным поисковым инструментом для «Варрантов» в игре, в которую я играю, которая выполняет поиск по листу Google из API листов Google и C#. Первоначально я сделал это на python, и он работал отлично, но у меня было много проблем с распространением моего python файла, поэтому я перешел на C#.

API вызывает данные отлично, и я Я могу представить список всех данных, которые я искал при запуске, но когда я пытаюсь сохранить их в списке файлов внутри моей программы, я получаю следующее: Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.

Я также добавил в раздел, который говорит мне тип данных, который я вызываю с строкой [1], и он говорит (только один "` `` ", пришлось удвоить для форматирования): System.Collections.Generic.List``1[System.Object]

using Google.Apis.Auth.OAuth2;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using Google.Apis.Services;
using Google.Apis.Util.Store;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Diagnostics;

namespace WarrantSearchProgram
{
    class Program
    {
        static readonly string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly };
        static readonly string ApplicationName = "WarrantSearchProgram";
        static readonly string SpreadsheetId = "SpreadsheetId";
        static readonly string sheet = "Imported Data";
        static SheetsService service;

        //List of Warrant Column Variables... Only nameList is being used for now
        public static IList<object> testOBJ;
        public static List<object> wtStatus;
        public static List<object> wtType;
        public static List<object> wtNum;
        public static IList<object> nameList;
        public static List<object> wtCivName;
        public static List<object> wtDOB;
        public static List<object> wtAddress;
        public static List<object> wtJs;
        public static List<object> wtCharges;
        public static List<object> wtEvidence;
        public static List<object> wtReqOfc;
        public static List<object> wtReqOfcNum;
        static void Main(string[] args)
        {
            //Set console color and other general settings
            Console.Title = "DOJ Warrant Search Program UNOFFICIAL";
            Console.BackgroundColor = ConsoleColor.Black;
            Console.ForegroundColor = ConsoleColor.Green;

            // Initialization of creds and google sheets
            GoogleCredential credential;

            using (var stream = new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
            {
                credential = GoogleCredential.FromStream(stream)
                    .CreateScoped(Scopes);
            }

            // Create Google Sheets API service.
            service = new SheetsService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = ApplicationName,
            });

            //First initilization of warrant sheet info, creates and manages variables.
            UpdateSheetData();

            while (true)
            {
                // Main repeating text and SEARCH INPUT
                Console.WriteLine("-----------------------------------------------");
                Console.WriteLine("Please type in a full name to search for warrants.");
                Console.WriteLine("Only ACTIVE warrants will be shown.");
                Console.WriteLine("Type in a warrant number to show extra info, including evidence, on just that warrant");
                Console.WriteLine("-----------------------------------------------");
                Console.Write("Search >>> ");
                string searchName = Console.ReadLine();
                searchName = searchName.ToUpper();
                Console.WriteLine();
                Console.Beep();
                Console.Clear();
            }

        }
        static void UpdateSheetData()
        {

        var range = $"{sheet}!A:F";
            SpreadsheetsResource.ValuesResource.GetRequest request =
                    service.Spreadsheets.Values.Get(SpreadsheetId, range);

            var response = request.Execute();
            IList<IList<object>> values = response.Values;

            if (values != null && values.Count > 0)
            {
                foreach (var row in values)
                {
                    // Calls the row (2nd, name) and displays each name in list
                    Console.WriteLine("{0}", row[1]);
                    Console.WriteLine(row.GetType().ToString());

                    // Attempts to build list of names in program ERROR HERE
                    nameList.Add(row[1]);

                }

            }
            else
            {
                Console.WriteLine("No data found.");
            }
        }
    }
}

Я удалил части кода, которые не имеет ничего общего с этим, так что его легче читать ... Как вы можете сказать, я пробовал IList<object>, List<object>, and List<string> в разное время, и у меня не получилось.

Моя цель здесь - загрузить каждый столбец данных в список, который я затем могу выполнять поиск, индексировать и отображать совпадающие данные из других списков. Это все не очень сложно сделать, когда я могу загрузить данные в программу и разделить их. ошибка в строке 98

1 Ответ

2 голосов
/ 31 марта 2020

Согласно вашему комментарию, в строке 98 вы пытаетесь Add указать значение nameList, которое не может быть инициализировано. Вот почему вы получаете сообщение об ошибке: Object reference not set to an instance of an object. - nameList не был инициирован, поэтому вы не можете вызывать его внутренние функции. Возможно, вы захотите создать его, в любом месте, прежде чем позвонить UpdateSheetData, например:

nameList = new List<object>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...