Truy cập Bảng tính Google với C # bằng API dữ liệu của Google


104

Tôi có một số thông tin trong Bảng tính Google dưới dạng một trang tính. Có cách nào mà tôi có thể đọc thông tin này từ .NET bằng cách cung cấp thông tin xác thực và địa chỉ bảng tính của google. Có thể sử dụng API dữ liệu của Google không. Cuối cùng thì tôi cần lấy thông tin từ bảng tính Google trong DataTable. Tôi làm nó như thế nào? Nếu ai đó đã thử nó, xin chia sẻ một số thông tin.


kiểm tra câu trả lời của tôi stackoverflow.com/questions/48432846/…
Mike Darwish

Câu trả lời:


176

Theo hướng dẫn sử dụng .NET :

Tải xuống thư viện máy khách .NET :

Thêm các câu lệnh này bằng cách sử dụng:

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

Xác thực:

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

Nhận danh sách các bảng tính:

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

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

Đưa ra một Bảng tính Thử bạn đã truy xuất, bạn có thể nhận được danh sách tất cả các trang tính trong bảng tính này như sau:

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);
}

Và nhận nguồn cấp dữ liệu dựa trên ô:

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
Tôi nên sử dụng giá trị chuỗi nào cho SpreadsheetsService mới (" exampleCo-exampleApp-1")? nó có quan trọng những gì tôi đặt trong đó? Cảm ơn!
Ian Davis

Nhận danh sách các bảng tính: "Truy vấn SpreadsheetQuery = new SpreadsheetQuery ();" nên đọc "Nguồn cấp dữ liệu SpreadsheetFeed = myService.Query (truy vấn);" Đã cố gắng chỉnh sửa nhưng không đủ ký tự được thay đổi!
SQLBobScot

5
developers.google.com/google-apps/spreadsheets/authorize Chú ý: OAuth 1.0 không còn được hỗ trợ và sẽ bị tắt vào tháng 5 năm 2015. Nếu sử dụng ứng dụng của bạn OAuth 1.0, bạn phải di chuyển sang OAuth 2.0 hoặc ứng dụng của bạn sẽ chấm dứt hoạt động .
Kiquenet

1
liên kết này, từ @wescpy bên dưới, đã giúp tôi tìm thêm thông tin liên quan cho giữa năm 2016: googleappsdeveloper.blogspot.com/2016/05/…
joon

Sẽ không hoạt động sau năm 2020-03-03 vì thư viện được sử dụng sử dụng API Google Trang tính v3 cloud.google.com/blog/products/g-suite/…
Ogglas

22

Tôi đã viết một trình bao bọc đơn giản xung quanh thư viện máy khách .Net của Google , nó cho thấy một giao diện giống cơ sở dữ liệu đơn giản hơn, với các loại bản ghi được đánh máy mạnh. Đây là một số mã mẫu:

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);

Ngoài ra còn có một nhà cung cấp LINQ dịch sang các toán tử truy vấn có cấu trúc của google :

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

@Kiquenet Ý bạn là gì? . Phiên bản cuối cùng tôi nhìn thấy của Google.GData * là 2.2.0 nuget.org/packages/Google.GData.Documents
Mauricio Scheffer

developers.google.com/google-apps/spreadsheets phiên bản 3.0 API (OAuth, vv)
Kiquenet

@Kiquenet Hãy cho tôi biết khi Google cập nhật thư viện .NET của họ. Nhưng tôi nghĩ rằng Google.GData. * 2.2.0 đã sử dụng API v3.
Mauricio Scheffer

developers.google.com/google-apps/spreadsheets/authorize Chú ý: OAuth 1.0 không còn được hỗ trợ và sẽ bị tắt vào tháng 5 năm 2015. Nếu sử dụng ứng dụng của bạn OAuth 1.0, bạn phải di chuyển sang OAuth 2.0 hoặc ứng dụng của bạn sẽ chấm dứt hoạt động .
Kiquenet

17

(Tháng 6 đến tháng 11 năm 2016) Câu hỏi và câu trả lời của nó hiện đã lỗi thời vì: 1) API GData là thế hệ trước của Google API. Trong khi không phải tất cả các API GData đã bị phản đối, tất cả các API mới nhất của Google làm không sử dụng các giao thức dữ liệu của Google ; và 2) có API Google Trang tính mới v4 (cũng không phải GData).

