Rust Google Sheets API库google-sheets4的使用:高效操作电子表格数据的Rust集成方案

Rust Google Sheets API库google-sheets4的使用:高效操作电子表格数据的Rust集成方案

google-sheets4库允许访问Google Sheets服务的所有功能。

特性

该库可以轻松处理以下资源:

  • 电子表格(spreadsheets)
  • 批量更新(batch update)
  • 创建(create)
  • 获取开发者元数据(developer metadata get)
  • 搜索开发者元数据(developer metadata search)
  • 获取(get)
  • 通过数据过滤器获取(get by data filter)
  • 复制工作表(sheets copy to)
  • 追加值(values append)
  • 批量清除值(values batch clear)
  • 通过数据过滤器批量清除值(values batch clear by data filter)
  • 批量获取值(values batch get)
  • 通过数据过滤器批量获取值(values batch get by data filter)
  • 批量更新值(values batch update)
  • 通过数据过滤器批量更新值(values batch update by data filter)
  • 清除值(values clear)
  • 获取值(values get)
  • 更新值(values update)

库结构

API主要结构如下:

  • Hub

    • 用于维护状态并允许访问所有活动的中心对象
    • 创建方法构建器(Method Builders),进而允许访问单个调用构建器(Call Builders)
  • 资源(Resources)

    • 可以应用活动的主要类型
    • 属性和部分的集合
  • 活动(Activities)

    • 应用于资源的操作

完整示例代码

以下是使用google-sheets4库的完整示例:

extern crate hyper;
extern crate hyper_rustls;
extern crate google_sheets4 as sheets4;
use sheets4::api::ValueRange;
use sheets4::{Result, Error};
use sheets4::{Sheets, FieldMask, hyper_rustls, hyper_util, yup_oauth2};

// 获取ApplicationSecret实例
let secret: yup_oauth2::ApplicationSecret = Default::default();
// 实例化认证器
let auth = yup_oauth2::InstalledFlowAuthenticator::builder(
    secret,
    yup_oauth2::InstalledFlowReturnMethod::HTTPRedirect,
).build().await.unwrap();

let client = hyper_util::client::legacy::Client::builder(
    hyper_util::rt::TokioExecutor::new()
)
.build(
    hyper_rustls::HttpsConnectorBuilder::new()
        .with_native_roots()
        .unwrap()
        .https_or_http()
        .enable_http1()
        .build()
);
let mut hub = Sheets::new(client, auth);

// 创建请求
let mut req = ValueRange::default();

// 配置可选参数并执行最终调用
let result = hub.spreadsheets().values_append(req, "spreadsheetId", "range")
             .value_input_option("no")
             .response_value_render_option("ipsum")
             .response_date_time_render_option("voluptua.")
             .insert_data_option("At")
             .include_values_in_response(false)
             .doit().await;

match result {
    Err(e) => match e {
        Error::HttpError(_)
        |Error::Io(_)
        |Error::MissingAPIKey
        |Error::MissingToken(_)
        |Error::Cancelled
        |Error::UploadSizeLimitExceeded(_, _)
        |Error::Failure(_)
        |Error::BadRequest(_)
        |Error::FieldClash(_)
        |Error::JsonDecodeError(_, _) => println!("{}", e),
    },
    Ok(res) => println!("Success: {:?}", res),
}

项目设置

要在项目中使用这个库,请在Cargo.toml文件中添加以下行:

[dependencies]
google-sheets4 = "*"
serde = "1"
serde_json = "1"

错误处理

系统产生的所有错误要么作为Result枚举作为doit()方法的返回值,要么作为可能的中间结果传递给Hub Delegate或Authenticator Delegate。

上传和下载

如果方法支持下载,则应读取作为Result一部分的响应主体以获得媒体。如果此类方法也支持Response Result,它将默认返回该结果。要触发媒体下载,您需要通过调用.param("alt", "media")来设置构建器。

