如何访问google sheet、读接口详见
Golang访问Google Sheet
import ("bytes""context""fmt""golang.org/x/oauth2/google""google.golang.org/api/option""google.golang.org/api/sheets/v4""runtime/debug"
)type UpdateGoogleSheetByRangeReq struct {Credentials []byteSpreadsheetId stringSheetName stringExcelItemList interface{}
}func UpdateGoogleSheetByRangeSrv(ctx context.Context, req *UpdateGoogleSheetByRangeReq) (wfmErr *wfmerror.WFMError) {defer func() {if p := recover(); p != nil {logger.LogErrorf("UpdateGoogleSheetByRangeReq panic=%v, stack=%v", p, string(debug.Stack()))wfmErr = constant.ErrCommonSystemUnknownErr.NewMessage(fmt.Sprintf("panic=%v", p))}}()// 解析密钥文件config, err := google.JWTConfigFromJSON(req.Credentials, sheets.SpreadsheetsScope)if err != nil {return constant.ErrCommonSystemUnknownErr.NewMessage(err.Error())}// 创建 Google Sheets 服务客户端client := config.Client(ctx)// 创建 Sheets 服务对象sheetsService, err := sheets.NewService(ctx, option.WithHTTPClient(client))if err != nil {return constant.ErrCommonSystemUnknownErr.NewMessage(err.Error())}data, rErr := readXLSX(req.ExcelItemList)if rErr != nil {return rErr.Mark()}exists, sErr := sheetExists(sheetsService, req.SpreadsheetId, req.SheetName)if sErr != nil {return sErr.Mark()}//不存在就创建,存在清除if exists {if cErr := clearSheet(sheetsService, req.SpreadsheetId, req.SheetName); cErr != nil {return cErr.Mark()}} else {if cErr := createSheet(sheetsService, req.SpreadsheetId, req.SheetName); cErr != nil {return cErr.Mark()}}// 使用 Sheets 服务对象进行操作readRange := fmt.Sprintf("%s!A1", req.SheetName)// 通过 Sheets 服务对象获取指定的工作表_, err = sheetsService.Spreadsheets.Values.Update(req.SpreadsheetId, readRange, &sheets.ValueRange{Values: data,}).ValueInputOption("RAW").Do()if err != nil {return constant.ErrCommonSystemUnknownErr.NewMessage(err.Error())}return nil
}func readXLSX(ExcelItem interface{}) ([][]interface{}, *wfmerror.WFMError) {sheetName := "sheet1"//将ExcelItem转换为xlsx []bytefileData, _, gErr := excel.GenerateExcelBytes("excel.xlsx", []*dto.ExcelSheetTab{{SheetName: sheetName,Data: ExcelItem,},})if gErr != nil {return nil, gErr.Mark()}f, err := excelize.OpenReader(bytes.NewReader(fileData))if err != nil {return nil, constant.ErrCommonSystemUnknownErr.NewMessage(err.Error())}rows, err := f.GetRows(sheetName) // 选择要读取的工作表if err != nil {return nil, constant.ErrCommonSystemUnknownErr.NewMessage(err.Error())}data := make([][]interface{}, len(rows))for i, row := range rows {data[i] = make([]interface{}, len(row))for j, cell := range row {data[i][j] = cell}}return data, nil
}func sheetExists(srv *sheets.Service, spreadsheetId, sheetName string) (bool, *wfmerror.WFMError) {// 获取电子表格的结构spreadsheet, err := srv.Spreadsheets.Get(spreadsheetId).Do()if err != nil {return false, constant.ErrCommonSystemUnknownErr.NewMessage(err.Error())}// 检查工作表是否存在for _, sheet := range spreadsheet.Sheets {if sheet.Properties.Title == sheetName {return true, nil}}return false, nil
}func createSheet(srv *sheets.Service, spreadsheetId, sheetName string) *wfmerror.WFMError {// 创建新的工作表requests := []*sheets.Request{{AddSheet: &sheets.AddSheetRequest{Properties: &sheets.SheetProperties{Title: sheetName,},},},}batchUpdateRequest := &sheets.BatchUpdateSpreadsheetRequest{Requests: requests,}_, err := srv.Spreadsheets.BatchUpdate(spreadsheetId, batchUpdateRequest).Do()if err != nil {return constant.ErrCommonSystemUnknownErr.NewMessage(err.Error())}return nil
}func clearSheet(srv *sheets.Service, spreadsheetId, sheetName string) *wfmerror.WFMError {// 清空整个工作表的范围rangeToClear := fmt.Sprintf("%s!A:Z", sheetName) // 假设工作表的范围是 A 到 Z 列// 创建清空请求clearValuesRequest := &sheets.ClearValuesRequest{}_, err := srv.Spreadsheets.Values.Clear(spreadsheetId, rangeToClear, clearValuesRequest).Do()if err != nil {return constant.ErrCommonSystemUnknownErr.NewMessage(err.Error())}return nil
}