-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcopy_and_paste_by_range.go
93 lines (82 loc) · 3.01 KB
/
copy_and_paste_by_range.go
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
/*
复制粘贴某个范围的单元格数据,使用到两个OpenAPI:
1. [读取单个范围](https://open.feishu.cn/document/server-docs/docs/sheets-v3/data-operation/reading-a-single-range)
2. [向单个范围写入数据](https://open.feishu.cn/document/server-docs/docs/sheets-v3/data-operation/write-data-to-a-single-range)
*/
package sheets
import (
"context"
"encoding/json"
"fmt"
"net/http"
lark "github.com/larksuite/oapi-sdk-go/v3"
larkcore "github.com/larksuite/oapi-sdk-go/v3/core"
)
type CopyAndPasteByRangeRequest struct {
SpreadsheetToken string
SrcRange string
DstRange string
}
type CopyAndPasteRangeResponse struct {
*larkcore.CodeError
ReadResponse *SpreadsheetRespData
WriteResponse *SpreadsheetRespData
}
// CopyAndPasteRange 复制粘贴某个范围的单元格数据
func CopyAndPasteRange(client *lark.Client, request *CopyAndPasteByRangeRequest) (*CopyAndPasteRangeResponse, error) {
// 读取单个范围
readResp, err := client.Do(context.Background(), &larkcore.ApiReq{
HttpMethod: http.MethodGet,
ApiPath: fmt.Sprintf("/open-apis/sheets/v2/spreadsheets/%s/values/%s", request.SpreadsheetToken, request.SrcRange),
SupportedAccessTokenTypes: []larkcore.AccessTokenType{larkcore.AccessTokenTypeTenant},
})
if err != nil {
return nil, err
}
readSpreadsheetResp := &SpreadsheetResp{}
err = json.Unmarshal(readResp.RawBody, readSpreadsheetResp)
if err != nil {
return nil, err
}
readSpreadsheetResp.ApiResp = readResp
if readSpreadsheetResp.Code != 0 {
fmt.Printf("read spreadsheet failed, code: %d, msg: %s, log_id: %s\n",
readSpreadsheetResp.Code, readSpreadsheetResp.Msg, readSpreadsheetResp.RequestId())
return nil, readSpreadsheetResp.CodeError
}
// 向单个范围写入数据
valueRange := map[string]interface{}{}
valueRange["range"] = request.DstRange
valueRange["values"] = readSpreadsheetResp.Data.ValueRange.Values
body := map[string]interface{}{}
body["valueRange"] = valueRange
writeResp, err := client.Do(context.Background(), &larkcore.ApiReq{
HttpMethod: http.MethodPut,
ApiPath: fmt.Sprintf("/open-apis/sheets/v2/spreadsheets/%s/values", request.SpreadsheetToken),
Body: body,
SupportedAccessTokenTypes: []larkcore.AccessTokenType{larkcore.AccessTokenTypeTenant},
})
if err != nil {
return nil, err
}
writeSpreadsheetResp := &SpreadsheetResp{}
err = json.Unmarshal(writeResp.RawBody, writeSpreadsheetResp)
if err != nil {
return nil, err
}
writeSpreadsheetResp.ApiResp = writeResp
if writeSpreadsheetResp.Code != 0 {
fmt.Printf("write spreadsheet failed, code: %d, msg: %s, log_id: %s\n",
writeSpreadsheetResp.Code, writeSpreadsheetResp.Msg, writeSpreadsheetResp.RequestId())
return nil, writeSpreadsheetResp.CodeError
}
// 返回结果
return &CopyAndPasteRangeResponse{
CodeError: &larkcore.CodeError{
Code: 0,
Msg: "success",
},
ReadResponse: readSpreadsheetResp.Data,
WriteResponse: writeSpreadsheetResp.Data,
}, nil
}