1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
use serde::Deserialize;

use crate::{
    core::{
        api_req::ApiRequest,
        api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
        constants::AccessTokenType,
        req_option, SDKResult,
    },
    service::sheets::v2::{data_operation::ValueRangeResponse, SpreadsheetService},
};

/// 读取单个范围请求
#[derive(Debug, Default)]
pub struct ReadingSingleRangeRequest {
    api_request: ApiRequest,
    /// spreadsheet 的 token
    spreadsheet_token: String,
    /// 查询范围,包含 sheetId 与单元格范围两部分,详见在线表格开发指南。若查询范围中使用形如
    /// <sheetId>!<开始单元格>:<结束列>的范围时,仅支持获取100列数据
    range: String,
    /// 指定单元格数据的格式。可选值为如下所示。当参数缺省时,默认不进行公式计算,返回公式本身;
    /// 数值不进行数字格式化。
    ///
    /// - valueRenderOption=ToString:返回纯文本的值(数值类型除外)
    /// - valueRenderOption=FormattedValue:计算并格式化单元格
    /// - valueRenderOption=Formula:单元格中含有公式时,返回公式本身
    /// - valueRenderOption=UnformattedValue:计算但不对单元格进行格式化
    value_render_option: Option<String>,
    /// 指定数据类型为日期、时间、或时间日期的单元格数据的格式。
    ///
    /// - 当参数缺省时,默认返回浮点数值,整数部分为自 1899 年 12 月 30
    ///   日以来的天数;小数部分为该时间占 24 小时的份额。例如:若时间为 1900 年 1 月 1 日中午 12
    ///   点,则默认返回 2.5。其中,2 表示 1900 年 1 月 1 日为 1899 年12 月 30 日之后的 2 天;0.5
    ///   表示 12 点占 24 小时的二分之一,即 12/24=0.5。
    /// - dateTimeRenderOption=FormattedString:计算并对时间、日期类型数据进行格式化,
    ///   但不会对数字进行格式化。将返回格式化后的字符串。详见电子表格常见问题
    date_time_render_option: Option<String>,
    /// 当单元格中包含@用户等涉及用户信息的元素时,该参数可指定返回的用户 ID 类型。默认为
    /// lark_id,建议选择 open_id 或 union_id。了解更多,参考用户身份概述。
    ///
    /// - open_id:用户在应用内的身份。 同一个 user_id 在不同应用中的 open_id 不同,其值统一以 ou_
    ///   为前缀,如ou_c99c5f35d542efc7ee492afe11af19ef。
    /// - union_id:用户在同一应用服务商提供的多个应用间的统一身份。
    user_id_type: Option<String>,
}

impl ReadingSingleRangeRequest {
    pub fn builder() -> ReadingSingleRangeRequestBuilder {
        ReadingSingleRangeRequestBuilder::default()
    }
}

#[derive(Default)]
pub struct ReadingSingleRangeRequestBuilder {
    request: ReadingSingleRangeRequest,
}

impl ReadingSingleRangeRequestBuilder {
    pub fn spreadsheet_token(mut self, spreadsheet_token: impl ToString) -> Self {
        self.request.spreadsheet_token = spreadsheet_token.to_string();
        self
    }

    /// 查询范围,包含 sheetId 与单元格范围两部分,详见在线表格开发指南。若查询范围中使用形如
    /// <sheetId>!<开始单元格>:<结束列>的范围时,仅支持获取100列数据
    pub fn range(mut self, range: impl ToString) -> Self {
        self.request.range = range.to_string();
        self
    }

    /// 指定单元格数据的格式。可选值为如下所示。当参数缺省时,默认不进行公式计算,返回公式本身;
    /// 数值不进行数字格式化。
    ///
    /// - valueRenderOption=ToString:返回纯文本的值(数值类型除外)
    /// - valueRenderOption=FormattedValue:计算并格式化单元格
    /// - valueRenderOption=Formula:单元格中含有公式时,返回公式本身
    /// - valueRenderOption=UnformattedValue:计算但不对单元格进行格式化
    pub fn value_render_option(mut self, value_render_option: impl ToString) -> Self {
        self.request.value_render_option = Some(value_render_option.to_string());
        self.request.api_request.query_params.insert(
            "valueRenderOption".to_string(),
            value_render_option.to_string(),
        );
        self
    }

    /// 指定数据类型为日期、时间、或时间日期的单元格数据的格式。
    ///
    /// - 当参数缺省时,默认返回浮点数值,整数部分为自 1899 年 12 月 30
    ///   日以来的天数;小数部分为该时间占 24 小时的份额。例如:若时间为 1900 年 1 月 1 日中午 12
    ///   点,则默认返回 2.5。其中,2 表示 1900 年 1 月 1 日为 1899 年12 月 30 日之后的 2 天;0.5
    ///   表示 12 点占 24 小时的二分之一,即 12/24=0.5。
    /// - dateTimeRenderOption=FormattedString:计算并对时间、日期类型数据进行格式化,
    ///   但不会对数字进行格式化。将返回格式化后的字符串。详见电子表格常见问题
    pub fn date_time_render_option(mut self, date_time_render_option: impl ToString) -> Self {
        self.request.date_time_render_option = Some(date_time_render_option.to_string());
        self.request.api_request.query_params.insert(
            "dateTimeRenderOption".to_string(),
            date_time_render_option.to_string(),
        );
        self
    }

    /// 当单元格中包含@用户等涉及用户信息的元素时,该参数可指定返回的用户 ID 类型。默认为
    /// lark_id,建议选择 open_id 或 union_id。了解更多,参考用户身份概述。
    ///
    /// - open_id:用户在应用内的身份。 同一个 user_id 在不同应用中的 open_id 不同,其值统一以 ou_
    ///   为前缀,如ou_c99c5f35d542efc7ee492afe11af19ef。
    /// - union_id:用户在同一应用服务商提供的多个应用间的统一身份。
    pub fn user_id_type(mut self, user_id_type: impl ToString) -> Self {
        self.request.user_id_type = Some(user_id_type.to_string());
        self.request
            .api_request
            .query_params
            .insert("user_id_type".to_string(), user_id_type.to_string());
        self
    }

    pub fn build(self) -> ReadingSingleRangeRequest {
        self.request
    }
}

/// 读取数据响应体
#[derive(Deserialize, Debug)]
#[allow(dead_code)]
pub struct ReadingSingleRangeResponse {
    /// sheet 的版本号
    pub revision: i32,
    /// spreadsheet 的 token,详见电子表格概述
    #[serde(rename = "spreadsheetToken")]
    pub spreadsheet_token: String,
    /// 值与范围
    #[serde(rename = "valueRange")]
    pub value_range: ValueRangeResponse,
}

impl ApiResponseTrait for ReadingSingleRangeResponse {
    fn data_format() -> ResponseFormat {
        ResponseFormat::Data
    }
}

impl SpreadsheetService {
    /// 读取单个范围
    pub async fn reading_a_single_range(
        &self,
        request: ReadingSingleRangeRequest,
        option: Option<req_option::RequestOption>,
    ) -> SDKResult<BaseResponse<ReadingSingleRangeResponse>> {
        let mut api_req = request.api_request;
        api_req.api_path = format!(
            "/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values/{range}",
            spreadsheet_token = request.spreadsheet_token,
            range = request.range,
        );
        api_req.http_method = reqwest::Method::GET;
        api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::App];

        let api_resp = crate::core::http::Transport::request(api_req, &self.config, option).await?;

        Ok(api_resp)
    }
}