You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Sheets API读取至WinForms报错:无法识别凭据类型

解决方案:修复Google Sheets API认证错误 "Unrecognized credential type"

错误原因

你遇到的问题核心是使用了错误类型的JSON密钥文件或错误的加载方式:

  • 若下载的是OAuth 2.0客户端密钥(桌面应用类型,JSON含"installed"字段),直接用GoogleCredential.FromStream()加载会失败——这个方法仅支持服务账号密钥或已授权的用户凭据(带刷新令牌的JSON)。
  • 若下载的是服务账号密钥但JSON格式损坏/缺失关键字段,也会触发该错误。

方案1:使用服务账号认证(无需用户登录)

适合无需用户手动登录,直接访问共享给服务账号的表格场景:

步骤1:获取正确的服务账号密钥

  1. 回到Google Cloud Console,进入项目 → IAM与管理 → 服务账号
  2. 创建/选择服务账号,点击密钥 → 添加密钥 → 创建新密钥
  3. 选择JSON格式下载,该文件会包含"type": "service_account"字段,这是FromStream能识别的凭据类型。

步骤2:共享表格给服务账号

打开目标Google Sheets,点击共享,输入服务账号JSON里的client_email值,赋予查看者权限。

步骤3:WinForms代码示例

using Google.Apis.Auth.OAuth2;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using Google.Apis.Services;
using System.IO;
using System.Windows.Forms;

namespace GoogleSheetsWinForms
{
    public partial class MainForm : Form
    {
        private static readonly string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly };
        private const string SpreadsheetId = "你的表格ID"; // 从表格URL提取:https://docs.google.com/spreadsheets/d/[表格ID]/edit
        private const string Range = "表单响应1!A1:Z"; // 要读取的单元格范围

        public MainForm()
        {
            InitializeComponent();
        }

        private void btnLoadData_Click(object sender, EventArgs e)
        {
            try
            {
                using (var stream = new FileStream("service-account-key.json", FileMode.Open, FileAccess.Read))
                {
                    // 初始化服务账号凭据与Sheets服务
                    var credential = GoogleCredential.FromStream(stream).CreateScoped(Scopes);
                    var service = new SheetsService(new BaseClientService.Initializer()
                    {
                        HttpClientInitializer = credential,
                        ApplicationName = "WinForms Sheets Reader"
                    });

                    // 调用API读取数据
                    var request = service.Spreadsheets.Values.Get(SpreadsheetId, Range);
                    var response = request.Execute();
                    var values = response.Values;

                    // 将数据展示到DataGridView
                    if (values != null && values.Count > 0)
                    {
                        dataGridView1.Rows.Clear();
                        dataGridView1.Columns.Clear();

                        // 添加表头
                        foreach (var header in values[0])
                        {
                            dataGridView1.Columns.Add(header.ToString(), header.ToString());
                        }

                        // 添加行数据
                        for (int i = 1; i < values.Count; i++)
                        {
                            dataGridView1.Rows.Add(values[i].ToArray());
                        }
                    }
                    else
                    {
                        MessageBox.Show("未找到数据");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"加载失败:{ex.Message}");
            }
        }
    }
}

方案2:使用OAuth 2.0认证(用户登录)

适合需要用户用自己的Google账号登录,访问个人Drive中表格的场景:

步骤1:确认OAuth客户端密钥

确保你下载的是OAuth 2.0客户端ID(桌面应用类型),JSON文件包含"installed"字段。

步骤2:WinForms代码示例

注意:WinForms中需用异步方法避免UI线程死锁:

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.IO;
using System.Windows.Forms;
using System.Threading;

namespace GoogleSheetsWinForms
{
    public partial class MainForm : Form
    {
        private static readonly string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly };
        private const string SpreadsheetId = "你的表格ID";
        private const string Range = "表单响应1!A1:Z";
        private const string ClientSecretJson = "client_secret.json"; // OAuth客户端密钥文件名

        public MainForm()
        {
            InitializeComponent();
        }

        private async void btnLoadData_Click(object sender, EventArgs e)
        {
            try
            {
                UserCredential credential;

                // 启动OAuth登录流程
                using (var stream = new FileStream(ClientSecretJson, FileMode.Open, FileAccess.Read))
                {
                    string credPath = Path.Combine(Application.UserAppDataPath, "sheets.googleapis.com-winforms.json");
                    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                        GoogleClientSecrets.FromStream(stream).Secrets,
                        Scopes,
                        "user",
                        CancellationToken.None,
                        new FileDataStore(credPath, true));
                }

                // 初始化Sheets服务
                var service = new SheetsService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "WinForms Sheets Reader"
                });

                // 读取并展示数据
                var request = service.Spreadsheets.Values.Get(SpreadsheetId, Range);
                var response = await request.ExecuteAsync();
                var values = response.Values;

                if (values != null && values.Count > 0)
                {
                    dataGridView1.Rows.Clear();
                    dataGridView1.Columns.Clear();

                    foreach (var header in values[0])
                    {
                        dataGridView1.Columns.Add(header.ToString(), header.ToString());
                    }

                    for (int i = 1; i < values.Count; i++)
                    {
                        dataGridView1.Rows.Add(values[i].ToArray());
                    }
                }
                else
                {
                    MessageBox.Show("未找到数据");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"加载失败:{ex.Message}");
            }
        }
    }
}

关键排查点

  1. JSON文件类型匹配:
    • 服务账号密钥:含"type": "service_account",用GoogleCredential.FromStream加载。
    • OAuth客户端密钥:含"installed",用GoogleWebAuthorizationBroker.AuthorizeAsync加载。
  2. 文件路径正确性:确保代码中引用的JSON文件路径正确,避免文件找不到或权限问题。
  3. 权限范围设置:根据需求选择SpreadsheetsReadonly(只读)或Spreadsheets(读写)权限。

内容的提问来源于stack exchange,提问作者mifus arakiev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 04:45:06