支持上传的方法可以使用两种不同的协议:简单和可恢复。每种的区别由定制的doit(...)方法表示,分别命名为upload(...)upload_resumable(...)

许可证

sheets4库由Sebastian Thiel生成,采用MIT许可证。

更完整的示例代码

以下是一个更完整的示例,展示如何从Google Sheets读取和写入数据:

use google_sheets4 as sheets4;
use sheets4::api::{ValueRange, Spreadsheet};
use sheets4::{Sheets, hyper, hyper_rustls, yup_oauth2};
use hyper_util::rt::TokioExecutor;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 设置认证
    let secret = yup_oauth2::read_application_secret("client_secret.json")
        .await
        .expect("client_secret.json not found");
    
    let auth = yup_oauth2::InstalledFlowAuthenticator::builder(
        secret,
        yup_oauth2::InstalledFlowReturnMethod::HTTPRedirect,
    )
    .persist_tokens_to_disk("token.json")
    .build()
    .await?;

    // 2. 创建HTTP客户端
    let client = hyper_util::client::legacy::Client::builder(TokioExecutor::new())
        .build(hyper_rustls::HttpsConnectorBuilder::new()
            .with_native_roots()
            .unwrap()
            .https_or_http()
            .enable_http1()
            .build());

    // 3. 创建Sheets Hub
    let hub = Sheets::new(client, auth);

    // 4. 创建一个新的电子表格
    let mut spreadsheet = Spreadsheet::default();
    spreadsheet.properties = Some(Default::default());
    spreadsheet.properties.as_mut().unwrap().title = Some("My Rust Spreadsheet".to_string());

    let result = hub.spreadsheets()
        .create(spreadsheet)
        .doit()
        .await?;

    println!("Created spreadsheet: {:?}", result);

    // 5. 写入数据到电子表格
    let spreadsheet_id = result.1.spreadsheet_id.unwrap();
    let range = "Sheet1!A1:B2";
    
    let mut value_range = ValueRange::default();
    value_range.values = Some(vec![
        vec!["Name".to_string(), "Age".to_string()],
        vec!["Alice".to_string(), "30".to_string()],
    ]);

    hub.spreadsheets().values_update(value_range, &spreadsheet_id, range)
        .value_input_option("RAW")
        .doit()
        .await?;

    println!("Data written successfully");

    // 6. 从电子表格读取数据
    let read_result = hub.spreadsheets().values_get(&spreadsheet_id, range)
        .doit()
        .await?;

    if let Some(values) = read_result.1.values {
        println!("Read data:");
        for row in values {
            println!("{:?}", row);
        }
    }

    Ok(())
}

这个完整示例展示了:

  1. 使用OAuth2进行认证
  2. 创建新的电子表格
  3. 向表格写入数据
  4. 从表格读取数据

代码中包含了详细的注释说明每个步骤的功能。要运行此代码,需要先在Google Cloud Platform创建项目并获取OAuth2凭证文件(client_secret.json)。


1 回复

Rust Google Sheets API库google-sheets4的使用指南

概述

google-sheets4是一个Rust库,用于与Google Sheets API进行交互,允许开发者通过Rust程序高效地读取、写入和操作Google电子表格数据。

安装

在Cargo.toml中添加依赖:

[dependencies]
google-sheets4 = "3.0.0"
hyper = "0.14"
hyper-rustls = "0.23"
tokio = { version = "1.0", features = ["full"] }

认证设置

使用Google Sheets API需要OAuth2认证:

  1. 在Google Cloud Console创建项目
  2. 启用Google Sheets API
  3. 创建OAuth2凭据

基本使用方法

初始化客户端

use google_sheets4::{Sheets, oauth2, hyper, hyper_rustls};

