golang访问google sheet 写接口

news/2025/2/21 17:44:56/

如何访问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
}

http://www.ppmy.cn/news/1573945.html

相关文章

Golang通过 并发计算平方 示例演示并发

示例 以下代码演示了如何使用 Goroutines 并发计算一组数字的平方,并通过通道收集结果。 package mainimport ("fmt""time" )// worker 函数,用于计算一个数字的平方,并将结果发送到通道 func worker(id int, numbers …

如何利用AI制作PPT,轻松实现高效演示

如何利用AI制作PPT,轻松实现高效演示!在这个信息爆炸的时代,PPT已经成为了日常工作和学习中不可或缺的工具。每当我们需要汇报、展示或总结时,PPT几乎成了“必杀技”。然而制作一份精彩的PPT往往需要花费大量的时间和精力。随着人…

网络安全专业好就业吗?

网络安全是一个涉及领域非常广泛的行业,几乎涵盖了所有行业。无论是金融、医疗、互联网,还是教育、政府机构等,都需要网络安全人才来保障其安全运行,因此也得到了个人及企业的高度重视。那么网络安全专业好就业吗?我们一起来看看…

Linux发展史:从个人项目到开源帝国的技术演进

一、起源与诞生(1960s-1991) UNIX的奠基 Linux的基因可追溯至1969年贝尔实验室的Ken Thompson与Dennis Ritchie。为运行《星际旅行》游戏,Thompson用BCPL语言开发了UNIX原型,后由Ritchie以C语言重构,成为首个可移植操作…

调用DeepSeek API接口:实现智能数据挖掘与分析

调用DeepSeek API接口:实现智能数据挖掘与分析 在当今数据驱动的时代,企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台,提供了强大的API接口,帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用D…

网站改了域名,如何查找?

一个你常访问的网站突然改了域名,你却不知道新地址是什么?域名一旦更换,很多用户可能会感到迷茫。不过,别担心,查找更改后的域名其实有一些简单的方法,今天就来聊聊如何找到那些失踪的网站。 最直接的方法…

使用 Spark NLP 实现中文实体抽取与关系提取

在自然语言处理(NLP)领域,实体抽取和关系提取是两个重要的任务。实体抽取用于从文本中识别出具有特定意义的实体(如人名、地名、组织名等),而关系提取则用于识别实体之间的关系。本文将通过一个基于 Apache Spark 和 Spark NLP 的示例,展示如何实现中文文本的实体抽取和…

软考高级《系统架构设计师》知识点(七)

系统配置与性能评价 性能指标 性能指标:是软、硬件、的性能指标的集成。在硬件中,包括计算机、各种通信交换设备、各类网络设备等;在软件中,包括:操作系统、协议以及应用程序等。 对计算机评价的主要性能指标有&#x…