Từ đây, bạn cần phải Thư viện ứng dụng khách API của Google cho .NET và sử dụng API Trang tính mới nhất , mạnh mẽ và linh hoạt hơn nhiều so với bất kỳ API nào trước đây. Đây là mẫu mã C # để giúp bạn bắt đầu. Ngoài ra, hãy kiểm tra tài liệu tham chiếu .NET cho API Trang tínhhướng dẫn dành cho nhà phát triển Thư viện ứng dụng API Google API .

Nếu bạn không dị ứng với Python (nếu bạn có, chỉ cần giả vờ đó là mã giả;)), tôi đã tạo một số video với các ví dụ "thực tế" dài hơn một chút về việc sử dụng API mà bạn có thể học và chuyển sang C # nếu muốn :


những công cụ này cũng có thể được sử dụng để truy cập các tệp Microsoft Excel?
afr0

1
Thật không may, cả Microsoft và Google đều đang tạo ra các sản phẩm cạnh tranh không tuân theo tiêu chuẩn chung, vì vậy bạn phải tìm công cụ của riêng mình để truy cập tệp Excel. Nếu bạn là nhà phát triển Python, hãy xem python-excel.org . Đối với các ngôn ngữ khác, bạn sẽ phải tìm kiếm các cộng đồng tương ứng của chúng. Ngoài ra, bạn có thể nhập tệp Excel vào Google (sử dụng API Drive), sau đó sử dụng API Trang tính để thực hiện các thao tác bạn muốn. Các API của Google hỗ trợ nhiều ngôn ngữ khác nhau ... xem developer.google.com/api-client-library
wescpy

3

Bạn có thể làm những gì bạn đang yêu cầu theo một số cách:

  1. Sử dụng thư viện bảng tính C # của Google (như trong câu trả lời của Tacoman667) để tìm nạp ListFeed có thể trả về danh sách các hàng (ListEntry theo cách nói của Google), mỗi hàng có một danh sách các cặp tên-giá trị. Tài liệu API bảng tính của Google ( http://code.google.com/apis/spreadsheets/code.html ) có quá đủ thông tin để giúp bạn bắt đầu.

  2. Sử dụng API trực quan hóa của Google cho phép bạn gửi các truy vấn phức tạp hơn (gần giống như SQL) để chỉ tìm nạp các hàng / cột mà bạn yêu cầu.

  3. Nội dung bảng tính được trả về dưới dạng nguồn cấp dữ liệu Atom để bạn có thể sử dụng phân tích cú pháp XPath hoặc SAX để trích xuất nội dung của nguồn cấp dữ liệu danh sách. Có một ví dụ về việc làm theo cách này (chỉ trong Java và Javascript mặc dù tôi sợ) tại http://gqlx.twyst.co.za .


2

Tôi khá chắc rằng sẽ có một số SDK / bộ công cụ C # trên Google Code cho việc này. Tôi đã tìm thấy cái này , nhưng có thể có cái khác nên rất đáng để bạn duyệt qua.




2

Câu trả lời được ủng hộ nhiều nhất từ ​​@Kelly không còn hợp lệ như @wescpy nói. Tuy nhiên sau 2020-03-03 nó sẽ không hoạt động nữa vì thư viện đã sử dụng các lần sử dụng Google Sheets v3 API.

API Google Trang tính v3 sẽ ngừng hoạt động vào ngày 3 tháng 3 năm 2020

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

Điều này đã được Google công bố ngày 29 tháng 10 năm 2019:

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

Mẫu mã mới cho Google Sheets v4 API :

Đi đến

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

và tạo ra credentials.json. Sau đó cài đặtGoogle.Apis.Sheets.v4 NuGet và thử mẫu sau:

Lưu ý rằng tôi đã gặp lỗi Unable to parse range: Class Data!A2:Evới mã mẫu nhưng với bảng tính của mình. Sheet1!A2:ETuy nhiên, thay đổi để hoạt động vì trang tính của tôi được đặt tên như vậy. Cũng chỉ làm việc với 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();
        }
    }
}

Làm cách nào để tôi không phải chỉ định id / bí mật và phạm vi ứng dụng khách? Tôi đã thực hiện quy trình OAuth và có mã thông báo truy cập và mã làm mới (hãy nghĩ đến chế độ ngoại tuyến) và tôi không muốn bất kỳ thứ gì tào lao bổ sung này. Tôi không có quyền truy cập vào id ứng dụng khách và bí mật ứng dụng khách vì chúng ở trên máy chủ chuyển tiếp oauth mà tôi cũng không có quyền truy cập trong các dịch vụ nền.
Blake Niemyjski

@BlakeNiemyjski Sử dụng API còn lại trực tiếp, liên kết: developers.google.com/sheets/api/reference/rest
Ogglas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.