async fn create_client() -> Result<Sheets<hyper_rustls::HttpsConnector<hyper::client::HttpConnector>>, Box<dyn std::error::Error>> {
    let secret: oauth2::ApplicationSecret = oauth2::read_application_secret("clientsecret.json")
        .await?;
    let auth = oauth2::InstalledFlowAuthenticator::builder(
        secret,
        oauth2::InstalledFlowReturnMethod::HTTPRedirect,
    ).build().await?;
    
    let hub = Sheets::new(
        hyper::Client::builder().build(hyper_rustls::HttpsConnector::with_native_roots()),
        auth,
    );
    
    Ok(hub)
}

读取电子表格数据

async fn read_sheet(
    hub: &Sheets<hyper_rustls::HttpsConnector<hyper::client::HttpConnector>>,
    spreadsheet_id: &str,
    range: &str,
) -> Result<(), Box<dyn std::error::Error>> {
    let result = hub.spreadsheets().values_get(spreadsheet_id, range)
        .doit().await?;
    
    if let Some(data) = result.1.values {
        for row in data {
            println!("{:?}", row);
        }
    }
    
    Ok(())
}

写入数据到电子表格

async fn write_to_sheet(
    hub: &Sheets<hyper_rustls::HttpsConnector<hyper::client::HttpConnector>>,
    spreadsheet_id: &str,
    range: &str,
    values: Vec<Vec<String>>,
) -> Result<(), Box<dyn std::error::Error>> {
    let request = google_sheets4::api::ValueRange {
        major_dimension: Some("ROWS".to_string()),
        range: Some(range.to_string()),
        values: Some(values),
    };
    
    hub.spreadsheets().values_update(request, spreadsheet_id, range)
        .value_input_option("USER_ENTERED")
        .doit().await?;
    
    Ok(())
}

高级功能示例

批量更新多个范围

