Google 데이터 API를 사용하여 C #으로 Google 스프레드 시트에 액세스


104

Google 스프레드 시트에 단일 시트로 일부 정보가 있습니다. Google 자격 증명과 스프레드 시트 주소를 제공하여 .NET에서이 정보를 읽을 수있는 방법이 있습니까? Google 데이터 API를 사용하는 것이 가능합니까? 궁극적으로 DataTable의 Google 스프레드 시트에서 정보를 가져와야합니다. 내가 어떻게 해? 누군가 시도했다면 pls는 정보를 공유합니다.


답변:


176

.NET 사용자 가이드 에 따르면 :

.NET 클라이언트 라이브러리 다운로드 :

다음 using 문을 추가합니다.

using Google.GData.Client;
using Google.GData.Extensions;
using Google.GData.Spreadsheets;

인증 :

SpreadsheetsService myService = new SpreadsheetsService("exampleCo-exampleApp-1");
myService.setUserCredentials("jo@gmail.com", "mypassword");

스프레드 시트 목록 가져 오기 :

SpreadsheetQuery query = new SpreadsheetQuery();
SpreadsheetFeed feed = myService.Query(query);

Console.WriteLine("Your spreadsheets: ");
foreach (SpreadsheetEntry entry in feed.Entries)
{
    Console.WriteLine(entry.Title.Text);
}

이미 검색 한 SpreadsheetEntry가 주어지면 다음과 같이이 스프레드 시트의 모든 워크 시트 목록을 가져올 수 있습니다.

AtomLink link = entry.Links.FindService(GDataSpreadsheetsNameTable.WorksheetRel, null);

WorksheetQuery query = new WorksheetQuery(link.HRef.ToString());
WorksheetFeed feed = service.Query(query);

foreach (WorksheetEntry worksheet in feed.Entries)
{
    Console.WriteLine(worksheet.Title.Text);
}

그리고 세포 기반 피드를 얻습니다.

AtomLink cellFeedLink = worksheetentry.Links.FindService(GDataSpreadsheetsNameTable.CellRel, null);

CellQuery query = new CellQuery(cellFeedLink.HRef.ToString());
CellFeed feed = service.Query(query);

Console.WriteLine("Cells in this worksheet:");
foreach (CellEntry curCell in feed.Entries)
{
    Console.WriteLine("Row {0}, column {1}: {2}", curCell.Cell.Row,
        curCell.Cell.Column, curCell.Cell.Value);
}

3
new SpreadsheetsService ( " exampleCo-exampleApp-1") 의 문자열 값으로 무엇을 사용해야 합니까? 내가 거기에 넣는 것이 중요합니까? 감사!
Ian Davis

스프레드 시트 목록 가져 오기 : "SpreadsheetQuery query = new SpreadsheetQuery ();" "SpreadsheetFeed feed = myService.Query (query);"를 읽어야합니다. 변경된 문자가 충분하지 않은 편집을 시도했습니다!
SQLBobScot

5
developers.google.com/google-apps/spreadsheets/authorize 중요 : OAuth 1.0은 더 이상 지원되지 않으며 2015 년 5 월 5 일에 사용 중지됩니다. 애플리케이션에서 OAuth 1.0을 사용하는 경우 OAuth 2.0으로 마이그레이션해야합니다. 그렇지 않으면 애플리케이션의 작동이 중지됩니다. .
Kiquenet

1
아래 @wescpy의이 링크는 2016 년 중반 관련 정보를 찾는 데 도움이되었습니다. googleappsdeveloper.blogspot.com/2016/05/…
joon

사용 된 라이브러리가 Google Sheets v3 API를 사용하므로 2020-03-03 이후 작동하지 않습니다. cloud.google.com/blog/products/g-suite/…
Ogglas

22

나는 간단한 래퍼 썼다 주위 구글의 닷넷 클라이언트 라이브러리를 , 그것은 노출 간단한 데이터베이스와 같은 강력한 형식의 기록 유형과 인터페이스. 다음은 몇 가지 샘플 코드입니다.

public class Entity {
    public int IntProp { get; set; }
    public string StringProp { get; set; }
}

