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(())
}
这个完整示例展示了:
- 使用OAuth2进行认证
- 创建新的电子表格
- 向表格写入数据
- 从表格读取数据
代码中包含了详细的注释说明每个步骤的功能。要运行此代码,需要先在Google Cloud Platform创建项目并获取OAuth2凭证文件(client_secret.json)。
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认证:
- 在Google Cloud Console创建项目
- 启用Google Sheets API
- 创建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(())
}
最佳实践
- 批量操作:尽可能使用批量操作减少API调用次数
- 错误处理:妥善处理API速率限制和配额错误
- 缓存:对于频繁读取的数据考虑本地缓存
- 范围选择:精确指定范围以提高性能
常见问题
- 认证问题:确保OAuth2范围包含
https://www.googleapis.com/auth/spreadsheets
- 权限问题:确保服务账户或用户有足够的权限
- API配额:注意Google Sheets API的调用配额限制
通过google-sheets4库,Rust开发者可以高效地与Google Sheets交互,实现自动化数据处理和工作流集成。