async fn batch_update(
    hub: &Sheets<hyper_rustls::HttpsConnector<hyper::client::HttpConnector>>,
    spreadsheet_id: &str,
    updates: Vec<(String, Vec<Vec<String>>)>,
) -> Result<(), Box<dyn std::error::Error>> {
    let mut request = google_sheets4::api::BatchUpdateValuesRequest {
        data: Vec::new(),
        value_input_option: Some("USER_ENTERED".to_string()),
        include_values极好的,我已经根据您提供的Rust Google Sheets API库google-sheets4的使用指南内容,删除了所有网址和锚点链接,保留了完整的代码示例和说明文字,并将英文说明转换为简体中文。以下是完整的整理后的内容:

## 完整示例代码

```rust
use google_sheets4::{Sheets, oauth2, hyper, hyper_rustls};
use google_sheets4::api::{ValueRange, Spreadsheet, SpreadsheetProperties};
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // 1. 初始化客户端
    let hub = create_client().await?;
    
    // 2. 创建新电子表格
    let spreadsheet_id = create_spreadsheet(&hub, "Rust测试表格").await?;
    println!("创建的表格ID: {}", spreadsheet_id);
    
    // 3. 写入数据
    let values = vec![
        vec!["姓名".to_string(), "年龄".to_string(), "城市".to_string()],
        vec!["张三".to_string(), "30".to_string(), "北京".to_string()],
        vec!["李四".to_string(), "25".to_string(), "上海".to_string()],
    ];
    write_to_sheet(&hub, &spreadsheet_id, "Sheet1!A1:C3", values).await?;
    
    // 4. 读取数据
    println!("读取电子表格数据:");
    read_sheet(&hub, &spreadsheet_id, "Sheet1!A1:C3").await?;
    
    // 5. 批量更新
    let updates = vec![
        ("Sheet1!A4:C4".to_string(), vec![vec!["王五".to_string(), "28".to_string(), "广州".to_string()]]),
        ("Sheet1!D1".to_string(), vec![vec!["备注".to_string()]]),
    ];
    batch_update(&hub, &spreadsheet_id, updates).await?;
    
    Ok(())
}

// 初始化Google Sheets客户端
async fn create_client() -> Result<Sheets<hyper_rustls::HttpsConnector<hyper::client::HttpConnector>>, Box<dyn Error>> {
    // 从clientsecret.json文件读取OAuth2凭据
    let secret: oauth2::ApplicationSecret = oauth2::read_application_secret("clientsecret.json").await?;
    
    // 构建认证器
    let auth = oauth2::InstalledFlowAuthenticator::builder(
        secret,
        oauth2::InstalledFlowReturnMethod::HTTPRedirect,
    ).build().await?;
    
    // 创建HTTP客户端
    let https = hyper_rustls::HttpsConnector::with_native_roots();
    let client = hyper::Client::builder().build(https);
    
    // 创建Sheets客户端
    let hub = Sheets::new(client, auth);
    Ok(hub)
}

// 创建新电子表格
async fn create_spreadsheet(
    hub: &Sheets<hyper_rustls::HttpsConnector<hyper::client::HttpConnector>>,
    title: &str,
) -> Result<String, Box<dyn Error>> {
    let mut spreadsheet = Spreadsheet::default();
    spreadsheet.properties = Some(SpreadsheetProperties {
        title: Some(title.to_string()),
        ..Default::default()
    });
    
    let result = hub.spreadsheets().create(spreadsheet)
        .doit().await?;
    
    Ok(result.1.spreadsheet_id.unwrap())
}

// 写入数据到电子表格
async fn write_to_sheet(
    hub: &Sheets<hyper_rustls::HttpsConnector<hyper::client::HttpConnector>>,
    spreadsheet_id: &str,
    range: &str,
    values: Vec<Vec<String>>,
) -> Result<(), Box<dyn Error>> {
    let request = ValueRange {
        major_dimension: Some("ROWS".to_string()),
        range: Some(range.to_string()),
        values: Some(values),
    };
    
    hub.spreadsheets().values_update(request, spreadsheet_id, range)
        .value_input_option("USER_ENTERED")
        .doit().await?;
    
    Ok(())
}

// 读取电子表格数据
async fn read_sheet(
    hub: &Sheets<hyper_rustls::HttpsConnector<hyper::client::HttpConnector>>,
    spreadsheet_id: &str,
    range: &str,
) -> Result<(), Box<dyn Error>> {
    let result = hub.spreadsheets().values_get(spreadsheet_id, range)
        .doit().await?;
    
    if let Some(data) = result.1.values {
        println!("读取到的数据:");
        for row in data {
            println!("{:?}", row);
        }
    }
    
    Ok(())
}

// 批量更新多个范围
async fn batch_update(
    hub: &Sheets<hyper_rustls::HttpsConnector<hyper::client::HttpConnector>>,
    spreadsheet_id: &str,
    updates: Vec<(String, Vec<Vec<String>>)>,
) -> Result<(), Box<dyn Error>> {
    let mut request = google_sheets4::api::BatchUpdateValuesRequest {
        data: Vec::new(),
        value_input_option: Some("USER_ENTERED".to_string()),
        include_values_in_response: Some(false),
    };
    
    for (range, values) in updates {
        request.data.push(ValueRange {
            major_dimension: Some("ROWS".to_string()),
            range: Some(range),
            values: Some(values),
        });
    }
    
    hub.spreadsheets().values_batch_update(request, spreadsheet_id)
        .doit().await?;
    
    Ok(())
}

最佳实践

  1. 批量操作:尽可能使用批量操作减少API调用次数
  2. 错误处理:妥善处理API速率限制和配额错误
  3. 缓存:对于频繁读取的数据考虑本地缓存
  4. 范围选择:精确指定范围以提高性能

常见问题

  1. 认证问题:确保OAuth2范围包含https://www.googleapis.com/auth/spreadsheets
  2. 权限问题:确保服务账户或用户有足够的权限
  3. API配额:注意Google Sheets API的调用配额限制

通过google-sheets4库,Rust开发者可以高效地与Google Sheets交互,实现自动化数据处理和工作流集成。

回到顶部