var e1 = new Entity { IntProp = 2 };
var e2 = new Entity { StringProp = "hello" };
var client = new DatabaseClient("you@gmail.com", "password");
const string dbName = "IntegrationTests";
Console.WriteLine("Opening or creating database");
db = client.GetDatabase(dbName) ?? client.CreateDatabase(dbName); // databases are spreadsheets
const string tableName = "IntegrationTests";
Console.WriteLine("Opening or creating table");
table = db.GetTable<Entity>(tableName) ?? db.CreateTable<Entity>(tableName); // tables are worksheets
table.DeleteAll();
table.Add(e1);
table.Add(e2);
var r1 = table.Get(1);

Google의 구조화 된 쿼리 연산자로 변환하는 LINQ 공급자도 있습니다 .

var q = from r in table.AsQueryable()
        where r.IntProp > -1000 && r.StringProp == "hello"
        orderby r.IntProp
        select r;

@Kiquenet 무슨 뜻이야? . 마지막으로 내가 Google.GData의 참조 버전 *은 2.2.0이다 nuget.org/packages/Google.GData.Documents
마우 페르


@Kiquenet Google이 .NET 라이브러리를 업데이트하면 알려주세요. 하지만 Google.GData. * 2.2.0은 이미 API v3을 사용하고 있다고 생각합니다.
Mauricio Scheffer

developers.google.com/google-apps/spreadsheets/authorize 중요 : OAuth 1.0은 더 이상 지원되지 않으며 2015 년 5 월 5 일에 사용 중지됩니다. 애플리케이션에서 OAuth 1.0을 사용하는 경우 OAuth 2.0으로 마이그레이션해야합니다. 그렇지 않으면 애플리케이션의 작동이 중지됩니다. .
Kiquenet

17

(2016 년 6 월 -11 월) 질문과 답변은 다음과 같이 구식입니다. 1) GData API 는 이전 세대의 Google API입니다. 모든 GData API가 더 이상 사용되지는 않지만 모든 최신 Google APIGoogle 데이터 프로토콜을 사용 하지 않습니다 . 2) 새로운 Google Sheets API v4 (GData도 아님)가 있습니다.

여기서부터는 .NET 용 Google API 클라이언트 라이브러리 를 가져 와서 이전 API보다 훨씬 강력하고 유연한 최신 Sheets API를 사용해야합니다 . 다음은 시작하는 데 도움이 되는 C # 코드 샘플 입니다. 또한 Sheets API에 대한 .NET 참조 문서.NET Google API 클라이언트 라이브러리 개발자 가이드를 확인 하세요.

Python에 알레르기가없는 경우 (만약 의사 코드 인 척하십시오;)), 필자는 API를 사용하여 배우고 원하는 경우 C #으로 마이그레이션하는 약간 더 길고 "실제"예제로 여러 비디오를 만들었습니다. :


이러한 도구를 Microsoft Excel 파일에 액세스하는데도 사용할 수 있습니까?
afr0

1
안타깝게도 Microsoft와 Google은 모두 공통 표준을 준수하지 않는 경쟁 제품을 만들고 있으므로 Excel 파일에 액세스하려면 자신 만의 도구를 찾아야합니다. Python 개발자라면 python-excel.org 를 확인하세요 . 다른 언어의 경우 해당 커뮤니티를 검색해야합니다. 또는 Drive API를 사용하여 Excel 파일을 Google로 가져온 다음 Sheets API를 사용하여 원하는 작업을 수행 할 수 있습니다. Google API는 다양한 언어를 지원합니다 ... developers.google.com/api-client-library
wescpy

3

여러 가지 방법으로 요청한 작업을 수행 할 수 있습니다.

  1. Google의 스프레드 시트 C # 라이브러리 (Tacoman667의 답변에서와 같이)를 사용하여 각각 이름-값 쌍 목록이있는 행 목록 (Google 용어의 ListEntry)을 반환 할 수있는 ListFeed를 가져옵니다. Google 스프레드 시트 API ( http://code.google.com/apis/spreadsheets/code.html ) 설명서에는 시작하기에 충분한 정보가 있습니다.

  2. 필요한 행 / 열만 가져 오기 위해보다 정교한 (거의 SQL과 유사) 쿼리를 제출할 수있는 Google 시각화 API를 사용합니다.

  3. 스프레드 시트 콘텐츠는 Atom 피드로 반환되므로 XPath 또는 SAX 구문 분석을 사용하여 목록 피드의 콘텐츠를 추출 할 수 있습니다. http://gqlx.twyst.co.za 에는 이런 식으로 수행하는 예제가 있습니다 (Java 및 Javascript에서만 두렵지 만) .


2

이를 위해 Google 코드에 C # SDK / 툴킷이있을 것이라고 확신합니다. 내가 찾은 이 하나 , 그러나 그것의 가치가 주위에 찾아보기를 가진, 그래서 다른 사람이있을 수 있습니다.




2

@Kelly의 가장 많이 찬성 된 답변은 @wescpy가 말한 것처럼 더 이상 유효하지 않습니다. 그러나 2020-03-03 이후에는 사용 된 라이브러리가 Google Sheets v3 API.

Google Sheets v3 API는 2020 년 3 월 3 일에 종료됩니다.

https://developers.google.com/sheets/api/v3

이것은 Google에서 2019-09-10 발표했습니다.

https://cloud.google.com/blog/products/g-suite/migrate-your-apps-use-latest-sheets-api

에 대한 새 코드 샘플 Google Sheets v4 API:

이동

https://developers.google.com/sheets/api/quickstart/dotnet

생성 credentials.json합니다. 그런 다음 Google.Apis.Sheets.v4NuGet을 설치 하고 다음 샘플을 시도합니다.

Unable to parse range: Class Data!A2:E예제 코드 에는 오류 가 있지만 스프레드 시트 에는 오류 가 있습니다. Sheet1!A2:E그러나 내 시트가 이름이 붙여진 이후로 변경되었습니다 . 또한 A2:E.

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;

namespace SheetsQuickstart
{
    class Program
    {
        // If modifying these scopes, delete your previously saved credentials
        // at ~/.credentials/sheets.googleapis.com-dotnet-quickstart.json
        static string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly };
        static string ApplicationName = "Google Sheets API .NET Quickstart";

        static void Main(string[] args)
        {
            UserCredential credential;

            using (var stream =
                new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
            {
                // The file token.json stores the user's access and refresh tokens, and is created
                // automatically when the authorization flow completes for the first time.
                string credPath = "token.json";
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    Scopes,
                    "user",
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
                Console.WriteLine("Credential file saved to: " + credPath);
            }

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

            // Define request parameters.
            String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms";
            String range = "Class Data!A2:E";
            SpreadsheetsResource.ValuesResource.GetRequest request =
                    service.Spreadsheets.Values.Get(spreadsheetId, range);

            // Prints the names and majors of students in a sample spreadsheet:
            // https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
            ValueRange response = request.Execute();
            IList<IList<Object>> values = response.Values;
            if (values != null && values.Count > 0)
            {
                Console.WriteLine("Name, Major");
                foreach (var row in values)
                {
                    // Print columns A and E, which correspond to indices 0 and 4.
                    Console.WriteLine("{0}, {1}", row[0], row[4]);
                }
            }
            else
            {
                Console.WriteLine("No data found.");
            }
            Console.Read();
        }
    }
}

클라이언트 ID / 비밀 및 범위를 지정하지 않아도되는 방법은 무엇입니까? 나는 이미 OAuth 흐름을 수행했고 액세스 토큰과 새로 고침 토큰 (오프라인 모드를 생각해보십시오)을 가지고 있으며이 추가 쓰레기를 원하지 않습니다. 나는 백그라운드 서비스에서도 액세스 권한이없는 oauth 릴레이 서버에 있기 때문에 클라이언트 ID와 클라이언트 비밀에 액세스 할 수 없습니다.
Blake Niemyjski

@BlakeNiemyjski 나머지 API를 직접 사용하십시오. 링크 : developers.google.com/sheets/api/reference/rest
Ogglas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.